【问题标题】:Unwind Segue Programmatically - New twist以编程方式展开 Segue - 新的转折
【发布时间】: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 中的多个按钮时,我想以编程方式“在代码内部”执行此操作。

有什么想法吗?

【问题讨论】:

    标签: ios cocoa-touch segue


    【解决方案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 我指的是这种技术:stackoverflow.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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-07-01
        • 2015-08-19
        • 2017-05-07
        • 2011-07-06
        • 2014-12-18
        • 1970-01-01
        相关资源
        最近更新 更多