iOS 6 - 编程触发Unwind Segue没有任何作用

3

在我的应用程序启动时,它使用segue编程方式显示LoginViewController。视图控制器以交叉溶解的方式模态呈现。验证成功后,我想通过编程方式触发一个返回segue来关闭登录视图。因此,我将以下内容添加到我的头文件中:

- (IBAction)unwindSegue:(UIStoryboardSegue *)segue;

现在我可以在IB中从“文件所有者”LoginViewController向Exit按钮控制拖动,并选择unwindSegue:。这将创建一个手动segue,并正确显示在“文件所有者”和Exit按钮的Connections检查器中。然后,我单击IB场景中新创建的Unwind segue,然后为其命名。如果我点击Unwind segue操作的“转到”按钮,它会将我带到上面提到的声明。

到目前为止都很好,然后我在我的GCD块成功验证后触发此Unwind segue:

....
dispatch_async(dispatch_get_main_queue(), ^
{
    [self performSegueWithIdentifier:@"UnwindSegueIdentifier" sender:self];

    [self.spinner removeFromSuperview];
    self.spinner = nil;
});

当运行时没有任何反应。旋转器正确地被移除,但是没有任何迹象表明那个解开的segue被执行了。

unwindSegue: 的实现中断点从未被命中。没有抛出错误。控制台上什么都没有输出。标识符是正确的,我已经三次检查过了(否则也会失败)。

我查看了这里这里这里的答案,但似乎我没有漏掉任何东西。

然而,我注意到 Xcode 认为 unwindSegue: 没有被链接:linked? not linked?

我无法从 unwindSegue: 前面的小空圆圈拖动并将其链接到退出按钮。

非常感谢任何帮助。


为什么不直接让退出按钮触发segue,即直接将按钮连接起来? - Matthias
谢谢您的回复,但我认为我可能没有表达清楚......我一直在谈论的退出按钮是绿色的退出过渡按钮,而不是视图上的实际按钮。 - Allen Zeng
什么情况下应该触发取消返回的segue?为什么需要以异步方式执行,即为什么要使用GCD? - Matthias
转换器在成功验证后被触发。验证是通过调用 Web 服务完成的。 - Allen Zeng
2个回答

8
如果您正在使用模态转换来进入您的登录视图,那么您只需要调用以下语句即可返回:
[self dismissViewControllerAnimated:YES completion:nil];

更准确地说,您应该在呈现控制器(第一个控制器)处调用它,但如果您在呈现的控制器处调用它,则会被转发。您可以使用完成块执行所需的清理操作。无需使用GCD。
编辑:
回答附加评论:根据您的描述,我不确定您是否已经在呈现的控制器上实现了返回操作,而不是在呈现控制器上实现了返回操作。返回segue允许在调用者(例如设置数据)上执行某些操作,而无需使用附加协议。

1
谢谢。我知道我可以调用dismissViewControllerAnimated:completion:,但是我更好奇的是为什么返回segue不起作用。我刚刚将其连接到一个按钮上,但它仍然无法正常工作。此外,使用GCD是为了使身份验证Web服务调用不会阻塞UI,而不仅仅是为了关闭登录视图控制器。 - Allen Zeng
你说得完全正确!我没有在正确的位置实现segue... 我应该早点看到这个问题... 谢谢! - Allen Zeng
我注意到Xcode仍然报告该方法未连接,就像我在截图中展示的那样。这一定是个bug。 - Allen Zeng

2
引用自苹果的《取消Segue的技术笔记》: 要添加一个仅在程序中触发的取消Segue,请从场景的视图控制器图标控制+拖动到其退出图标,然后从弹出菜单中选择新Segue的取消操作。 技术笔记链接

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