-viewWillAppear和-viewDidAppear:有什么区别?

-[UIViewController viewWillAppear:]-[UIViewController viewDidAppear:]之间有什么区别?

一般来说,这是我所做的:

1) ViewDidLoad – 每当我添加控件到一个视图,应该与视图一起出现,我把它放在ViewDidLoad方法。 基本上这个方法在视图加载到内存时被调用。 例如,如果我的视图是一个带有3个标签的表单,我会在这里添加标签; 没有这些forms,这个观点将永远不会存在

2) ViewWillAppear :我使用ViewWillAppear通常只是为了更新表单上的数据。 所以,对于上面的例子,我会用这个实际上从我的域加载到表单中的数据。 创buildUIViews相当昂贵,你应该尽可能地避免在ViewWillAppear方法上做这件事,因为当它被调用时,这意味着iPhone已经准备好向用户展示UIView,并且你在这里做的任何事情会以非常明显的方式影响性能(如animation被延迟等)。

3) ViewDidAppear :最后,我使用ViewDidAppear来启动新线程来执行需要很长时间的事情,比如为web窗口获得额外的数据。好的是,因为视图已经存在并正在向用户显示,您可以在获取数据时向用户显示一个很好的“正在等待”消息。

viewDidLoad === >>>把你的初始化代码放在这里。 不要把在视图生命周期中可能改变的dynamic数据。 所以,如果你从核心数据中提取数据,如果这个数据在视图的生命周期中可能发生变化,那么你就不想在这里做数据。 例如:说你有一个选项卡控制器。 您从tab1切换到tab2,并在tab2中更改模型上的某些内容。 如果你回到tab1,你的模型代码在viewDidLoad中完成,这不会被更新(假设你没有使用KVO或NSFetchedResultsController等)。

viewWillAppear === >>>每当视图即将出现,视图是否已经在内存中,都会调用它。 把你的dynamic代码放在这里,比如模型逻辑。

viewDidAppear === >>>在这里进行昂贵的操作,只有在确定视图在屏幕上时才需要执行操作,如networking调用。

注意:如果你的应用程序是背景,并返回到前台,你需要使用NSNotificationCenter处理这个。 我在下面的评论中写了这个代码。 你可能会认为viewWillAppear / viewDidAppear会触发。 把一个断点放在那里testing一下。 它不会起火。 因此,如果您的应用程序在后台进行了更改,则需要使用通知进行更新。

在加载实际视图之前调用viewWillAppear方法。

viewDidAppear方法在视图已经被加载时被调用,并且你想显示一些东西。

viewWillAppear中:
■在视图添加到窗口的视图层次之前调用
■在[vc.view layoutSubviews]之前调用(如有必要)
viewDidAppear
■视图添加到视图层次结构后调用
■在[vc.view layoutSubviews]之后调用(如有必要)

viewwillappear将在加载视图之前调用,以便您可以在加载视图之前执行特定的任务,并且viewdidappear将在加载视图之后调用,以便后期任务将在该方法中完成

“will”和“did”之间的区别…顾名思义,viewWillAppear在视图即将出现之前调用,viewDidAppear在视图出现时被调用。

前者在视图出现之前发生,后者在之后发生。

顾名思义,在视图即将出现之前调用viewWillAppear而在视图出现时调用viewDidAppear

总结一下:

-viewWillAppear – >更新数据(从表格视图重新加载数据)

-viewDidAppear – >昂贵的操作(具有良好进度的API调用hud!)