iOS 6和Xcode 4.5有一项称为"Unwind Segue"的新功能:
展开segue可以允许转换到故事板中的现有场景实例
除了Xcode 4.5发行说明中的这个简短条目之外,UIViewController现在似乎有几个新方法:
- (BOOL)canPerformUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender
- (UIViewController *)viewControllerForUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender
- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier
Run Code Online (Sandbox Code Playgroud)
展开segue如何工作以及它们可以用于什么?
我有一个应用程序,它是一个单一的视图应用程序 我有一个导航控制器链接到根视图控制器中的所有子控制器.
在每个子控制器中,我都有一个注销按钮.我想知道我是否可以使用一个可以调用的功能,这将解除所有已经打开的控制器,无论当用户按下注销时哪个控制器当前打开?
我的基本开始:
func tryLogout(){
self.dismissViewControllerAnimated(true, completion: nil)
let navigationController = UINavigationController(rootViewController: UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("LoginViewController") )
self.presentViewController(navigationController, animated: true, completion: nil)
}
Run Code Online (Sandbox Code Playgroud)
我正在寻找执行此任务的最有效的内存方式.我将我的注销函数放在一个单独的utils文件中,但是我不能使用self.而且我仍然知道要动态解除哪些控制器的问题.
已建议更新 Pop到根视图控制器.所以我的尝试是这样的:
func tryLogout(ViewController : UIViewController){
print("do something")
dispatch_async(dispatch_get_main_queue(), {
ViewController.navigationController?.popToRootViewControllerAnimated(true)
return
})
}
Run Code Online (Sandbox Code Playgroud)
这是实现我追求目标的最佳途径吗?
我使用故事板工具创建了一个简单的展开segue.我在要放松的视图中创建了以下事件处理程序:
-(IBAction)quitQuiz:(UIStoryboardSegue *)segue {
NSLog(@"SEGUE unwind");
}
Run Code Online (Sandbox Code Playgroud)
这会正确触发并解开segue(消息被记录).
当用户退出测验时,我想传回一些数据并且一直在努力解决这个问题.任何人都可以建议吗?
如何在Swift iOS中关闭2个视图控制器?
以下是我的代码.
@IBAction func backButtonTapped(sender: AnyObject) {
self.presentingViewController
.presentingViewController
.dismissViewControllerAnimated(true, completion: nil)
}
Run Code Online (Sandbox Code Playgroud) 我有一个iPad应用程序,它有很多屏幕和很多segue选项.目前,我只是使用performSegueWithIdentifier来启动这些segue,我担心的是,当用户执行越来越多的segues时,我占用了大量内存.我见过人们推荐使用函数popToRootViewControllerAnimated:如果使用UINavigationController,但问题是我没有使用它.如何阻止VC的数量激增?应用程序的工作方式,用户不断返回到根VC - 实际上是一个搜索屏幕.因此,如果我需要在需要这样一个segue时清除VC的堆栈,那我认为这将解决我的问题,但我不知道如何解决这个问题.谢谢你的任何建议.
在我的应用程序启动时,它以编程方式显示使用segue的LoginViewController.视图控制器以模态方式呈现,过渡设置为交叉溶解.验证成功后,我想通过以编程方式触发展开segue来关闭登录视图.所以我把它添加到我的头文件中:
- (IBAction)unwindSegue:(UIStoryboardSegue *)segue;
Run Code Online (Sandbox Code Playgroud)
现在在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;
});
Run Code Online (Sandbox Code Playgroud)
.....并且当它运行时没有任何反应.微调器确实被正确删除,但没有迹象表明unwind segue正在执行.
执行中的断点unwindSegue:永远不会被击中.没有抛出任何错误.什么都没有写入控制台.标识符是正确的,我三重检查(否则它将失败).
我做了什么,虽然注意到,是Xcode认为unwindSegue:是不挂钩:

我无法从前面的小空圈拖动并将其unwindSegue:链接到"退出"按钮.
任何帮助将不胜感激.
我们怎样才能以编程方式推送xcode unwind segue?
我知道简单的方法是使用故事板并将按钮拉到"退出",但我打算做的是在退出视图之前先运行一些代码.
我正在尝试以编程方式关闭我的 Cocoa 应用程序中的视图控制器。这可能吗?我在 Objective-C 中看到了一篇关于它的帖子,但我一直没能找到一个适用于 Swift 的帖子。我已经在函数中尝试了这段代码,然后调用了该函数。self.dismissViewController(self)但是它给了我 SIGABRT。我不希望用户必须按下按钮或做任何事情,但只要我“显示”下一个视图控制器就关闭后控制器(我有一个自动按下 IBOutlet 按钮,它会自动将视图发送到下一页,但似乎无法关闭当前页面)。是否有关闭父视图控制器的工作代码?