【问题标题】:How to execute some code after a segue is done?segue完成后如何执行一些代码?
【发布时间】:2013-08-21 01:10:27
【问题描述】:

在 iOS 6 中是否可以知道 UIStoryboardSegue 何时完成转换?就像当我从 UIButton 添加一个 UIStoryboardSegue 以在导航控制器上推送另一个 UIViewController 时,我想在推送转换完成后立即执行某些操作。

【问题讨论】:

    标签: ios ios6 uiviewcontroller segue uistoryboardsegue


    【解决方案1】:

    在 Swift 中,您可以从 UIViewController 子类获取 UINavigationController 实例并设置委托,以便获知 segues 的完成情况,如图所示。另一个跟踪 segue 的逻辑位置可能是 AppDelegate

    从视图控制器(简称VC)做的例子:

    class MyViewControllerSubclass : UIViewController, UINavigationControllerDelegate {
    
        func viewDidLoad() {
            self.navigationController.delegate = self
        }
    
        func navigationController(navigationController: UINavigationController, didShowViewController viewController: UIViewController, animated: Bool) {
            println("Did show VC: \(viewController)")
        }
     }
    

    但这只会在 VC 的 segue 完成时向您显示, 就像 VC 中的 viewWillAppear()viewDidAppear() 委托方法一样;但是,他们不会告知目标 VC 何时呈现。它也仅在您的视图控制器是导航控制器堆栈的一部分时才有效。

    在您正在跟踪的 VC 中,您可以添加以下内容来检测 VC(及其内存)何时被释放,或覆盖 viewWillDisappear() 方法。

    deinit {
        println(__FUNCTION__, "\(self)")
    }
    

    【讨论】:

      【解决方案2】:

      你可以使用UINavigationControllerDelegate协议然后定义:

      – navigationController:didShowViewController:animated:
      

      【讨论】:

      • 没有我想象的那么糟糕。 self.navigationController = self; 并添加该方法。我根据 Segue ID 将控制器保存到局部变量中,然后将这些值与传递的 ViewController 进行比较。
      • 这将适用于原始视图控制器具有导航控制器的推送转场,但在模态转场的情况下该怎么办?
      • 我使用了来自 Levi 的自定义 Segue 答案并实现了我的 perform,就像这里的示例一样:stackoverflow.com/a/23778394/586489 这很好用,我知道推送何时完成并且可以使用 segues。
      • 确实如此,但遗憾的是对我没有用,因为我使用的是自定义父视图控制器,而不是导航控制器。
      • 如果您使用的是 iOS9,您可以尝试此答案以在 Segue 完成后在完成块中执行代码perform()stackoverflow.com/a/37602422/1552116
      【解决方案3】:

      您可以在 prepareForSegue 方法中调用目标 UIViewController 的方法。

      -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
      {
        NSLog(@"prepareForSegue: %@", segue.identifier);
      
        if ([segue.identifier isEqualToString:@"Happy"]) {
            [segue.destinationViewController setHappiness:100];
        } else if ([segue.identifier isEqualToString:@"Sad"]) {
            [segue.destinationViewController setHappiness:0];
        }
      }
      

      这里的 setHappiness 方法是目标控制器的,这里 100 正在经过那里。所以你可以在目标控制器中编写一个方法并在这里调用它

      【讨论】:

      • 但这并不能真正表明实际转场何时完成——这发生在转场开始时
      【解决方案4】:

      你可以使用 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

      此方法将在源 UIViewController 中执行 segue 之前立即调用。如果你想在目标 UIViewController 中做一些代码,你可以得到 segue 的目标 viewcontroller。

      您也可以在目标视图控制器的 viewdidAppear 中添加此代码。

      【讨论】:

        【解决方案5】:

        如果您不想使用viewDidAppear: 方法,您可以创建自定义转场。在perform 方法中,您将使用动画进行转换,并且可以有一个完成块。动画完成后可以在里面添加代码。

        【讨论】:

        • 所以在 Storyboard 中使用标准的拖放 segue 是不可能的?
        • 这是你创建它的方式,但你必须继承UIStoryboardSegue 并在其中实现perform 方法。之后,在 storyboard 中,您将 segue 的类设置为您刚刚创建的类。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-08
        • 2014-10-27
        相关资源
        最近更新 更多