使用故事板非常简单。你只需将动作拖到“退出”。但是如何从代码中调用它呢?
插入要unwind的Segue名称。
然后,- (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender.与你的segue identify。
- (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender.
我使用了[self dismissViewControllerAnimated: YES completion: nil];,它将返回调用ViewController。
[self dismissViewControllerAnimated: YES completion: nil];
ViewController
供你参考:为了让@Vadim的答案与视图控制器中调用的手动unwind seque动作一起工作,你必须放置命令:
[self performSegueWithIdentifier:(NSString*) identifier sender:(id) sender];
在被覆盖的类方法在viewDidAppear内部,如下所示:
-(void) viewDidAppear:(BOOL) animated { [super viewDidAppear: animated]; [self performSegueWithIdentifier:@"SomeSegueIdentifier" sender:self]; }
如果你把它放在其他ViewController方法中,如viewDidLoad或那些有点,它将被忽略。
引用苹果关于Unwind Segue的技术说明: 要添加一个只会以编程方式触发的unwind segue,从场景的视图控制器图标control+拖动到它的退出图标,然后从弹出菜单中为新segue选择一个unwind操作
技术说明链接 .
向后兼容的解决方案,将工作于ios6之前的版本,为那些感兴趣:
- (void)unwindToViewControllerOfClass:(Class)vcClass animated:(BOOL)animated { for (int i=self.navigationController.viewControllers.count - 1; i >= 0; i--) { UIViewController *vc = [self.navigationController.viewControllers objectAtIndex:i]; if ([vc isKindOfClass:vcClass]) { [self.navigationController popToViewController:vc animated:animated]; return; } } }
Vishal Chaudhry的回答对我很有用。我还会添加,为了手动触发seque使用:
[self performSegueWithIdentifier:@"mySegueName" sender:self];
在ViewController中,你还必须在故事板中ViewController的场景下选择unwind segue,并在RHS的属性视图中确保标识符字段包含你在代码中引用的名称(在上面的例子中是“mySegueName”)。
如果省略此步骤,上面的行将抛出一个异常,表示序列名未知。
bradleygriffith的答案很棒。为了简化,我采取了第10步,并做了一个截图。这是Xcode 6的截图。
bradleygriffith
unwind segue
[self performSegueWithIdentifier:@"unwindIdentifier" sender:self];
下面是Objective C和Swift的完整答案:
1)在你的目标视图控制器(你想要segue到的地方)中创建一个IBAction unwind segue。在实现文件中的任何位置。
IBAction
// Objective C - (IBAction)unwindToContainerVC:(UIStoryboardSegue *)segue { } // Swift @IBAction func unwindToContainerVC(segue: UIStoryboardSegue) { }
2)在源视图控制器(你正在从中segue的控制器)上,⌃+从“activity Name”中拖动退出。你应该在弹出窗口中看到步骤1中创建的unwind segue。(如果你没有发现,请回顾第一步)。从弹出窗口中选择unwindToContainerVC:或者任何你命名的方法来连接你的源控制器到unwind IBAction。
3)在故事板的源视图控制器的文档大纲中选择segue(它将被列在底部附近),并给它一个标识符。
4)使用此方法从源视图控制器调用unwind segue,替换你的unwind segue名称。
// Objective C
[self performSegueWithIdentifier:@"unwindToContainerVC" sender:self];
/ /快速
self.performSegueWithIdentifier("unwindToContainerVC", sender: self)
NB。使用unwind方法上segue参数的sourceViewController属性来访问源控制器上的任何公开属性。另外,请注意,框架处理解除源控制器。如果您想确认这一点,请向源控制器添加一个dealloc方法,并附上一条日志消息,该日志消息应该在源控制器被杀死后触发。如果dealloc不火,你可能有一个保留周期。
斯威夫特4:
1.在你想unwind到的控制器中创建一个@IBAction segue:
@IBAction func unwindToVC(segue: UIStoryboardSegue) { }
2.在故事板中,从你想要segue (unwind)的控制器中,从ctrl+从控制器符号拖拽到退出符号并选择你之前创建的方法:
3.现在你可以注意到在文档大纲中你有一个新的标题为“Unwind segue....”的行。现在你应该单击这一行并打开属性检查器来设置标识符(在我的例子中是unwindSegueIdentifier)。
你差不多完成了!现在你需要打开你想要unwind的视图控制器并创建一些执行segue的方法。例如,你可以添加按钮,用@IBAction代码连接它,然后在这个IBAction中添加perfromSegue (withIdentifier:发送方:)方法:
@IBAction func unwindToSomeVCWithSegue(_ sender: UIButton) { performSegue(withIdentifier: "unwindSegueIdentifier", sender: nil) }
这就是你要做的一切!
对于那些想知道如何用vc 不通过storyboard设置(那些从搜索“编程方式”+“unwind segue”来解决这个问题的人)。
鉴于你不能通过编程方式设置unwind segue,最简单的纯编程解决方案是调用:
navigationController?.popToRootViewController(animated: true)
它会弹出堆栈上的所有视图控制器回到你的根视图控制器。
要从导航堆栈中弹出最顶层的视图控制器,使用:
navigationController?.popViewController(animated: true)