在 iOS 6 中是否可以知道 a 何时UIStoryboardSegue
完成转换?就像我在导航控制器上添加一个UIStoryboardSegue
从 UIButton
推送另一个一样UIViewController
,我想在推送转换完成后立即执行某些操作。
5 回答
您可以使用UINavigationControllerDelegate
协议,然后定义:
– navigationController:didShowViewController:animated:
如果您不想使用该viewDidAppear:
方法,则可以创建自定义 segue。在该perform
方法中,您将使用动画进行过渡,并且可以有一个完成块。动画完成后,您可以在此处添加代码。
在 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)")
}
您可以使用 - (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 正在通过那里。所以你可以在目标控制器中编写一个方法并在这里调用它