performSegueWithIdentifier和instantiateViewControllerWithIdentifier的区别

16
我一直无法理解我一直收到的SIGABRT错误。 我有一个使用storyboard创建的iOS应用程序,在storyboard中我有一个UITableViewController。 现在,我可以将TVC的单元格选定并使其推送“segue”视图控制器,但如果我需要在某些条件下停止“segue”操作怎么办? 显然你不能,因为prepareForSegue:sender:方法不允许这样做,并且它似乎是在执行转换之前调用的唯一回调。
所以我猜想我可以进入tableView:didSelectRowAtIndexPath:并以编程方式执行segue。 虽然效果不佳,但仍…
嗯,结果证明我猜错了。 或者至少,我做错了什么。最显而易见的方法是:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self performSegueWithIdentifier:@"TheOtherIdentifier" sender:self];
}

但整个应用程序崩溃并出现了SIGABRT错误,这没有提供任何有用的信息(是的,我确定是那一行导致应用程序崩溃了,我用调试器检查过 :) 此外,我正在尝试加载的VC已经正确设置了标识符,因为下面的代码

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UIViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"TheOtherIdentifier"];
    [self.navigationController pushViewController:vc animated:YES];
}

"works"。引号表示这显然不是进行过渡的正确方式。

现在:有什么想法吗?


只是为了明确,你说你为目标视图控制器设置了这个标识符。但是你是否为segue本身设置了标识符?这就是你需要在第一种情况下使用的标识符。 - Firoze Lafeer
好的,我之前漏掉了这个。请参考T.J.的回答获取更多评论。 - Morpheu5
1个回答

8
尝试这个:
  1. 使用第一个代码块,而不是第二个。
  2. 在故事板中,从单元格向其他视图控制器进行控制拖动。注意,会创建一个segue。
  3. 点击segue。使用属性检查器将segue标识符命名为“theOtherIdentifier”(建议使用小写“t”)。还要选择一个segue样式,假设您正在使用导航控制器,则选择“推送”。
  4. 故事板将实例化其他视图控制器。请确保您不是在代码中执行此操作。

谢谢,这解决了我的问题,但如果我通过IB设置segue,它会被执行,而不管条件是什么。我需要包括一个条件,例如基于其他单元格中输入的值来检查用户的身份。 - Morpheu5
好的,抱歉,我漏掉了故事板控制部分 :)编辑:哎呀。再次道歉。我缩小了视图以便从一个VC到另一个VC创建segue,但我刚刚意识到我可以通过拖动顶部系统栏来完成。无论如何,没关系:我成功了 :) - Morpheu5
太好了。我很高兴一切都顺利。在系统栏中从 by 选择器创建 segue 对我来说是新的事情。我过去会创建隐藏按钮来进行条件 segue。 - T.J.
iOS SDK对我来说通常没有太多意义,但我总是尝试以有意义的方式做事情,当我失败时,我只是咕哝一声,然后按照他们毫无意义的方式去做 :) 不过这次成功了 :) - Morpheu5
2
注意:如果您将segue样式设置为“push”,并且您未嵌入有效的UINavigationController中... Apple将默默无声地不执行任何操作 :)。 - Adam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接