簡體   English   中英

viewwillappear和viewdidappear沒有被調用

[英]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];
}

我曾嘗試這個這個 ,但徒勞無功。

  1. 在推送BViewController調用viewDidLoad ,但是沒有調用viewWillAppearviewDidAppear 以下是我的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 } 
  2. 這不常見。 有時候我會得到這種情況,直到我從后台關閉應用程序並重新啟動它。 但有時它工作得很好。 我只是將我的視圖控制器推到nab堆棧。

  3. 正如我在評論中提到的,它是標簽欄控制器中的常規導航控制器。

你如何定義AViewControllerBViewController 通常你會使用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討論。

更新:

鑒於您的反饋,我有幾點想法:

  1. 不用說,問題顯然與上述代碼無關。 您需要擴大搜索范圍並向我們展示更多代碼。 或許告訴我們你的viewDidLoad of B?

  2. 通常,當您沒有獲得這些類型的事件時,這是因為視圖控制器層次結構與視圖層次結構不同步。 人們這樣做的最常見方式是,如果他們在某些時候做過“ [addSubview someNewController.view] ”這樣的事情。 如果您在任何上下文中使用視圖控制器,或者(a)您的應用程序委托的初始配置; (b) presentViewController (或dismiss); 或者(c) pushViewController (或pop),然后你可能想要分享你所做的事情。

  3. 正如andreamazz指出的那樣,你的評論“我的導航控制器位於標簽欄控制器的視圖控制器內部”,如果按字面意思讀取它會有點令人不安。 您可以將導航欄放在視圖控制器的視圖中,但是您不能將導航控制器放在視圖控制器中(除非您正在進行視圖控制器包含,這是一個完全不同的野獸)。 同樣令人擔憂的是,在你的另一個問題中,你說過,“在UIViewController中嵌入一個UINavigationController或UITabBarController(我的情況)會以某種方式中斷這些方法的調用。” 事實上,你沒有在其他視圖控制器中嵌入導航控制器(除非它本身就是一個容器控制器,如標簽視圖控制器),而是反過來。 但是,如果你的字面意思是你有一個包含導航控制器的控制器,你必須向我們展示你是如何做到的(正確的視圖控制器包含?),因為這是非常不尋常的。

  4. 這是不尋常的,但我已經讓項目被破壞,最終陷入了奇怪的狀態。 至少,我可能會建議“產品” - “清潔”並重建。 如果問題仍然存在,並且您已將問題隔離到B的NIB,則暫時重命名它並從頭開始構建一個快速且臟的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM