在我的应用程序启动时,它以编程方式显示使用segue的LoginViewController。视图控制器以模态方式呈现,过渡设置为交叉溶解。验证成功后,我想通过以编程方式触发展开segue来关闭登录视图。所以我把它添加到我的头文件中:
- (IBAction)unwindSegue:(UIStoryboardSegue *)segue;
现在在IB中我可以控制 - 从“文件所有者”LoginViewController拖动到“退出”按钮并选择unwindSegue:
。这将创建一个手动segue,它会在Connections检查器中显示File文件所有者和Exit按钮。然后我点击IB中场景中新创建的Unwind segue,然后给它起一个名字。如果我单击“转到”按钮进行展开segue操作,则会转到上面提到的声明。
到目前为止一切顺利,我在GCD块中成功验证后触发了这个展开segue:
....
dispatch_async(dispatch_get_main_queue(), ^
{
[self performSegueWithIdentifier:@"UnwindSegueIdentifier" sender:self];
[self.spinner removeFromSuperview];
self.spinner = nil;
});
.....当它运行时没有任何反应。微调器确实被正确删除,但没有迹象表明该unwind segue正在执行。
unwindSegue:
实施中的断点永远不会受到打击。没有抛出任何错误。什么都没有写入控制台。标识符是正确的,我三重检查(否则它将失败)。
我查看了答案here,here和here,但我似乎没有错过任何内容。
我注意到的是,Xcode认为unwindSegue:
不链接:
我无法从unwindSegue:
前面的小空圈拖动并将其链接到退出按钮。
任何帮助将不胜感激。
答案 0 :(得分:8)
如果您使用模态segue转到登录视图,则需要返回的只是致电
[self dismissViewControllerAnimated:YES completion:nil];
更确切地说,你应该在演示控制器(你的第一个控制器)上调用它,但如果你在现有的控制器上打电话,它将被转发。您可以使用完成块进行任何所需的清理。没有必要使用GCD。
修改强>
要回答其他评论:我不能确定您的描述,但似乎您已经在呈现的控制器上实现了展开操作,而不是呈现控制器。展开segue允许在没有附加协议的情况下在呼叫者处做某事(例如,设置数据)。
答案 1 :(得分:2)
引用Apple关于Unwind Segue的技术说明中的文字: 要添加仅以编程方式触发的展开segue,请从场景的视图控制器图标控制+拖动到其退出图标,然后从弹出菜单中选择新segue的展开动作。