【问题标题】:What is the difference between loadView and viewDidLoad?loadView 和 viewDidLoad 有什么区别?
【发布时间】:2011-03-26 07:48:31
【问题描述】:

我知道这里有一个看似完全相同的问题:iPhone SDK: what is the difference between loadView and viewDidLoad? 但是,我已阅读该问题,但仍未完全回答。 我没有使用 IB,因为 UI 是动态的。

所以我应该创建self.view,然后在loadView 中添加子视图,

还是应该在loadView 中创建self.view 并在viewDidLoad 中添加子视图?

【问题讨论】:

    标签: iphone objective-c


    【解决方案1】:

    当您从 NIB 加载视图并希望在启动后执行进一步自定义时,请使用 viewDidLoad。

    如果您想以编程方式创建视图(不使用 Interface Builder),请使用 loadView。

    【讨论】:

    • 你们给出的答案略有不同,所以我认为没有 100% 确定的答案?
    • 不,以上答案是正确的。使用加载视图。仅当您需要对使用 IB 构建的 NIB 文件生成的视图进行一些处理时,才使用 viewDidLoad。
    • 理论上你可以说每个都可以在每种情况下工作。但是,我概述的用法是根据 Apple 的文档。
    • Apple 的文档似乎说了两件事,看看 vodkhang 的回答。 (事实上​​,通过苹果的文档,它实际上在同一页面上说了 2 个不同的东西!)
    • 不,他们没有,他是断章取义。
    【解决方案2】:

    对于您的具体问题,您应该在 viewDidLoad 中添加子视图。因为,如果你覆盖了 loadView,你必须完成所有的工作,加载所有的视图。

    这里是Apple's documentation的解释:

    加载周期中发生的步骤如下:

    1.

      * Some part of your application asks for the view in the view
    

    控制器的视图属性。

    2.

      * If the view is not currently in memory, the view controller calls its loadView
    

    方法。

    3.

      * The loadView method does one of the following:
    
            If you override this method, your implementation is
    

    负责创建所有 必要的意见和分配 视图属性的非零值。

            If you do not override this method, the default implementation uses 
    

    视图控制器的 nibName 和 nibBundle 属性来尝试加载视图 从指定的 nib 文件。如果 没有找到指定的 nib 文件,它 查找名称为 nib 的文件 匹配视图的名称 控制器类并加载该文件。

            If no nib file is available, the method creates an empty UIView object 
    

    并将其分配给视图属性。

    4.

      * The view controller calls its viewDidLoad method to perform any
    

    额外的加载时间任务。

    【讨论】:

      【解决方案3】:

      其实很简单。如果你在没有 IB 的情况下这样做,那么你的 UIViewController 的 view 属性是空的。所以在 loadView 设置它!

      我只在 loadView 上设置视图,没有别的。

      除此之外,在 viewDidLoad 中执行所有操作。举个例子:

      - (void)loadView {
          CGRect frame = [[UIScreen mainScreen] applicationFrame];
          baseView = [[UIView alloc] initWithFrame:frame];
          [self setView:baseView];
          [baseView release];
      }
      

      就是这样!我做完。并且永远不想添加更多。然后在 viewDidLoad,我添加所有我想要的子视图。

      - (void)viewDidLoad {
          [super viewDidLoad];
      
          msg = [[UILabel alloc] initWithFrame:CGRectMake(0, 200, 320, 50)];
          [msg setText:@"Your profile is empty!"];
          [[self view] addSubview:msg]; // hey, I have done my view at loadView, so I have it now
          [msg release];
      }
      

      我的理解可能是错误的:)

      【讨论】:

        【解决方案4】:

        loadView 是实际设置视图的方法(设置所有的 outlet,包括 self.view)。

        viewDidLoad 你可以通过它的名字找出来。这是一个在视图加载后调用的委托方法(所有插座都已设置),它只是通知控制器它现在可以开始使用插座了。

        viewDidLoad: “在视图控制器将其关联视图加载到内存后调用此方法。无论视图是存储在 nib 文件中还是在 loadView 方法中以编程方式创建,都会调用此方法。”

        加载视图: “如果您手动创建视图,则必须覆盖此方法并使用它来创建视图。”

        【讨论】:

          【解决方案5】:

          在 viewDidLoad 中添加子视图。这样,您就可以 100% 确定视图确实已加载并准备好使用。

          【讨论】:

            【解决方案6】:

            使用viewDidLoad 初始化视图和控件。如果您没有 Nib/Xib 并且希望您的 ViewController 具有自定义(不是 UIView)视图,请使用 loadView

            【讨论】:

              【解决方案7】:

              仅当您想自己创建视图时才使用 loadView。

              在使用 interface builder 或 init 和 nib 后不要使用 loadView,因为这些操作已经在底层实现中调用了 loadView。

              另外,当使用 loadView 时,在进行任何其他设置之前先分配视图:

                  -(void)loadView {
                     [super loadView];
                     // if you do any things here before assigning a view
                     // it will try to get a view first by calling loadView()
                     // and ends up with a crash since a dead loop.          
                     self.view = ...;//assign your view here
                     //do other settings
                  }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2010-10-09
                • 2023-03-25
                • 2011-07-07
                • 1970-01-01
                • 1970-01-01
                • 2012-06-13
                相关资源
                最近更新 更多