Xcode 7 - 一些 segues 不再工作
Xcode 7 - Some segues not working anymore
我将我的 Swift 应用程序升级到 Xcode 7 / Swift 2.0,现在我的应用程序中的某些 segues 突然不再工作。
我有一个 segue 弹出一个 "Check In" 模态并且它工作得很好,但是我有另一个 segue 弹出一个几乎相同的 "Check Out" 模态但它没有启动和应用程序被冻结了。
我从头开始重新创建了 segue,确认它与 "Check In" 相同,但仍然无法正常工作。
相反,我也尝试启动一个空白视图而不是我的签出模式,它工作正常。
没有错误,只是死机了,我确实确认 "prepareForSegue" 部分被正确调用,但我的模态的 "viewDidLoad" 部分没有被调用。
仅供参考,我已关闭自动布局。
您的 "Check Out" 模式有 UITextView 吗?如果是,那么 Xcode 7 / iOS9 中存在错误,如果您在故事板中设置了默认文本值,则无法启动包含 UITextView 的模态(或任何根视图)。
一种解决方法是确保故事板中的 UITextView 为空白或具有默认的 Lorem Ipsem 值,而是在 viewDidLoad 的代码中以编程方式设置文本。
希望这个错误能尽快修复。
我怀疑您的 "Check Out" 控制器代码中存在无限循环。尝试在呈现控制器后(当它冻结时)在调试器中暂停应用程序并检查堆栈跟踪。如果没有帮助,请尝试在 viewDidLoad
和 viewWillAppear
中逐行注释掉代码以找到导致冻结的行。
我遇到了这个问题,试试这个
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,它通常可以正常工作。
我的应用程序在 iOS8 中运行良好。它的流程是:
VC:View Controller,NVC:Navigation View Controller,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 已过时(Apple 突然放弃在线教程中实际推荐的内容并导致应用程序崩溃,真是可耻!)。所以我修改了
NVC1---(ER)->VC1--(PS)->VC2 而 VC2 仍然嵌入在 N VC2。我有错误
与导致 "Unbalanced calls to begin/end appearance transactions"
消息的 Whosebug post on view not in hierarchy. So I started doing the transition programmatically and after tackling present vs. push ViewController issue that results in "tried to push modally on active view controller"
message and then 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
我有这个,但它是上面的none。我的 segue 调用恰好在一个块内。当我将调用移至主线程时,我发现新视图控制器中出现 'NSUnknownKeyException' 错误。在块内似乎可以防止错误在 Xcode 中注册,因此该应用程序似乎挂起而没有任何错误。
解决后,原始代码就可以正常工作了。
我将我的 Swift 应用程序升级到 Xcode 7 / Swift 2.0,现在我的应用程序中的某些 segues 突然不再工作。
我有一个 segue 弹出一个 "Check In" 模态并且它工作得很好,但是我有另一个 segue 弹出一个几乎相同的 "Check Out" 模态但它没有启动和应用程序被冻结了。
我从头开始重新创建了 segue,确认它与 "Check In" 相同,但仍然无法正常工作。
相反,我也尝试启动一个空白视图而不是我的签出模式,它工作正常。
没有错误,只是死机了,我确实确认 "prepareForSegue" 部分被正确调用,但我的模态的 "viewDidLoad" 部分没有被调用。
仅供参考,我已关闭自动布局。
您的 "Check Out" 模式有 UITextView 吗?如果是,那么 Xcode 7 / iOS9 中存在错误,如果您在故事板中设置了默认文本值,则无法启动包含 UITextView 的模态(或任何根视图)。
一种解决方法是确保故事板中的 UITextView 为空白或具有默认的 Lorem Ipsem 值,而是在 viewDidLoad 的代码中以编程方式设置文本。
希望这个错误能尽快修复。
我怀疑您的 "Check Out" 控制器代码中存在无限循环。尝试在呈现控制器后(当它冻结时)在调试器中暂停应用程序并检查堆栈跟踪。如果没有帮助,请尝试在 viewDidLoad
和 viewWillAppear
中逐行注释掉代码以找到导致冻结的行。
我遇到了这个问题,试试这个
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,它通常可以正常工作。
我的应用程序在 iOS8 中运行良好。它的流程是:
VC:View Controller,NVC:Navigation View Controller,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 已过时(Apple 突然放弃在线教程中实际推荐的内容并导致应用程序崩溃,真是可耻!)。所以我修改了
NVC1---(ER)->VC1--(PS)->VC2 而 VC2 仍然嵌入在 N VC2。我有错误
与导致 "Unbalanced calls to begin/end appearance transactions"
消息的 Whosebug post on view not in hierarchy. So I started doing the transition programmatically and after tackling present vs. push ViewController issue that results in "tried to push modally on active view controller"
message and then 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
我有这个,但它是上面的none。我的 segue 调用恰好在一个块内。当我将调用移至主线程时,我发现新视图控制器中出现 'NSUnknownKeyException' 错误。在块内似乎可以防止错误在 Xcode 中注册,因此该应用程序似乎挂起而没有任何错误。
解决后,原始代码就可以正常工作了。