2013-02-06 55 views
3

我有一个基于菜单的导航。该菜单是一个tableView。每当用户按下该表中的一个条目时,我想切换到另一个视图控制器,并且如果有推送的任何视图,我想首先清理导航堆栈。等到popToRootViewControllerAnimated:YES动画完成

这是我在做什么

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

    [(UINavigationController *)self.tabBar.selectedViewController popToRootViewControllerAnimated:YES]; 


    self.tabBar.selectedIndex = indexPath.row; 

} 

self.tabBar.selectedIndex = indexPath.row; 

不要让popToRoot动画完成。有什么方法可以知道动画何时完成?

感谢

回答

5

在RootViewController的,当你RootViewController的调用- (void)viewDidAppear:(BOOL)animated这意味着动画完成。

您可以在rootViewControllers代码- (void)viewDidAppear:(BOOL)animated

如果你想在你目前的ViewController必须代码,我认为它有2种方式:

在RootViewController的一个1.新增delegate,当调用- (void)viewDidAppear:(BOOL)animated使用delegate发送消息

2.在调用- (void)viewDidAppear:(BOOL)animated发布通知时在rootViewController中添加通知。并且在您当前的ViewController中,您可以收到通知

1

接受的答案的委托或通知方法工作正常,但是我发现此方法更方便,因为它不会将任何逻辑传递到仅作为中间目标的根视图控制器的过渡。

您可以使用Core Animation事务。这样你就拥有了导航控制器不提供的完成块。

我捕捉tabbarcontroller变量之前的块becouse,如果我们不tabbarcontroller将无为块。它不会产生任何的保留周期becouse块结束,消失

[CATransaction begin]; 
UITabBarController *tabController = self.navigationController.tabBarController; 
[CATransaction setCompletionBlock:^{ 
    tabController.selectedIndex = 2; 
}]; 

[self.navigationController popToRootViewControllerAnimated:YES]; 

[CATransaction commit]; 

答案是从里斯Kluivers复制回答这里Completion block for popViewController和它的工作非常适合我

+1

这是不可预知的,我 - 当我推了该块多以后执行新视图控制器 – diachedelic

+0

块应该在CATransaction结束时执行,并且除rootViewController之外的所有控制器都会弹出。你可以尝试另一种转变吗?例如使用[self.navigationController popViewControllerAnimated:YES];而不是popToRootViewControllerAnimated,或尝试没有动画。 – buttcmd