使用标识符执行 segue 在 swift 2 中不起作用
Posted
技术标签:
【中文标题】使用标识符执行 segue 在 swift 2 中不起作用【英文标题】:perform segue with identifier wont work in swift 2 【发布时间】:2015-08-31 11:12:02 【问题描述】:当用户登录应用程序时,我一直在使用此代码执行自定义 segue:
dispatch_async(dispatch_get_main_queue())
self.performSegueWithIdentifier("showSTPS", sender: self)
我目前的 perpareForSegue 中有此代码(我不完全确定我是否需要它)
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
if "showSTPS" == segue.identifier
每次我尝试执行 segue 时都会收到以下错误:
2015-08-31 11:56:28.998 ICEFLO[3858:651041] *** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无法使用标识符“showSTPS”执行 segue。 segue 必须有一个 performHandler 或者它必须覆盖 -perform。'
任何关于做什么的建议将不胜感激 - 请注意这是针对 swift2/ios9
-瑜伽士
【问题讨论】:
请发布您的自定义 segue 子类的代码 自定义segue绝对没有代码,我把它设置为custom的唯一原因是我们不能使用push。 自定义转场适用于使用自定义动画的转场 - 请参阅本教程 appcoda.com/custom-segue-animations Irrelevent.. 问题是我不能以编程方式执行 segue。由于某些奇怪的原因,我也没有使用 show 的选项 你是如何创建转场的? 【参考方案1】:确保在您的故事板中,segue 类型未设置为自定义。如果将其设置为自定义,则需要提供自己的自定义 segue 类。
【讨论】:
【参考方案2】:Swift 版本:
class CustomSegue: UIStoryboardSegue
override func perform()
let src = self.sourceViewController
let dst = self.destinationViewController
src.navigationController?.pushViewController(dst, animated: true)
【讨论】:
只是添加到这个答案:注意你不要在这个方法中调用super.perform()
,否则你会得到与 OP 相同的运行时错误,尽管覆盖了方法。
@ThomasVerbeek 你是说我们应该打电话给super.perform()
还是不应该?答案仍然包括它。
@TashPemhiwa 我是说你不应该打电话给super.perform()
。我已经提交了修改:)
如果我们不使用navigationController会怎样?【参考方案3】:
如果您的 segue 设置为“自定义”,您需要覆盖 perform 方法。你可以关注this example。
基本上创建一个继承自 UIStoryboardSegue 的类,像这样:
MyCustomSegue.h
@interface MyCustomSegue : UIStoryboardSegue
@end
MyCustomSegue.m
@implementation MyCustomSegue
- (void) perform
UIViewController *src = (UIViewController *) self.sourceViewController;
UIViewController *dst = (UIViewController *) self.destinationViewController;
[src.navigationController pushViewController:dst animated:YES];
@end
我认为这段代码对你有用。
【讨论】:
OP 要求 swift 2 解决方案 -1 此解决方案修复了他遇到的确切错误。一旦我实现了答案,我将添加一个 swift2 改编版(我目前仅使用 objC)。无论如何,这个答案解决了问题【参考方案4】:不要调用超级...
class CustomSegue: UIStoryboardSegue
override func perform()
// super.perform() NOOO or crash!
let src = self.sourceViewController
let dst = self.destinationViewController
src.navigationController?.pushViewController(dst, animated: true)
【讨论】:
如果我们不使用navigationController会怎样以上是关于使用标识符执行 segue 在 swift 2 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
Swift SearchResultsController Segue - “接收者......没有标识符'testSeg''的segue”
如果 segue.identifier == "showChildFiles" 当 segue 标识符看起来正确时,Swift 3 准备 segue 不通过