4

這個問題非常頻繁,但我無法解決任何可用的答案。viewwillappear和viewdidappear不叫

我正在使用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]; 
} 

我試圖thisthis但不成功。

  1. viewDidLoad被稱爲上推BViewController,然而,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. 正如我在評論中提到的那樣,它是標籤欄控制器中的常規導航控制器。

+0

你是什麼意思'我的導航控制器是在標籤欄控制器的視圖控制器內'。 navcontroller應該是* TabBar視圖控制器之一,您不需要將其包裝在另一個viewController中。 – andreamazz

+1

我的意思是導航控制器作爲標籤欄控制器的一部分。 :) –

回答

0

你是如何定義AViewControllerBViewController您的看法?通常你會使用initWithNibName,例如

AViewController *aObj = [[AViewController alloc] initWithNibName:@"mynibname" bundle:nil]` 

卡爾指出的那樣,你可以明顯只使用init(雖然我沒有看到這個記錄在UIViewController Class Reference),但隨後系統將是非常講究的NIB文件的名稱。不過,文檔確實說,您可以使用initWithNibName並通過nil來獲取NIB名稱,在這種情況下,它會嘗試爲您找到它。就個人而言,如果您的結果不一致,我會嘗試使用initWithNibName並明確傳遞您的NIB的名稱,並查看是否糾正了這種情況。

或者您是否在兩個控制器中以編程方式使用loadView構建視圖?那麼你需要向我們展示那些loadView例程(不要與viewDidLoad混淆)。

但根據文檔,您需要指定您的NIB或使用loadView。請參閱UIViewController類參考中的View Management討論。

更新:

考慮您的意見,我有一對夫婦的想法:

  1. 不用說,這個問題顯然是不涉及到上面的代碼。您需要擴大搜索範圍並向我們展示更多代碼。也許讓我們看看你的B的viewDidLoad

  2. 通常,當您沒有得到這些事件時,這是因爲視圖控制器層次結構與視圖層次結構不同步。人們這樣做的最常見的方式是,如果他們在某個時候做了「[addSubview someNewController.view]」之類的事情。如果您在任何情況下使用視圖控制器,則不是(a)您的應用程序委託的初始配置; (b)presentViewController(或解僱);或(c)pushViewController(或流行),那麼你可能想分享你所做的。

  3. 正如andreamazz指出的那樣,如果用戶直接讀到它,則您的評論「我的導航控制器位於標籤欄控制器的視圖控制器內部」有點令人不安。您可以將導航欄放在視圖控制器視圖中,但不能將導航控制器放在視圖控制器中(除非您正在執行視圖控制器控制,這是一個完全不同的野獸)。同樣關心的是,在另一個問題中,你說,「在UIViewController中嵌入UINavigationController或UITabBarController(我的情況)以某種方式中斷調用這些方法。」問題是,您不會將導航控制器嵌入到其他視圖控制器中(除非它本身就是一個容器控制器,例如選項卡視圖控制器),而不是其他視圖控制器。但是,如果你的字面意思是你有一個包含導航控制器的控制器,那麼你必須告訴我們你是如何做到的(正確的視圖控制器控制?),因爲這非常不尋常。

  4. 這是不尋常的,但我有項目被損壞,結束在奇怪的狀態。至少,我可能會建議「產品」 - 「清潔」並重建。如果問題仍然存在,並且您已將問題隔離到B的NIB,那麼暫時重命名它並從頭開始構建一個快速而骯髒的問題。

+1

'init'方法會調用'initWithNibName:bundle:'傳遞類名稱和主包的nib名稱,如果通過Xcode對話框添加了OP,它們的nib可能與該類名稱相同。因此,如果不實現'loadView',並不是必須提供一個nib名稱。但值得一提的是,OP確實遵循了這一慣例! –

+0

我不知道。我沒有看到'UIViewController'類參考文檔中記載的內容,但我會爲此付諸表示。我知道如果你調用'initWithNibName'並傳遞'nil'作爲nib名字,它將按照你所描述的做,但我不知道'init'也會這樣做。 – Rob

+0

嗯,好吧,很可能它會傳遞nil給initWithNibName:實際上如果initWithNibName的實現需要照顧它。這會讓我覺得更有意義! –

相關問題