Swift:PrepareForSegue 正在运行但未加载 ViewController

Posted

技术标签:

【中文标题】Swift:PrepareForSegue 正在运行但未加载 ViewController【英文标题】:Swift: PrepareForSegue running but not loading ViewController 【发布时间】:2016-02-10 11:29:42 【问题描述】:

我仍在尝试在 ios 中链接 UIViewControllers 等。我在 segues 方面遇到了很多荒谬的问题,但那将是我的错,因为几乎没有任何训练就被扔到了深处!

无论如何,我目前有一个 prepareForSegue 可以完美地运行每一行,然后应该通过 UINavigationController 前往目的地。然而,目的地UIViewController 没有显示,并且应用程序静默崩溃 - 完全没有错误。

有没有什么方法可以根据经验获得导致此类崩溃的潜在原因列表?

“检查转场拼写”和“不在 ViewDidLoad 中执行转场”之类的内容已经被排除在外。

我觉得清单是像我这样的新手了解编码中的陷阱的好方法,但如果无法回答或答案太多,请告诉我,我会杀死这个问题。

谢谢。

【问题讨论】:

你能分享你的故事板代码和图像吗? 对不起 ujjwal - 我没有这样做的授权。目前我更喜欢一种能够看到构建控制器时抛出的错误的方法,因为无声崩溃几乎不可能开始调试 【参考方案1】:

清单可以通过实施协议来修复。请查看以下 WWDC:

https://developer.apple.com/videos/play/wwdc2015-408/

此外,关于 segue,有几点需要注意(OSX 也是如此)...

注意:

i) 根据定义,segue 是一个部分到另一个部分之间的过渡(电影中的场景或音乐中的部分)。所以当涉及到视图控制器时,它们应该是“中间人”......

 i.e. ViewController1 <-- segue ->> ViewController2

ii) 当您继承并覆盖prepareForSegue 时,您是在告诉您的代码您想自己处理转换。即在 UITabviewController(或 NSStabViewController)中,您可以使用一些您想在覆盖中实现自己的行为来覆盖它们的默认行为

第 1 部分)PrepareForSegue - 在它发生之前:

这是您实例化、配置、设置等...您的视图控制器的地方。如果它们已经设置好,那么您应该在这里进行超级调用。

//i.e.   super.PrepareSegueForIdentifier(identifier)

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
    if segue.identifier == "something" 
        // Do your thing here
        // MARK: IFYES
     else 
        prepareForSegue(segue, sender: sender)
    

如果您为“成为”视图控制器做好了准备工作,那么请在我标记为“IFYES”的“if”语句的第一部分中进行设置。您可以设置动画、颜色、大小等...

完成后,还有另一个方法:

performSegueWithIdentifier:

我使用的一个例子是:

override func performSegueWithIdentifier(identifier: String, sender: AnyObject?) 
    if (identifier == "yourIdentifier") 
        Do something here
     else 
        super.performSegueWithIdentifier(identifier, sender: sender)
    

这是标识符为yourIdentifier 的segue 实际执行某些操作的时候。即当您的 viewController 调用动作或函数时:

func someFunction()
    self.performSegueWithIdentifier("yourIdentifier", sender: senderObjectName)

这当然是如果您确保控制器之间的转场等...具有正确的标识符和类型...

【讨论】:

非常感谢 Adrian 的广泛回答。据我所知,一切都顺利进行,但随后失败了。我已经将 segue 重定向到一个基本的 ViewController 并且它工作正常,所以假设这意味着在目标控制器的初始化阶段中有一些它不喜欢的东西 - 所以至少有一个起点。 您是否检查过(i) the from-ViewController has it's class set(ii) to-viewController has it's class set too 以及segue 本身是否设置了它的类...并且segue 也设置了它的标识符? 或者将其压缩并放在 github 上供我(以及其他 SE 用户查看),以便我们查看发生了什么 :) 所有 3 类都设置并正确。有没有一种聪明的方法来解决为什么 ViewController 没有加载?还是只是在显示之前注释掉块? 因此注释掉并不容易,因为大约有 40 个与控制器相关的 IBOutlets、类、委托等,如果代码被阻塞,会导致构建失败 - 真的没有办法看到加载控制器时抛出的错误的物理日志?谢谢。【参考方案2】:

好吧,在查看类、委托等错误的高低之后,结果发现这是 Swift/XCode 本身的错误。

罪魁祸首只是页面上的 TextView,它需要将其默认文本设置为空白才能加载页面。任何默认文本都需要在 viewDidLoad 中设置。

完整的解决方案包含在这里 - iOS 9 Segue Causes App To Freeze (no crash or error thrown)

如果有任何方法可以查看在视图初始化期间抛出的错误日志,这仍然是一件好事,但在这种情况下,这一切都归结为视图上的一个无关紧要的元素。

【讨论】:

以上是关于Swift:PrepareForSegue 正在运行但未加载 ViewController的主要内容,如果未能解决你的问题,请参考以下文章

Swift:prepareForSegue 和 instantiateViewController 之间的区别

在 Swift 3 中使用 prepareForSegue 分配对象变为 nil

Swift:如何在 UICollectionViewCell 中使用“prepareForSegue”?

prepareForSegue 不适用于自定义 segue (swift)

Swift:prepareForSegue 有两个不同的 segue

在 Swift 2 中通过“prepareForSegue”传递数据