[英]viewwillappear and viewdidappear not called
這個問題非常頻繁,但我無法用任何可用的答案解決它。
我正在使用iOS 5.1。 我的導航控制器是標簽欄視圖控制器中的一個選項卡。 有一個tableview,其中選擇一行推動新的視圖控制器。
僅在選擇第二行時才會出現此問題。 這不常見。 推送視圖為空白 - 未調用viewWillAppear
/ viewDidAppear
。 單擊導航欄的后退按鈕 - 根視圖的viewWillAppear
/ viewDidAppear
也未被調用,使其為空白。
我正以完全相同的方式推動選擇第一行/第二行的視圖。 但問題只發生在第二行。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
switch (indexPath.row) {
case 0:
AViewController *aObj = [[AViewController alloc] init];
aObj.homeObj = self;
[self.navigationController pushViewController:aObj animated:YES];
[aObj release];
break;
case 1:
BViewController *bVCObj = [[BViewController alloc] init];
bVCObj.homeObj = self;
[self.navigationController pushViewController:bVCObj animated:YES];
[bVCObj release];
break;
default:
break;
}
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
在推送BViewController
調用viewDidLoad
,但是沒有調用viewWillAppear
和viewDidAppear
。 以下是我的viewDidLoad
:
- (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor blackColor]; NSLog(@"nav stack: %@", [self.navigationController viewControllers]); NSLog(@"nav stack: %@", [[self.navigationController visibleViewController] description]); //some initialization and call of methods }
這不常見。 有時候我會得到這種情況,直到我從后台關閉應用程序並重新啟動它。 但有時它工作得很好。 我只是將我的視圖控制器推到nab堆棧。
正如我在評論中提到的,它是標簽欄控制器中的常規導航控制器。
你如何定義AViewController
和BViewController
? 通常你會使用initWithNibName
,例如
AViewController *aObj = [[AViewController alloc] initWithNibName:@"mynibname" bundle:nil]`
正如Carl指出的那樣,你可以顯然只使用init
(雖然我沒有在UIViewController
類參考中看到這一點),但系統將非常特別地關於你的NIB文件的名稱。 但是文檔確實說,你可以使用initWithNibName
並為NIB名稱傳遞一個nil
,在這種情況下,它會嘗試為你找到它。 就個人而言,如果您的結果不一致,我會嘗試使用initWithNibName
並明確傳遞您的NIB名稱,看看是否能夠糾正這種情況。
或者您是否在兩個控制器中使用loadView
以編程方式構建視圖? 然后你需要向我們展示那些loadView
例程(不要與viewDidLoad
混淆)。
但根據文檔,您需要指定NIB或使用loadView
。 請參閱UIViewController
類參考中的View Management討論。
更新:
鑒於您的反饋,我有幾點想法:
不用說,問題顯然與上述代碼無關。 您需要擴大搜索范圍並向我們展示更多代碼。 或許告訴我們你的viewDidLoad
of B?
通常,當您沒有獲得這些類型的事件時,這是因為視圖控制器層次結構與視圖層次結構不同步。 人們這樣做的最常見方式是,如果他們在某些時候做過“ [addSubview someNewController.view]
”這樣的事情。 如果您在任何上下文中使用視圖控制器,或者(a)您的應用程序委托的初始配置; (b) presentViewController
(或dismiss); 或者(c) pushViewController
(或pop),然后你可能想要分享你所做的事情。
正如andreamazz指出的那樣,你的評論“我的導航控制器位於標簽欄控制器的視圖控制器內部”,如果按字面意思讀取它會有點令人不安。 您可以將導航欄放在視圖控制器的視圖中,但是您不能將導航控制器放在視圖控制器中(除非您正在進行視圖控制器包含,這是一個完全不同的野獸)。 同樣令人擔憂的是,在你的另一個問題中,你說過,“在UIViewController中嵌入一個UINavigationController或UITabBarController(我的情況)會以某種方式中斷這些方法的調用。” 事實上,你沒有在其他視圖控制器中嵌入導航控制器(除非它本身就是一個容器控制器,如標簽視圖控制器),而是反過來。 但是,如果你的字面意思是你有一個包含導航控制器的控制器,你必須向我們展示你是如何做到的(正確的視圖控制器包含?),因為這是非常不尋常的。
這是不尋常的,但我已經讓項目被破壞,最終陷入了奇怪的狀態。 至少,我可能會建議“產品” - “清潔”並重建。 如果問題仍然存在,並且您已將問題隔離到B的NIB,則暫時重命名它並從頭開始構建一個快速且臟的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.