我将我的Swift应用程序升级到Xcode 7 / Swift 2.0,现在我的应用程序突然发现某些segues不再有效。
我有一个新的" Check In"模态和它完美的工作,但然后我有另一个segue弹出一个" Check Out"模式几乎相同但它没有启动,应用程序被冻结。
我从头开始重新创建了segue,确认它与" Check In"一,它仍然无法正常工作。
我也尝试启动空白视图而不是我的Check Out模式,它工作正常。
没有错误,它只是冻结,我确实确认了#34; prepareForSegue"部分被正确调用但是" viewDidLoad"我的模态的一部分没有被调用。
仅供参考,我已关闭自动布局。
答案 0 :(得分:1)
我怀疑你身处某处有无限循环" Check Out"控制器代码。在呈现控制器(冻结时)并检查堆栈跟踪后,尝试在调试器中暂停应用程序。如果它没有帮助,请尝试在viewDidLoad
和viewWillAppear
中逐行注释掉代码,以找到导致冻结的行。
答案 1 :(得分:1)
我有这个问题,试试这个
dispatch_async(dispatch_get_main_queue(), { () -> Void in
let viewController:UIViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("Storyboard Id")
self.presentViewController(viewController, animated: true, completion: nil)
})
您只需在视图中提供一个故事板ID,通常它正在运行。
答案 2 :(得分:1)
我的应用程序在iOS8中运行良好。它的流程是:
VC:View Controller,NVC:导航视图控制器,ER:NVC和VC之间的嵌入式根关系,PS:Push Segue,PG:程序化演示
NVC1 ---(ER) - > VC1 ---(PS) - > NVC2 ---(ER) - > VC2等。
问题是VC1-(PS) - > NVC2 segue不起作用,没有冻结。 vc1.prepareForSegue()已执行,但未显示VC2。我进行了实验,发现我没有提到这里提到的UITextView问题。 按照下面列出的面包屑,我按照以下方式尝试了几个小时(最后的代码): NVC1 ---(ER) - > VC1 ---(PG) - > VC2
以下是步骤:
正如Segue issue in iOS9中所提到的,多个NVC都不合时宜(苹果公司因为突然放弃了在线教程中实际推荐的内容并使应用程序破解而感到羞耻!)。所以我修改了
NVC1 ---(ER) - > VC1-(PS) - > VC2,而VC2仍然嵌入NVC2中。我有错误
类似于StackOverflow post on view not in hierarchy。所以我开始以编程方式进行转换,在处理导致"tried to push modally on active view controller"
消息的present vs. push ViewController issue然后导致"Unbalanced calls to begin/end appearance transactions"
消息的ViewController lifecycle issues之后,我得到了以下代码。基于这种经验,我真的认为Apple应该在Xcode7 / iOS9更新中独自留下一个工作的东西。
//*********** VC1.swift. A translation of working code
class VC1:UIViewController{
private var viewController2:VC2?
private var showVC2: Bool = false
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
if(showVC2) {
showVC2 = false
self.pushVC2()
}
}//viewWillAppear
private var info:String? // info from incoming user action.
@IBAction unwindToVC1FromUserAction(incomingSegue: UIStoryboardSegue?) {
// Do app-specific stuff to get info from incomingSegue and
// store in self.info variables.
let myboard: UIStoryBoard = self.storyboard!;
self.viewController2 = myboard.instantiateViewControllerWithIdentifier(
"VC2 Storyboard ID") as! VC2
self.prepareVC2() // Pass info to VC2.info, stuff you would have done in prepareForSegue
showVC2= true
} //unwind
private func prepareVC2() {
self.viewController2.info = self.info // etc..
}
private func pushVC2() {
self.navigationController!.pushViewController(viewController2!, animated:false)
}
} //class
答案 3 :(得分:0)
我有这个,但不是上述情况。我的segue电话碰巧在一个街区内。当我将调用移动到主线程时,我看到我在新的View Controller中出现了“NSUnknownKeyException”错误。在块内部似乎可以防止错误在Xcode中注册,因此应用程序似乎挂起时没有任何错误。
一旦解决了问题,原始代码就可以了。