2013-02-19 60 views
3

在我的应用程序启动时,它以编程方式显示使用segue的LoginViewController。视图控制器以模态方式呈现,设置为交叉解散。成功验证后,我想通过以编程方式触发unwind segue来关闭登录视图。所以我说这我的头文件:iOS 6 - 以编程方式触发Unwind Segue什么都不做

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

现在在IB我能够控制拖动从“文件的所有者” LoginViewController的退出按钮,并选择unwindSegue:。这会创建一个手动循环,它会正确显示在文件所有者和退出按钮的Connections检查器中。然后,我从IB中的场景中单击新创建的Unwind segue,然后为其命名。如果我点击“去”按钮来取消放风行为,它会将我带到上述声明中。

到目前为止好,我再触发,认证成功后该开卷赛格瑞在我的GCD块:

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

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

.....并在运行时没有任何反应。微调器确实被正确移除,但没有任何放松继续执行的迹象。

unwindSegue:执行中的一个断点从未被击中。没有错误抛出。没有任何东西写入控制台。标识符是正确的,我三重检查(否则它会失败)。

我看了答案hereherehere但我似乎没有错过任何东西。

我也注意到什么虽然是Xcode认为unwindSegue:链接: linked? not linked?

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

任何帮助将不胜感激。

+0

你为什么不干脆让退出按钮触发SEGUE,即线直接按钮? – Matthias 2013-02-19 13:51:40

+0

感谢您的回复,但我想我可能没有在那里清楚表达自己的意见......我一直在谈论的退出按钮是绿色的退出按钮,而不是视图上的实际按钮 – 2013-02-19 22:03:25

+0

究竟应该触发您的退休继续?为什么你需要以异步的方式来完成,比如你为什么要使用GCD? – Matthias 2013-02-20 07:36:59

回答

8

如果您使用的是模态SEGUE去你的登录视图,所有你需要回去被调用

[self dismissViewControllerAnimated:YES completion:nil]; 

更准确地说,你应该在呈现控制器调用它(你的第一个控制器) ,但是如果您在提供的控制器处致电,它将被转发。你可以使用完成块做任何必要的清理。没有必要使用GCD。

编辑

要回答的附加注释:我不是从你的描述很确定,但似乎你已经实现了在开卷行动提出控制器而不是在呈现控制器。放松段是为了允许在呼叫者处做某些事情(例如,设置数据)而无需附加协议。

+1

谢谢。我明白我可以调用'dismissViewControllerAnimated:completion:',但是我更加好奇为什么unwind segue不起作用。我刚刚将它连接到一个按钮,但它仍然无法正常工作。此外,使用GCD的目的是使认证Web服务调用不会阻塞UI,而不仅仅是关闭登录视图控制器。 – 2013-02-20 10:01:11

+0

@AllenZeng:看我的编辑。 – Matthias 2013-02-20 11:18:48

+0

你是完全正确的!我没有在正确的地方实施赛格......我应该早一点看到......谢谢! – 2013-02-20 12:55:01

2

引用来自苹果技术说明文件中有关Unwind Segue的文本: 要添加一个将仅以编程方式触发的展开顺序,请从场景的视图控制器图标控制+拖动到其退出图标,然后选择新展开的展开操作从弹出菜单。

Link to the Technical Note