【发布时间】:2013-08-21 01:10:27
【问题描述】:
在 iOS 6 中是否可以知道 UIStoryboardSegue 何时完成转换?就像当我从 UIButton 添加一个 UIStoryboardSegue 以在导航控制器上推送另一个 UIViewController 时,我想在推送转换完成后立即执行某些操作。
【问题讨论】:
标签: ios ios6 uiviewcontroller segue uistoryboardsegue
在 iOS 6 中是否可以知道 UIStoryboardSegue 何时完成转换?就像当我从 UIButton 添加一个 UIStoryboardSegue 以在导航控制器上推送另一个 UIViewController 时,我想在推送转换完成后立即执行某些操作。
【问题讨论】:
标签: ios ios6 uiviewcontroller segue uistoryboardsegue
在 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)")
}
【讨论】:
你可以使用UINavigationControllerDelegate协议然后定义:
– navigationController:didShowViewController:animated:
【讨论】:
self.navigationController = self; 并添加该方法。我根据 Segue ID 将控制器保存到局部变量中,然后将这些值与传递的 ViewController 进行比较。
perform,就像这里的示例一样:stackoverflow.com/a/23778394/586489 这很好用,我知道推送何时完成并且可以使用 segues。
perform()stackoverflow.com/a/37602422/1552116
您可以在 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 正在经过那里。所以你可以在目标控制器中编写一个方法并在这里调用它
【讨论】:
你可以使用 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
此方法将在源 UIViewController 中执行 segue 之前立即调用。如果你想在目标 UIViewController 中做一些代码,你可以得到 segue 的目标 viewcontroller。
您也可以在目标视图控制器的 viewdidAppear 中添加此代码。
【讨论】:
如果您不想使用viewDidAppear: 方法,您可以创建自定义转场。在perform 方法中,您将使用动画进行转换,并且可以有一个完成块。动画完成后可以在里面添加代码。
【讨论】:
UIStoryboardSegue 并在其中实现perform 方法。之后,在 storyboard 中,您将 segue 的类设置为您刚刚创建的类。