使用情节提要非常容易。您只需将操作拖到“退出”即可。但是我应该如何从我的代码中调用它?
创建手动segue(从File's Owner 按住ctrl-drag 到Exit),在绿色EXIT 按钮下方的Left Controller Menu 中选择它。
https://i.stack.imgur.com/uWRSG.png
插入 Segue 的名称以放松。
然后,- (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender.
使用您的 segue 标识。
这是 Objective C 和 Swift 的完整答案:
1) 在您的目标视图控制器(您想要转场的位置)中创建一个 IBAction
展开转场。实现文件中的任何位置。
// Objective C
- (IBAction)unwindToContainerVC:(UIStoryboardSegue *)segue {
}
// Swift
@IBAction func unwindToContainerVC(segue: UIStoryboardSegue) {
}
2)在源视图控制器(您要从中选择的控制器)上,⌃ + 从“活动名称”拖动以退出。您应该会在弹出窗口中看到在步骤 1 中创建的展开转场。 (如果您没有看到,请查看第一步)。从弹出窗口中选择 unwindToContainerVC: 或任何您命名的方法,以将源控制器连接到展开 IBAction。
https://i.stack.imgur.com/CJSxx.png
3)在故事板的源视图控制器的文档大纲中选择segue(它将在底部附近列出),并给它一个标识符。
https://i.stack.imgur.com/c3vvp.png
4) 使用此方法从源视图控制器调用展开转场,替换您的展开转场名称。
// 目标 C
[self performSegueWithIdentifier:@"unwindToContainerVC" sender:self];
// 斯威夫特
self.performSegueWithIdentifier("unwindToContainerVC", sender: self)
注意。使用 unwind 方法上 segue 参数的 sourceViewController 属性来访问源控制器上的任何公开属性。另外,请注意框架处理解除源控制器。如果您想确认这一点,请向源控制器添加一个 dealloc 方法,其中包含一条日志消息,一旦它被杀死就应该触发。如果 dealloc 没有触发,您可能有一个保留周期。
(IBAction)unwindToContainerVC:(UIStoryboardSegue *)segue
ViewController
到 Exit
的 ctrl+drag
的图片非常有用。谢谢!
bradleygriffith
的回答很棒。为了简化,我采取了第 10 步并制作了屏幕截图。这是 Xcode 6 中的屏幕截图。
按住 Control 从橙色图标拖动到红色的退出图标以创建一个展开,视图中没有任何操作/按钮。
https://i.stack.imgur.com/idX9l.png
然后在侧边栏中选择 unwind segue:
https://i.stack.imgur.com/NBxT5.png
设置一个 Segue Identifier 字符串:
https://i.stack.imgur.com/OLbL5.png
从代码访问该标识符:
[self performSegueWithIdentifier:@"unwindIdentifier" sender:self];
UIViewController
中。然后您的解决方案将起作用
我使用了 [self dismissViewControllerAnimated: YES completion: nil];
,它会将您返回到调用 ViewController
。
引用 Apple 关于 Unwind Segue 的技术说明中的文字:要添加只能以编程方式触发的展开 segue,请从场景的视图控制器图标中控制并拖动到其退出图标,然后从弹出菜单中为新的 segue 选择一个展开动作。
Vishal Chaudhry 上面的回答对我有用。我还要补充一点,以便使用以下方法手动触发序列:
[self performSegueWithIdentifier:@"mySegueName" sender:self];
在 ViewController 中,您还必须在情节提要中的 ViewController 场景下选择展开转场,并在 RHS 的属性视图中确保 Indentifier 字段包含您在代码中引用的名称(上例中的“mySegueName” )。
如果省略这一步,上面的行将抛出一个序列名称未知的异常。
斯威夫特 4.2,Xcode 10+
对于那些想知道如何使用未通过情节提要设置的 VC 来做到这一点的人(那些通过搜索“以编程方式”+“展开转场”来解决这个问题的人)。
鉴于您无法以编程方式设置展开转场,最简单的纯编程解决方案是调用:
navigationController?.popToRootViewController(animated: true)
这会将堆栈上的所有视图控制器弹出回您的根视图控制器。
要从导航堆栈中弹出最顶层的视图控制器,请使用:
navigationController?.popViewController(animated: true)
向后兼容的解决方案适用于 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;
}
}
}
斯威夫特 4:
1.创建一个@IBAction,在你想放松的控制器内使用segue:
@IBAction func unwindToVC(segue: UIStoryboardSegue) {
}
2. 在情节提要中,从您想要从控制器符号中切换(展开)的控制器中按 ctrl+从控制器符号拖动到退出符号并选择您之前创建的方法:
https://i.stack.imgur.com/GFK4L.png
3. 现在您可以注意到在文档大纲中您有标题为“Unwind segue...”的新行。现在你应该点击这一行并打开属性检查器来设置标识符(在我的例子中是 unwindSegueIdentifier)。
https://i.stack.imgur.com/edUhH.png
4. 你快完成了!现在您需要打开您希望从中放松的视图控制器并创建一些将执行 segue 的方法。例如,您可以添加按钮,使用 @IBAction 将其与代码连接,然后在此 IBAction 中添加 perfromSegue(withIdentifier:sender:) 方法:
@IBAction func unwindToSomeVCWithSegue(_ sender: UIButton) {
performSegue(withIdentifier: "unwindSegueIdentifier", sender: nil)
}
所以这就是你所要做的!
仅供参考:为了使@Vadim 的答案与从视图控制器中调用的手动展开序列操作一起工作,您必须放置命令:
[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 的 segue