使用情节提要非常简单。您只需将操作拖到“退出”即可。但是,如何从代码中调用它呢?
使用情节提要非常简单。您只需将操作拖到“退出”即可。但是,如何从代码中调用它呢?
Answers:
插入Segue的名称以展开。
然后,- (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender.
与您的身份识别。
这是使用Objective C和Swift的完整答案:
1)IBAction
在您的目标视图控制器(您想锁定到的位置)中创建一个放松的序列。实施文件中的任何位置。
// Objective C
- (IBAction)unwindToContainerVC:(UIStoryboardSegue *)segue {
}
// Swift
@IBAction func unwindToContainerVC(segue: UIStoryboardSegue) {
}
2)在源视图控制器(您正在从中进行选择的控制器)上,⌃ +从“活动名称”中拖动以退出。您应该在弹出窗口中看到在步骤1中创建的放松序列。(如果看不到,请复查第一步)。从弹出窗口中选择unwindToContainerVC:或您命名为将源控制器连接到展开IBAction的方法的任何名称。
3)在情节提要的源视图控制器的文档大纲中选择序列(它将在底部附近列出),并为其指定一个标识符。
4)使用此方法从源代码视图控制器中调用放卷序列,替换您的放卷序列名称。
//目标C
[self performSegueWithIdentifier:@"unwindToContainerVC" sender:self];
//迅捷
self.performSegueWithIdentifier("unwindToContainerVC", sender: self)
注意 在unwind方法上使用segue参数的sourceViewController属性可访问源控制器上任何公开的属性。另外,请注意,该框架负责关闭源控制器。如果您想确认这一点,请向源控制器添加一个dealloc方法,并附带一条日志消息,该消息一旦被杀死,便会触发。如果dealloc不启动,您可能会有一个保留周期。
(IBAction)unwindToContainerVC:(UIStoryboardSegue *)segue
ctrl+drag
从ViewController
到Exit
极其有用。谢谢!
bradleygriffith
的答案很好。我采取了第10步,并做了一个截图以简化操作。这是Xcode 6中的屏幕截图。
unwind segue
在侧边栏中选择:[self performSegueWithIdentifier:@"unwindIdentifier" sender:self];
UIViewController
。然后您的解决方案将起作用
我用过的[self dismissViewControllerAnimated: YES completion: nil];
它将使您返回到呼叫ViewController
。
Vishal Chaudhry的上述回答对我有用。我还添加了该命令,以便使用以下命令手动触发定居:
[self performSegueWithIdentifier:@"mySegueName" sender:self];
从ViewController中,还必须在情节提要中的ViewController的场景下选择展开序列,并且在RHS的属性视图中,确保Indentifier字段包含您在代码中引用的名称(在上面的示例中为“ mySegueName” )。
如果省略此步骤,则上面的行将引发一个例外,即不知道seque名称。
向后兼容的解决方案将对那些感兴趣的人适用于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;
}
}
}
SWIFT 4:
1.使用要在其中展开的控制器内部的segue 创建一个@IBAction:
@IBAction func unwindToVC(segue: UIStoryboardSegue) {
}
2.在情节提要中,要从控制器中按ctrl +拖动(放开)控制器中的符号,以退出符号并选择您之前创建的方法:
3.现在您可以注意到,在文档大纲中,您有一个新行,标题为“ Unwind segue ....”。现在,您应该单击此行并打开属性检查器以设置标识符(在我的情况下为unwindSegueIdentifier)。
4.您快完成了!现在,您需要打开希望放松的视图控制器,并创建一些将执行segue的方法。例如,您可以添加按钮,使用@IBAction将其与代码连接,然后在此IBAction内添加perfromSegue(withIdentifier:sender :)方法:
@IBAction func unwindToSomeVCWithSegue(_ sender: UIButton) {
performSegue(withIdentifier: "unwindSegueIdentifier", sender: nil)
}
这就是您要做的!
对于那些想知道如何使用未通过情节提要建立的 VC做到这一点的人(那些通过 “以编程方式” +“解开序曲”搜索来解决此问题的人)。
鉴于您无法以编程方式设置展开序列,最简单的纯编程解决方案是调用:
navigationController?.popToRootViewController(animated: true)
这会将堆栈中的所有视图控制器弹出回到您的根视图控制器。
要仅从导航堆栈中弹出最顶层的视图控制器,请使用:
navigationController?.popViewController(animated: true)
仅供参考:为了使@Vadim的答案与在View Controller中调用的手动展开固定动作配合使用,必须放置以下命令:
[self performSegueWithIdentifier:(NSString*) identifier sender:(id) sender];
在覆盖的类方法viewDidAppear中,如下所示:
-(void) viewDidAppear:(BOOL) animated
{
[super viewDidAppear: animated];
[self performSegueWithIdentifier:@"SomeSegueIdentifier" sender:self];
}
如果将其放在其他ViewController方法(如viewDidLoad或viewWillAppear)中,它将被忽略。
performSegueWithIdentfier
确实做到了:从一个ViewController到另一个ViewController执行