32

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

4

5 回答 5

20

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

– navigationController:didShowViewController:animated:
于 2013-08-19T09:54:48.113 回答
15

如果您不想使用该viewDidAppear:方法,则可以创建自定义 segue。在该perform方法中,您将使用动画进行过渡,并且可以有一个完成块。动画完成后,您可以在此处添加代码。

于 2013-08-19T09:28:04.373 回答
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 的 segue 完成时向您显示,就像正在呈现的 VC 中的委托方法viewWillAppear()一样;viewDidAppear()但是,他们不会告知目标 VC 何时呈现。它也仅在您的视图控制器是导航控制器堆栈的一部分时才有效。

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

deinit {
    println(__FUNCTION__, "\(self)")
}
于 2015-01-28T15:30:43.180 回答
-10

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

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

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

于 2013-08-19T09:31:13.720 回答
-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 正在通过那里。所以你可以在目标控制器中编写一个方法并在这里调用它

于 2013-08-19T09:31:19.337 回答