深入了解viewdidload

发布时间:2023-05-19

对于iOS开发工程师来说,viewDidLoad 是一个非常重要的方法。这个方法通常用来初始化视图控制器的内容,因此在开发过程中,深入了解 viewDidLoad 的原理和应用场景显得尤为重要。本文将从多个方面详细阐述 viewDidLoad

一、viewDidLoad中的方法执行

viewDidLoad 实际上是视图控制器的生命周期方法之一,它是在视图控制器的视图层次加载完成之后调用的。通常情况下,我们可以在这个方法中进行视图的初始化、数据的加载、变量的赋值等操作。 在 viewDidLoad 中,我们可以执行多个方法。例如,可以使用 addSubview 方法将视图添加到控制器的根视图中:

- (void)viewDidLoad {
   [super viewDidLoad];
   UIView *testView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
   testView.backgroundColor = [UIColor redColor];
   [self.view addSubview:testView];
}

在这个例子中,我们创建了一个新的 UIView,并将其添加到控制器的根视图中。这个过程实际上就是在 viewDidLoad 中执行的。

二、viewDidLoad刷新数据

viewDidLoad 中,我们通常会执行一些初始化操作,例如加载数据、赋值变量等。有时候,我们需要在初始化后刷新控件的显示,以便用户能够及时看到最新的数据。 以下是一个示例代码,演示如何在 viewDidLoad 中加载数据,然后更新 UILabel 的显示:

- (void)viewDidLoad {
   [super viewDidLoad];
   self.dataArray = [self getDataArray];
   UILabel *testLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 200, 30)];
   testLabel.text = [self.dataArray objectAtIndex:0];
   [self.view addSubview:testLabel];
}
- (NSArray *)getDataArray {
   // Load data from server or other source
   // ...
   // Convert data to array format
   return dataArray;
}
- (void)viewWillAppear:(BOOL)animated {
   [super viewWillAppear:animated];
   self.dataArray = [self getDataArray];
   UILabel *testLabel = [[self.view subviews] objectAtIndex:0];
   testLabel.text = [self.dataArray objectAtIndex:0];
}

在这个例子中,我们在 viewDidLoad 中加载数据,并将第一个数据元素显示在 UILabel 上。然后,在 viewWillAppear 方法中,我们重新加载数据,然后更新 UILabel 的显示。这样,每次页面显示时,都会显示最新的数据。

三、viewDidLoad是什么意思

正如前面所述,viewDidLoad 实际上是一个视图控制器的生命周期方法,它是在视图层次加载完成之后调用的。具体来说,viewDidLoad 方法是在 loadView 方法执行之后、在 viewWillAppear 方法执行之前调用的。 在视图控制器的生命周期中,viewDidLoad 是一个非常重要的方法。同时,viewDidLoad 也是一个非常容易出现问题的地方。如果我们在这个方法中进行了过多的操作,可能会导致应用程序的性能问题。

四、viewDidLoad等待线程数据

有时候,在 viewDidLoad 中我们需要从服务器或其他数据源加载数据。由于网络请求往往是异步的,这就需要等待线程将数据加载完成后再执行操作。 以下是一个示例代码,演示如何在 viewDidLoad 中等待线程加载数据:

- (void)viewDidLoad {
   [super viewDidLoad];
   dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
       NSArray *dataArray = [self getDataArray];
       dispatch_async(dispatch_get_main_queue(), ^{
           UILabel *testLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 200, 30)];
           testLabel.text = [dataArray objectAtIndex:0];
           [self.view addSubview:testLabel];
       });
   });
}
- (NSArray *)getDataArray {
   // Load data from server or other source
   // ...
   // Convert data to array format
   return dataArray;
}

在这个例子中,我们使用 dispatch_async 方法,在后台线程中加载数据,然后将数据转化为数组格式。之后,我们再使用 dispatch_async 方法,在主线程中更新 UILabel 的显示。

五、viewDidLoad什么时候调用

如前所述,viewDidLoad 是一个视图控制器的生命周期方法,它是在视图层次加载完成之后调用的。具体来说,viewDidLoad 方法是在 loadView 方法执行之后、在 viewWillAppear 方法执行之前调用的。 在绝大多数情况下,我们可以在 viewDidLoad 中执行一些初始化、数据加载等操作。同时,由于 viewWillAppear 通常会被多次调用,所以我们不应该在这个方法中进行过多的操作,否则可能会影响应用程序的性能。

六、viewDidLoad和viewDidAppear

viewDidLoadviewDidAppear 都是iOS中视图控制器的生命周期方法。区别在于 viewDidLoad 是在视图层次加载完成之后调用的,而 viewDidAppear 是在视图控制器的视图已经显示在屏幕上之后调用的。 以下是一个示例代码,演示 viewDidLoadviewDidAppear 的区别:

- (void)viewDidLoad {
   [super viewDidLoad];
   UIView *testView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
   testView.backgroundColor = [UIColor redColor];
   [self.view addSubview:testView];
   NSLog(@"viewdidload");
}
- (void)viewDidAppear:(BOOL)animated {
   [super viewDidAppear:animated];
   NSLog(@"viewdidappear");
}

在这个例子中,我们创建了一个 UIView 并将其添加到控制器的根视图中。然后,我们在 viewDidLoadviewDidAppear 方法中分别输出一行日志。 当我们运行这个例子时,我们可以看到控制台输出了以下日志:

viewdidload
viewdidappear

从日志中我们可以看出,viewDidLoad 方法首先被调用,接着是 viewDidAppear 方法被调用。这意味着在 viewDidLoad 中,我们创建的视图没有被显示在屏幕上,只有在 viewDidAppear 方法被调用时,这个视图才被加到屏幕上。

七、viewDidLoad什么时候触发

viewDidLoad 是一个视图控制器的生命周期方法,它是在视图层次加载完成之后调用的。具体来说,viewDidLoad 方法是在 loadView 方法执行之后、在 viewWillAppear 方法执行之前调用的。 在绝大多数情况下,viewDidLoad 会在控制器的初始化步骤中被执行。例如,当我们访问一个新视图控制器时,它会先调用控制器的 init 方法,然后调用它的 viewDidLoad 方法。这样,我们就可以加载数据、初始化控件等操作。

八、viewDidLoad self.view size选取

viewDidLoad 方法中,我们通常会添加子视图,并设置这些子视图的 frame 属性。在设置 frame 属性时,我们经常需要使用控制器的 rootViewsize 属性。 以下是一个示例代码,演示如何在 viewDidLoad 中设置控件的 frame

- (void)viewDidLoad {
   [super viewDidLoad];
   UILabel *testLabel = [[UILabel alloc] init];
   testLabel.text = @"Hello World!";
   testLabel.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height / 2);
   testLabel.center = CGPointMake(self.view.frame.size.width / 2, self.view.frame.size.height / 2);
   [self.view addSubview:testLabel];
}

在这个例子中,我们创建了一个 UILabel,并将其添加到根视图中。然后,我们设置这个 UILabelframe 属性,并将其放置在屏幕的中心位置。

总结

通过本文,我们深入了解了 viewDidLoad 这个iOS开发中非常重要的方法。我们了解到了 viewDidLoad 在控制器的生命周期中的位置,以及它的使用场景和注意事项。同时,我们还学习了如何在 viewDidLoad 中添加子视图和设置控件的 frame 属性。