gpt4 book ai didi

ios - Swift 中的自定义 Segue

转载 作者:IT王子 更新时间:2023-10-29 05:18:19 24 4
gpt4 key购买 nike

@objc(SEPushNoAnimationSegue)
class SEPushNoAnimationSegue: UIStoryboardSegue {
override func perform () {
self.sourceViewController.navigationController.pushViewController(self.destinationViewController, animated:false)
}
}

在上面的代码中,我有两个问题:1).它有一个编译错误:'UINavigationController!'没有名为“pushViewController”的成员

但是在那个类中,它确实有一个 pushViewController 方法。

2).我必须添加注释:@objc(SEPushNoAnimationSegue),否则,在 Storyboard 中,它只能识别随机生成的名称,例如 _tcxxxxSEPushNoAnimationSegue。

为什么这两个问题会在这里发生?

最佳答案

问题 #1

UIStoryboardSegue 有一个恼人的缺陷:它的 sourceViewController 和 destinationViewController 属性被类型化为 AnyObject!(即使在 Objective-C(Id 类型)中也是如此)而不是 UIViewController,因为它应该是。

同样的缺陷会对您完美而简单的代码造成严重破坏。以下是如何重写它以修复编译错误:

@objc(SEPushNoAnimationSegue)
class SEPushNoAnimationSegue: UIStoryboardSegue {
override func perform () {
let src = self.sourceViewController as UIViewController
let dst = self.destinationViewController as UIViewController
src.navigationController.pushViewController(dst, animated:false)
}
}

注意:Apple 在 iOS 9 中修复了这个问题。sourceViewControllerdestinationViewController 现在被正确声明为 UIViewController

问题#2

Swift 编译器使用自己的 name mangling 存储它的符号,好的 Objective-C 在 Xcode 中无法识别它。使用显式 @obj() 可以解决问题。

关于ios - Swift 中的自定义 Segue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24185345/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com