2013-02-06 61 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