137

在 iPhone 应用程序中使用视图和视图控制器时,谁能解释 loadView 和 viewDidLoad 之间的区别?

我个人的情况是,我从代码中构建所有视图,我不会也不会使用 Interface Builder,如果这有什么不同的话。

我发现当我将初始化代码添加到 loadView 时,我经常会得到一个无限的堆栈跟踪,所以我通常会在 viewDidLoad 中构建我所有的子视图......但我真的不清楚每个人何时执行,并且放置初始化代码的更合适的位置是什么。最完美的是初始化调用的简单图表。

谢谢!

4

8 回答 8

200

我可以猜到这里可能是什么问题,因为我已经做到了:

我发现当我将初始化代码添加到 loadView 时,我经常会得到一个无限的堆栈跟踪

不要在 -loadView 中阅读 self.view。设置它,不要得到它。

如果当前未加载视图,则 self.view属性访问器调用-loadView。有你的无限递归。

在 -loadView 中以编程方式构建视图的常用方法,如 Apple 的 pre-Interface-Builder 示例所示,更像是这样:

UIView *view = [[UIView alloc] init...];
...
[view addSubview:whatever];
[view addSubview:whatever2];
...
self.view = view;
[view release];

我不怪你不使用 IB。我对所有 Instapaper 都坚持使用这种方法,并且发现自己比处理 IB 的复杂性、界面怪癖和意想不到的幕后行为更舒服。

于 2009-02-22T03:50:36.227 回答
45

loadViewUIViewController实际加载视图并将其分配给view属性的方法。UIViewController如果您想以编程方式设置view属性,这也是子类将覆盖的位置。

viewDidLoad是加载视图后调用的方法。这是在调用 loadView 之后调用的。这是一个您可以覆盖和插入代码的地方,这些代码在视图加载后会进行进一步的初始设置。

于 2009-02-21T23:56:28.347 回答
14
viewDidLoad()

当您从 NIB 加载视图并希望在启动后执行任何自定义时使用

LoadView()

当您想以编程方式创建视图时使用(不使用 Interface Builder)

于 2013-08-21T09:36:10.390 回答
11

只需添加一些代码示例来演示 NilObject 所说的内容:

- (void)loadView
{
    // create and configure the table view
    myTableView = [[UITableView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame] style:UITableViewStyleGrouped];   
    myTableView.delegate = self;
    myTableView.dataSource = self;
    myTableView.scrollEnabled = NO;
    self.view = myTableView;

    self.view.autoresizesSubviews = YES;
}

- (void)viewDidLoad 
{
  self.title = @"Create group";

  // Right menu bar button is to Save
  UIBarButtonItem *saveButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Save" style:UIBarButtonItemStyleDone target:self action:@selector(save)];
  self.navigationItem.rightBarButtonItem = saveButtonItem;
  [saveButtonItem release];
}
于 2009-02-22T00:01:16.823 回答
2

为了防止在读取 self.view 时发生无限循环,请在加载视图时调用该类的超级实现。超级实现会为你分配一个新的 UIView。

- (void) loadView {
[super loadview];

// init code here...

[self.view addSubView:mySubview1]; //etc..

}
于 2011-03-02T06:06:55.153 回答
1

使用 loadView 的最简单方法是制作某种类型的基本视图控制器,例如 MyBaseViewController,它是 UIViewController 的子类。在它的 loadView 方法中以这种方式创建视图:

-(void) loadView {
    if ([self viewFromNib]) {
        self.view = [self viewFromNib];
    } else {
        self.view = [[[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    }
    self.view.autoresizingMask = UIViewAutoresizingFlexibleHeight;
    self.view.backgroundColor = [UIColor whiteColor];
}

当您需要制作一些视图控制器时,您只需使用 MyBaseViewController 的子类,在它的 loadView 控制器中,您只需像这样调用 [super loadView]

//sucblass loadView
-(void) loadView {
    [super loadView];

    //rest of code like this..
    UILabel *myLabel = [[UILabel alloc] initWithFrame:myFrame];
    [self.view addSubview:myLabel];
    [myLabel release];
}
于 2012-07-19T11:34:20.130 回答
1

loadView()当您的控制器被要求创建其self.view. 你可以自己做

self.view = [UIView alloc] init...];

或者您的控制器的父 UIController 类已经有一个方法名称-loadView(),它将您的 self.view 初始化为空白视图。然后你可以打电话

[super loadView];

我真的推荐第二种方法,因为它鼓励继承。仅当您的视图控制器不是直接从 UIViewController 继承时。

于 2013-12-04T11:12:48.993 回答
0

苹果在 viewDidLoad 上给出的定义中提到,它是在控制器的视图加载到内存后调用的。简单来说,它是第一个加载的方法。

您可能在想,这种方法在什么条件下才能得到充分利用?答案是,基本上你希望应用程序首先加载的任何内容。例如,您可能想要不同的背景颜色,而不是白色,您可以选择蓝色。

于 2019-07-06T09:35:32.247 回答