2013-06-25 127 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时应用您数据到您的意见/用户界面。

相关问题