Iphone UIViewController的生成过程是什么(哪个方法遵循哪个方法)?

Iphone UIViewController的生成过程是什么(哪个方法遵循哪个方法)?,iphone,uiviewcontroller,Iphone,Uiviewcontroller,有很多方法可以重写,比如initWithNibname:,awakeFromNib,loadView,viewDidLoad,viewdide:,layoutSubviews,我无法决定调用这些方法的顺序 我只是“背诵”了其中一个 任何详细解释?我通常通过在所有这些委托(包括app launch委托)中放置NSLog(或断点)并遵循调试器中的顺序来解决此问题。来自Apple UIViewController文档: 定义UIViewController的新子类时,必须指定要由控制器管理的视图。指定

有很多方法可以重写,比如
initWithNibname:
awakeFromNib
loadView
viewDidLoad
viewdide:
layoutSubviews
,我无法决定调用这些方法的顺序

我只是“背诵”了其中一个


任何详细解释?

我通常通过在所有这些委托(包括app launch委托)中放置NSLog(或断点)并遵循调试器中的顺序来解决此问题。

来自Apple UIViewController文档:

定义UIViewController的新子类时,必须指定要由控制器管理的视图。指定这些视图有两种相互排斥的方式:手动或使用nib文件。如果手动指定视图,则必须实现loadView方法并使用它将根视图对象指定给view属性。如果使用nib文件指定视图,则不得覆盖loadView,而应在Interface Builder中创建nib文件,然后使用initWithNibName:bundle:方法初始化视图控制器对象。使用nib文件创建视图通常更简单,因为您可以使用Interface Builder应用程序以图形方式(而不是以编程方式)创建和配置视图。但是,这两种技术都有相同的最终结果,即创建适当的视图集并通过view属性公开它们

从我的头顶:

  • initWithNibname
  • loadView(手动加载内容)
  • 维维迪洛德
  • 视图显示

  • 不知道layoutSubviews进入了哪里

    在幕后有很多事情要做

    1。viewController对象

    最基本的是,viewController是一个通用的控制器对象。当它第一次被分配一个初始化的视图时,它没有与之关联的视图对象。视图仅在需要时(如果需要)实例化。因此,在不考虑视图的情况下,viewController的生命周期与任何其他对象相同:

    UIViewController * myVC = [[UIViewController alloc] initWith...];
    ...
    [myVC release];
    
    ViewController的指定初始值设定项为。如果指定nib,viewController可以自动从该nib加载其视图,并连接您定义的任何IBOutlet(有关详细信息,请参阅下文)

    2。加载和卸载视图

    viewController将根据需要加载其视图。这通常在第一次调用
    -view
    方法时发生,并且可以在程序中的任何时候发生,具体取决于初始化UI的方式。该视图也可能在程序的生命周期内被销毁和重新加载多次,这取决于您管理UI的方式。当viewController确定其视图是必需的但尚未加载时,将调用
    -loadView
    方法。基本消息流如下所示:

    view
      loadView
      viewDidLoad
    
    -[viewController initWithNibname:Bundle:]
    -[viewController awakeFromNib]
    -[viewController loadView]
    -[view awakeFromNib]
    -[viewController viewDidLoad]
    -[viewController viewWillAppear]
    -[viewController viewDidAppear]
    ...
    -[viewController viewWillDisappear]  // user navigated away
    -[viewController viewDidDisappear]
    ...
    -[viewController viewWillAppear]     // user navigated back
    -[viewController viewDidAppear]
    ...
    -[viewController viewWillDisappear]  // user navigated away
    -[viewController viewDidDisappear]
    ...
    -[viewController setView:nil]        // memory warning, perhaps
    -[viewController viewDidUnload]
    ...
    -[viewController loadView]           // user navigated back
    -[view awakeFromNib]
    -[viewController viewDidLoad]
    -[viewController viewWillAppear]
    -[viewController viewDidAppear]
    ...
    
    请注意,如果覆盖
    -view
    方法,则不会自动调用
    -loadView
    viewDidLoad
    。如果覆盖
    -loadView
    ,则必须设置viewController的
    视图
    属性。否则,下次调用
    -view
    将再次触发加载过程

    只需将
    view
    属性设置为
    nil
    ,即可在程序生命周期内的任何时候卸载视图。
    -didReceiveMemoryWarning
    的默认实现将自动执行此操作,只要视图没有superview(即,如果它当前不是活动视图继承人权限的一部分)。消息流如下所示:

    view = nil
       viewDidUnload
    
    2a。以编程方式加载视图

    如果您选择覆盖
    -loadView
    ,则可以以任何方式创建视图、子视图、其他视图控制器以及这些对象之间的任何连接。当然,这意味着您还负责对所创建的对象进行内存管理。如果您的子类覆盖了
    -loadView
    ,则应使用
    nil
    nibName
    bundle
    进行初始化

    2b。从nib加载视图

    如果使用nib文件,
    -loadView
    的默认实现将自动打开该nib文件,实例化其对象,在它们之间添加任何连接,并为您管理内存

    nib文件的事情变得有点棘手,因为很多事情都发生在幕后。加载nib文件时,会为实例化的每个对象调用
    -awakeFromNib
    方法,并且不能保证nib文件中的其他对象在调用时已完全加载

    3。显示视图

    -viewWillDisplay:
    -viewDidDisplay:
    -viewWillEnglish:
    -viewDidEnglish:
    仅在屏幕上显示或隐藏视图时调用,尤其是在从一个视图到另一个视图的动画转换期间。在程序的生命周期中,这些方法可能会被多次调用,因为视图在导航方案中被交换

    4。查看布局

    -layoutSubviews
    方法不是
    UIViewController
    的一部分。当对象的边界已更改时,将为
    UIView
    对象调用它。如果在程序中使用自定义的
    UIView
    子类,则可以使用此方法进行自定义子视图布局,而不是依赖Cocoa的默认自动调整大小方法

    5。把所有这些放在一起

    由于复杂性,此过程有许多不同的发生方式,但正常的时间线可能如下所示:

    view
      loadView
      viewDidLoad
    
    -[viewController initWithNibname:Bundle:]
    -[viewController awakeFromNib]
    -[viewController loadView]
    -[view awakeFromNib]
    -[viewController viewDidLoad]
    -[viewController viewWillAppear]
    -[viewController viewDidAppear]
    ...
    -[viewController viewWillDisappear]  // user navigated away
    -[viewController viewDidDisappear]
    ...
    -[viewController viewWillAppear]     // user navigated back
    -[viewController viewDidAppear]
    ...
    -[viewController viewWillDisappear]  // user navigated away
    -[viewController viewDidDisappear]
    ...
    -[viewController setView:nil]        // memory warning, perhaps
    -[viewController viewDidUnload]
    ...
    -[viewController loadView]           // user navigated back
    -[view awakeFromNib]
    -[viewController viewDidLoad]
    -[viewController viewWillAppear]
    -[viewController viewDidAppear]
    ...
    

    我要感谢e.詹姆斯的精彩描述。我现在还不能对p发表评论