我的应用程序中有一种情况,我需要通过展开segue来解除模态视图控制器,然后在此之后提供一个不同的模态视图控制器。为此,我只是将调用延迟显示新视图控制器1.0秒。这可能不会一直有效,也许由于某种原因需要更长时间才能解雇,第二个视图控制器因为正在发生转换而无法出现。我刚遇到这种情况,虽然它在这种情况下确实有效。记录了这个:
警告:在演示文稿正在进行时尝试演示!
我正在寻找更好的解决方案。我想知道是否有可能在第一个完全被解除后通过回调抛出新的视图控制器,但是没有performSegueWithIdentifier
有一个完成块。
如何解除模态视图控制器,然后再提出一个新模式,始终确保不会发生冲突?
这是我目前的解决方案:
[self performSegueWithIdentifier:@"Unwind Segue" sender:self]; //dismiss modal or pushed VC
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1.0 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
[tabBarController performSegueWithIdentifier:@"Show New VC" sender:self]; //present new modal VC
});
答案 0 :(得分:11)
我花了一些时间才弄明白这个。 iOS 7引入了transitionCoordinator
,它仅在动画期间出现在UIViewController上。简而言之,您必须在主队列中的另一个线程中注册完成块(在动画开始后将运行该线程)。
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
// ... prepare your for segue
dispatch_async(dispatch_get_main_queue(), ^{
[self.transitionCoordinator animateAlongsideTransition:nil completion:^(id<UIViewControllerTransitionCoordinatorContext> context)
{
// Segue animation complete
}];
});
}
答案 1 :(得分:1)
您还可以使用NSNotificationCenter在新控制器的viewDidAppear函数上添加通知。然后,您将监听器附加到通知,当您看到通知显示时,您将进行下一次转换。
- (void)viewDidLoad {
[[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:@"transitioned to new controller!" object:nil]];
}
在其他地方,只需添加此内容即可收听通知。
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receivedNotification:) name:@"transitioned to new controller!" object:nil];
收到您的通知后,请不要忘记停止收听(除非您希望继续观察),否则您将继续观察整个申请中的所有通知:
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"transitioned to new controller!" object:nil];