2013-06-25 34 views
0

我遇到了問題。爲什麼iOS6在viewdidload之前調用私有方法?

當我初始化控制器時,我使用initwithnib:bundle:方法,然後我認爲這個控制器已經加載到內存中。所以我打電話給它的方法selectUnreadMessage來改變它的頭。但我發現viewdidload是在selectUnreadMessage之後調用的。

有人可以告訴我爲什麼?謝謝。

- (void)selectUnreadSegmentedHeaderButton { 

    if ([YDNetworkingManager sharedNetworkingManager].badgeNumbers.count) { 

     for (NSNumber *unreadMessagesCount in [YDNetworkingManager sharedNetworkingManager].badgeNumbers) { 
      if (unreadMessagesCount.intValue > 0) { 
       NSInteger index = [[YDNetworkingManager sharedNetworkingManager].badgeNumbers indexOfObject:unreadMessagesCount]; 
       self.segmentedHeader.selectedIndex = index; 
       [self loadTableViewAtIndex:index]; 
       break; 
      } 
     } 
    } 
} 

我的私人方法的代碼在上面。該控制器具有用於在不同類型的消息之間切換的屬性SegmentedHeader。

該方法被稱爲在使用此方法作爲addSubView的Controller之後;

+2

除非你能解釋自己比這更好。但請記住,視圖是在第一次引用它時創建的。如果selectUnreadMessage引用視圖,則會導致它加載。 –

+0

但是當我調用initwithnib:bundle:方法時,我引用了Controller的權利? –

+0

initWithNib引用控制器,但不引用視圖。 –

回答

0

viewDidLoad當Controller的視圖準備將addSubView轉換爲另一個視圖時調用該方法。當添加控制器的視圖時,將調用viewWillAppearviewDidAppear。如果控制器的視圖從超級視圖中移除,則將調用viewWillDisAppearviewDidDisAppear

並再次添加控制器視圖,viewDidLoad不調用被調用。其他方法會像我所說的那樣調用。

這意味着當您初始化控制器時,viewDidLoad未立即調用。這個方法稍後會被調用。這是延期加載

希望它有用!

+0

謝謝,但你能告訴我爲什麼我定義的方法可以在ViewDidLoad之前調用嗎?所以當名爲「selectUnreadMessage」的方法被調用導致iOS調用ViewDidLoad? –

+0

如果你不調用你的私有方法,調用了'viewDidLoad'嗎? 'viewDidLoad'只有在你的Controller的視圖可見時才被調用。你可以顯示你的私人方法的代碼? – VietHung

+0

好的,我粘貼上面的私人方法代碼。 –

0

ViewController初始化不會創建視圖 - viewcontroller的視圖是懶惰地加載的 - 當它的視圖實際上被添加到視圖層次結構中時。因此,當您訪問viewcontroller的.view屬性時,調用-viewDidLoad方法 - 因此,您可以考慮初始化init方法中的數據結構(獲取數據,分配容器,設置默認值等),之後在調用-viewDidLoad時應用您數據到您的意見/用戶界面。

相關問題