在segue完成后如何执行一些代码?

32

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

5个回答

20

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

– navigationController:didShowViewController:animated:

没有我想象中的那么糟。self.navigationController = self; 并添加该方法。我根据 Segue ID 将控制器保存到本地变量中,然后将这些值与传递的 ViewController 进行比较。 - Brian White
9
这将适用于起始视图控制器具有导航控制器的推送跳转,但在模态跳转的情况下该怎么办? - Drux
1
我使用了Levi的自定义Segue答案,并像这里的示例(https://dev59.com/KWEi5IYBdhLWcg3wCYKY#23778394)一样实现了我的`perform`。这非常好用,我知道推送何时完成并可以使用segues。 - Mac_Cain13
足够正确,但对我没有用,因为我正在使用自定义的父视图控制器,而不是导航控制器。 - Ash
1
如果您正在使用iOS9,则可以尝试此答案来执行代码,以完成块在Segue完成其“perform()”之后。https://dev59.com/6V4c5IYBdhLWcg3w1dLx#37602422 - wyu

15

如果您不想使用viewDidAppear:方法,您可以创建自定义的segue。在perform方法中,您可以为过渡使用动画,这可以有一个完成块。您可以在动画完成后在那里添加代码。


所以在Storyboard中使用标准的拖放转场是不可能的吗? - bogen
2
这是你创建它的方式,但你必须子类化UIStoryboardSegue并在其中实现perform方法。之后,在storyboard中将segue的类设置为刚刚创建的类。 - Levi

8
在Swift中,从UIViewController子类中,您可以获取UINavigationController实例并设置委托,以便在segue完成时得到通知,如下所示。跟踪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 完成时显示,就像在被呈现的 VC 中的 viewWillAppear()viewDidAppear() 委托方法一样;但是,它们并不会通知目标 VC 何时被取消呈现。而且,仅当您的视图控制器是导航控制器堆栈的一部分时,它才能正常工作。
在您正在跟踪的 VC 中,您可以添加以下内容来检测何时释放了 VC(以及其内存),或覆盖 viewWillDisappear() 方法。
deinit {
    println(__FUNCTION__, "\(self)")
}

-10

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

这个方法会在源UIViewController中的segue执行之前被调用。如果你想在目标UIViewController中做一些代码,你可以获取segue的目标视图控制器。

你也可以将这段代码添加到目标视图控制器的viewdidAppear中。


-11

在 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
但这并没有真正表示转场动画何时完成 - 这发生在转场动画开始时。 - Sam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接