以编程方式展开 Segue - 新的转折
Posted
技术标签:
【中文标题】以编程方式展开 Segue - 新的转折【英文标题】:Unwind Segue Programmatically - New twist 【发布时间】:2013-07-23 20:44:22 【问题描述】:上下文:我有两个 VC,A 和 B。VC A 包含几个按钮和几个标签。当按下 VC A 中的按钮时,segue 将显示 VC B/C/ 等等。现在,当用 VC A/B/C 等结束时,segue 正在展开,以便 VC A 出现。对于大多数 VC B/C/D 等,我使用的是通过该 VC 中的按钮触发的展开方法(ctrl + 拖动到“退出”图标)。这很完美,因为在返回到 VC A 时,会自动调用以下操作:
- (IBAction)returned:(UIStoryboardSegue *)segue
// Here I do some stuff
问题:现在,在一个二级 VC(例如 D)中,事情有点特别。在这个 VC 中,我以编程方式通过循环生成数百个按钮,然后检测哪个按钮被按下,最后展开回 VC A(没有特定按钮;任何按钮都会触发展开)。我知道我可以做到这一点,例如使用这个
[self dismissViewControllerAnimated: YES completion: nil]
但这在返回VC A时不会触发上述动作,或者通过使用这个
[self performSegueWithIdentifier:@"UnwindSegueIdentifier" sender:self]
但这会生成一个新的 VC A 实例,这是我不想要的(因为 VC A 实例中的标签已经包含一些信息)。
所以,我想要的是能够返回到生成 VC D 的同一 VC A 实例,并触发上面列出的“返回”操作。因此,我想达到与使用连接到“退出”图标的按钮时相同的效果,但是当按下 VC D 中的多个按钮时,我想以编程方式“在代码内部”执行此操作。
有什么想法吗?
【问题讨论】:
【参考方案1】:[self performSegueWithIdentifier:@"UnwindSegueIdentifier" sender:self]
应该可以正常工作。 Unwind segues 不会创建其目的地的新实例,无论它们如何执行。它们的独特之处在于它是唯一不创建目标新实例的 segue。
【讨论】:
+1 非常正确。唯一的“技巧”是如何在情节提要中创建展开转场(您必须从场景下方栏中的视图控制器图标拖动到插座图标),但这种技术效果很好。 @Scott - 也许应该,但是我得到了一个新的 VC A 实例,当我单击该实例上的完成按钮时,VC A 在我离开时显示... @Rob - 我不确定我是否跟随你,我通过 ctrl-clicking 从 VC D 中的 vc 图标到 VC A 进行了手动 segue。你所说的“插座图标”是什么意思,你指的是什么VC A 还是 D? @MrEmkei 我指的是这种技术:***.com/a/17607083/1271826。 unwind 动作方法在 A 的视图控制器中定义,而 unwind segue 在 D 的 IB 场景中定义。如果你在 IB 中有一个从 D 的场景画到 A 的场景的转场,那不是展开转场。 @Rob - 感谢您抽出宝贵时间,是的,链接中描述的方式确实有效,只要不创建 VC A 的新实例。但是,“返回”操作首先出现在我的问题中不叫,我已经测试过了。我不知道为什么,当从按钮到“退出”(我刚刚测试过)做同样的事情时,它会被调用......所以我的主要问题仍然是,当以编程方式展开时,谁来调用“返回”动作...... 【参考方案2】:您可以通过控制+从场景的视图控制器图标拖动到其退出图标以编程方式使用来创建 unwindsegue。在为这个 unwindseque 分配一个标识符后,您可以通过编程方式调用它。
参考: https://developer.apple.com/library/ios/technotes/tn2298/_index.html
【讨论】:
【参考方案3】:Ulas 正确理解并回答了这个问题。原始发布者希望确保在展开时调用展开“(IBAction)myCustomName:(UIStoryboardSegue*)segue”选择器,而不必“手动”将按钮链接到展开转场。为了强调这一点,假设您在运行时根据某些条件以编程方式创建一个按钮。您无法手动将该按钮连接到展开转场。你需要在 VC B 中做这样的事情......
UIBarButtonItem *dynamicButton = [[UIBarButtonItem alloc]
initWithTitle:@"Cool"
style:UIBarButtonItemStyleBordered
target:self
action:@selector(killView)];
self.navigationItem.leftBarButtonItem = dynamicButton;
- (void) killView
[self performSegueWithIdentifier:@"TEST" sender:self];
'TEST' segue 是从 VC B 到 Exit 手动建立的(即视图控制器本身不是按钮)。当按钮被点击时,它会调用 killView 方法,并通过标识符触发 segue。
【讨论】:
以上是关于以编程方式展开 Segue - 新的转折的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Storyboard 上创建 Segue,从以编程方式注册的 UICollectionViewCell 到新的 UIViewController?