在iOS 6中,是否有可能知道UIStoryboardSegue
何时完成其转换?例如,当我从UIButton
添加一个UIStoryboardSegue
以将另一个UIViewController
推送到导航控制器上时,我想在推送转换完成后立即执行某些操作。
在iOS 6中,是否有可能知道UIStoryboardSegue
何时完成其转换?例如,当我从UIButton
添加一个UIStoryboardSegue
以将另一个UIViewController
推送到导航控制器上时,我想在推送转换完成后立即执行某些操作。
您可以使用UINavigationControllerDelegate
协议,然后定义:
– navigationController:didShowViewController:animated:
如果您不想使用viewDidAppear:
方法,您可以创建自定义的segue。在perform
方法中,您可以为过渡使用动画,这可以有一个完成块。您可以在动画完成后在那里添加代码。
UIStoryboardSegue
并在其中实现perform
方法。之后,在storyboard
中将segue的类设置为刚刚创建的类。 - LeviUIViewController
子类中,您可以获取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)")
}
}
viewWillAppear()
或 viewDidAppear()
委托方法一样;但是,它们并不会通知目标 VC 何时被取消呈现。而且,仅当您的视图控制器是导航控制器堆栈的一部分时,它才能正常工作。viewWillDisappear()
方法。deinit {
println(__FUNCTION__, "\(self)")
}
你可以使用-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
这个方法会在源UIViewController中的segue执行之前被调用。如果你想在目标UIViewController中做一些代码,你可以获取segue的目标视图控制器。
你也可以将这段代码添加到目标视图控制器的viewdidAppear中。
在 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 的参数。因此,您可以在目标控制器中编写一个方法并在此处调用它。
self.navigationController = self;
并添加该方法。我根据 Segue ID 将控制器保存到本地变量中,然后将这些值与传递的ViewController
进行比较。 - Brian White