2014-07-15 72 views
2

我有基於標籤欄的應用程序(iOS 7.1 SDK)。當用戶第一次啓動應用程序時,我想顯示一些登錄屏幕。我決定使用視圖控制器包容(這稱爲標籤欄控制器的第一視圖控制器):添加子視圖到UITabBarController不能調用viewWillAppear

LoginViewController *vc = [LoginViewController new]; 
[self.tabBarController addChildViewController:vc]; 
[vc didMoveToParentViewController:self.tabBarController]; 
[self.tabBarController.view addSubview:vc.view]; 

但也有一些問題。視圖通常是可見的,但在LoginViewController中viewWillAppear和viewDidAppear從不會被調用。我嘗試在所有視圖生命週期方法(viewDidLoad,viewWillAppear,viewDidAppear)中使用這段代碼,但沒有運氣。我知道還有其他一些方法可以實現我想要做的事情。例如,將子控制器添加到標籤欄控制器的第一個視圖控制器並隱藏標籤欄,這很好地工作,viewWillAppear和viewDidAppear通常被調用。但正因爲如此,我更加好奇 - 爲什麼將子視圖控制器添加到標籤欄控制器不能按預期工作?

+0

您需要呈現或推動視圖控制器才能調用方法。只是將視圖添加爲子視圖將不起作用。 – ZeMoon

回答

0

您需要呈現或推送視圖控制器才能調用方法。只是將視圖添加爲子視圖將不起作用。

就你而言,你可以顯式調用viewWillAppear,viewDidAppear方法。

LoginViewController *vc = [LoginViewController new]; 
[self.tabBarController addChildViewController:vc]; 
[vc didMoveToParentViewController:self.tabBarController]; 
[self.tabBarController.view addSubview:vc.view]; 

[vc viewWillAppear]; 
[vc viewDidAppear]; 
+1

感謝您的回答。但我認爲明確調用這些方法並不是很好的解決方案。應該在使用視圖控制器遏制時自動調用它們,對嗎?正如我所說的,當我在標籤欄控制器中的視圖控制器之一的普通視圖控制器中使用我的代碼時,一切都按預期工作。我只有在嘗試將子視圖控制器直接添加到標籤欄控制器時才遇到問題。 – lukasMT

+0

將viewController的視圖直接添加到另一個視圖也不是一個好的實現。當你使用這樣的系統時,你將不得不使用像這樣的解決方法。如果你想讓這些方法自己調用,你需要正確地呈現它。 – ZeMoon

-2

它的工作!

dispatch_async(dispatch_get_main_queue(), ^{ 
     [self.tabBarController setSelectedIndex:0]; 
     [self.tabBarController setSelectedIndex:1]; 
     [self.tabBarController setSelectedIndex:0]; 
    }); 
相關問題