如何以编程方式执行Unwind segue?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何以编程方式执行Unwind segue?相关的知识,希望对你有一定的参考价值。
使用故事板这很容易。您只需将操作拖动到“退出”即可。但是我该如何从我的代码中调用它呢?
- 创建手动segue(从文件所有者按Ctrl键拖动到退出),
- 在绿色EXIT按钮下方的左控制器菜单中选择它。
插入Segue名称以放松。
然后,- (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender.
与您的segue识别。
SWIFT 4:
1.在想要放松的控制器内创建一个带有segue的@IBAction:
@IBAction func unwindToVC(segue: UIStoryboardSegue) {
}
2.在故事板中,从控制器中你想要从控制器中删除(展开)+从控制器符号拖动到退出符号并选择之前创建的方法:
3.现在你可以注意到在文档大纲中你有一个标题为“Unwind segue ....”的新行。现在,您应该单击此行并打开属性检查器以设置标识符(在我的示例中为unwindSegueIdentifier)。
你差不多完成了!现在您需要打开要放松的视图控制器并创建一些将执行segue的方法。例如,您可以添加按钮,使用@IBAction将其与代码连接,之后在此IBAction中添加perfromSegue(withIdentifier:sender :)方法:
@IBAction func unwindToSomeVCWithSegue(_ sender: UIButton) {
performSegue(withIdentifier: "unwindSegueIdentifier", sender: nil)
}
这就是你要做的一切!
这是Objective C和Swift的完整答案:
1)在目标视图控制器中创建一个IBAction
展开segue(您想要转到的位置)。实施文件中的任何位置。
// Objective C
- (IBAction)unwindToContainerVC:(UIStoryboardSegue *)segue {
}
// Swift
@IBAction func unwindToContainerVC(segue: UIStoryboardSegue) {
}
2)在源视图控制器(您正在调整的控制器)上,^ +从“活动名称”拖动到退出。您应该在弹出窗口中看到步骤1中创建的展开segue。 (如果您没有看到它,请查看第一步)。选择unwindToContainerVC:从弹出窗口或您命名方法的任何内容,将源控制器连接到展开IBAction。
3)在源视图控制器的故事板的文档大纲中选择segue(它将在底部附近列出),并为其指定标识符。
4)从源视图控制器使用此方法调用unwind segue,替换unwind segue名称。
//目标C.
[self performSegueWithIdentifier:@"unwindToContainerVC" sender:self];
//斯威夫特
self.performSegueWithIdentifier("unwindToContainerVC", sender: self)
NB。在unwind方法上使用segue参数的sourceViewController属性来访问源控制器上的任何公开属性。另外,请注意框架处理解雇源控制器。如果您想确认这一点,请向源控制器添加一个dealloc方法,并使用一条日志消息,该消息一旦被杀死就应该触发。如果dealloc不起火你可能有一个保留周期。
bradleygriffith
的答案很棒。我采取了步骤10,并进行了简化截图。这是Xcode 6中的屏幕截图。
简单控制 - 从橙色图标拖动到红色“退出”图标,以在视图中创建一个没有任何操作/按钮的展开。
然后选择unwind segue
并设置一些标识符以从代码中访问它。
在代码中,
[self performSegueWithIdentifier:@"unwindIdentifier" sender:self];
我使用[self dismissViewControllerAnimated: YES completion: nil];
,它会让你回到调用ViewController
。
从Apple关于Unwind Segue的技术说明中引用文本:要添加仅以编程方式触发的展开segue,控制+从场景的视图控制器图标拖动到其退出图标,然后从弹出菜单中选择新segue的展开动作。
Vishal Chaudhry上面的回答对我有用。我还要补充一点,以便使用以下方法手动触发seque:
[self performSegueWithIdentifier:@"mySegueName" sender:self];
在ViewController中你还必须在故事板中的ViewController的Scene下选择unwind segue,并在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.2,Xcode 10+
对于那些想知道如何使用未通过故事板设置VC的人来说(那些来自搜索“`programmatically”+“unwind segue”的问题)。
鉴于您无法以编程方式设置展开segue,最简单的程序化解决方案是调用:
navigationController?.popToRootViewController(animated: true)
这会将堆栈中的所有视图控制器弹回到根视图控制器。
仅供参考:为了让@Vadim回答使用从View Controller中调用的手动展开segue操作,您必须放置命令:
[self performSegueWithIdentifier:(NSString*) identifier sender:(id) sender];
在override的类方法viewDidAppear中,如下所示:
-(void) viewDidAppear:(BOOL) animated
{
[super viewDidAppear: animated];
[self performSegueWithIdentifier:@"SomeSegueIdentifier" sender:self];
}
如果将它放在viewDidLoad或viewWillAppear等其他ViewController方法中,它将被忽略。
以上是关于如何以编程方式执行Unwind segue?的主要内容,如果未能解决你的问题,请参考以下文章