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

-[UIViewController viewWillAppear:]
-[UIViewController viewDidAppear:]
有什么区别?     
已邀请:
一般来说,这就是我所做的: 1)ViewDidLoad - 每当我将控件添加到应该与视图一起出现的视图时,我就把它放在ViewDidLoad方法中。基本上,只要将视图加载到内存中,就会调用此方法。例如,如果我的视图是带有3个标签的表单,我会在这里添加标签;没有这些形式,视图永远不会存在。 2)ViewWillAppear:我通常只使用ViewWillAppear来更新表单上的数据。因此,对于上面的示例,我将使用它来实际将数据从我的域加载到表单中。创建UIViews是相当昂贵的,你应该尽可能避免在ViewWillAppear方法上这样做,因为当它被调用时,这意味着iPhone已经准备好向用户显示UIView,你在这里做的任何重量将以非常明显的方式影响性能(如动画延迟等)。 3)ViewDidAppear:最后,我使用ViewDidAppear来启动需要很长时间才能执行的新线程,比如执行webservice调用以获取上面表单的额外数据。好的是因为视图已存在并正在向用户显示,您可以在获取数据时向用户显示一条漂亮的“等待”消息。     
viewDidLoad === >>>将初始化代码放在这里。不要放置在视图生命周期中可能会更改的动态数据。因此,如果您从核心数据中提取数据,那么如果在视图的生命周期中这可能会发生变化,则您不希望在此处执行此操作。例如:假设你有一个标签控制器。您从tab1切换到tab2并在tab2中更改模型上的内容。如果你回到tab1并且你的模型代码是在viewDidLoad中完成的,那么就不会更新(假设你没有使用KVO或NSFetchedResultsController等)。 viewWillAppear === >>>每次视图即将出现时都会调用此视图,无论视图是否已在内存中。将动态代码放在这里,例如模型逻辑。 viewDidAppear === >>>如果您确定视图在屏幕上,例如网络调用,那么您只需要执行昂贵的操作。 注意:如果您的应用程序是后台运行并返回到前台,则需要使用NSNotificationCenter处理此问题。我在下面的评论中为此编写了代码。您可能会认为viewWillAppear / viewDidAppear将触发。在那里放一个断点并测试它。它不会开火。因此,如果您的应用在后台运行时发生了某些变化,则需要使用通知进行更新。     
在加载实际视图之前调用
viewWillAppear
方法。 当视图已加载并且您想要显示某些内容时,将调用
viewDidAppear
方法。     
viewWillAppear中: ■在将视图添加到窗口的视图层次结构之前调用 ■在[vc.view layoutSubviews]之前调用(如有必要)  viewDidAppear: ■将视图添加到视图层次结构后调用 ■在[vc.view layoutSubviews]之后调用(如有必要)     
viewwillappear将在加载视图之前调用,以便您可以在加载视图之前执行某个任务,并且viewdidappear将在加载视图后调用,以便post任务将在该方法中完成     
一些观察: 首次实例化视图时会调用
viewDidLoad
方法。
IBOutlet
引用被调用的时间连接起来,但不是之前。但是,在调用此视图时,可能无法建立视图的
frame
。这是添加/配置子视图及其相关约束的好地方。但是,如果您根据主视图的尺寸进行任何手动配置
frame
值,则应将这些帧的配置推迟到
viewWillAppear
viewDidLayoutSubviews
。 当视图层次结构中的视图呈现即将开始时,将调用
viewWillAppear
方法。值得注意的是,这是在视图呈现的动画开始时调用的(如果有的话)。当远离这个观点的过渡开始时,它的伴星
viewWillDisappear
显然会被调用。 在完成视图的呈现时调用
viewDidAppear
方法,特别是当任何和所有相关动画完成时。它的伴侣,
viewDidDisappear
显然在远离此视图的过渡时被调用。 两个重要的警告: 首次实例化视图时,只调用一次
viewDidLoad
一次。另一方面,不仅在首次呈现视图时调用
viewWillAppear
viewDidAppear
,而且每次后续重新呈现相同的视图。例如,当您首次显示视图时,将调用所有这三种方法。如果有问题的视图随后呈现另一个随后被解除的视图,则当有问题的视图被添加并动画回视图层次结构时,通常会再次调用
viewWillAppear
viewDidAppear
,但是
viewDidLoad
不会。
viewDidLoad
仅在首次创建此特定实例时调用。 因此,如果您想在每次视图重新出现时执行某些操作(例如,您将其关闭或弹回),请在
viewWillAppear
viewDidAppear
中执行此操作。如果您希望它仅在首次实例化视图时发生,请在
viewDidLoad
中执行此操作。 调用
viewWillAppear
并不能保证过渡到那个观点永远不会完成。值得注意的是,如果您正在使用由实时用户输入驱动的交互式转换,但可以取消交互式转换。即,仅仅因为
viewWillAppear
被调用,并不意味着
viewDidAppear
会被调用。通常它是,但如果交互式手势被取消,它将不会(因为转换从未完成)。 在WWDC 2013上,在交互式过渡的背景下,主持人开玩笑说他们应该将
viewWillAppear
重命名为“
viewMightAppear
,或
viewWillProbablyAppear
,或
iReallyWishThisViewWouldAppear
”。 内置交互式手势的一个示例是使用
UINavigationController
并且您“从左边缘滑动”以启动视图的弹出。对于要弹出的视图,将调用
viewWillAppear
,但是如果取消“从左边缘滑动”以返回到开始此弹出手势的视图,则弹出将被取消,并且
viewDidAppear
用于查看视图开始回弹永远不会被召唤。 这样做的结果是你应该小心,你不应该编写代码,假定每次调用
viewWillAppear
最终都会被调用
viewDidAppear
。如果取消转换,则情况并非如此。     
“will”和“did”之间的区别......顾名思义,在视图即将出现之前调用viewWillAppear,并在视图出现时调用viewDidAppear。     
1)ViewWillAppear:实际上在内存中加载的视图,在视图控制器中调用一次并具有其框架,但仍未向用户显示 2)ViewDidAppear:控制器添加到视图层次结构中,因此您可以呈现给下一个控制器, 此外,视图确实布局了子视图     
前者发生在视图出现之前,后者发生在之后。     
总结一下: -viewWillAppear - >更新数据(从表视图重新加载数据) -viewDidAppear - >昂贵的操作(具有良好进度的API调用hud!)     
顾名思义,在视图即将出现之前调用
viewWillAppear
,当视图出现时调用
viewDidAppear
。     
用例,即我何时应该使用哪个?
viewDidLoad
- 当标签,按钮(i,e任何控件/子视图)连接到View的界面文件,并且如果要与ViewController的View同时加载所有这些,并且如果要将其加载到内存中一次,完成它
viewWillAppear
- 比如说,每当viewController出现在屏幕上时,你想要改变视图的背景颜色。或者更现实地说,如果你想在一天中的夜晚时间使用DarkMode背景颜色,并在白天需要背景视图的浅色,请在
viewWillAppear
中输入此代码。 另一个好用的例子 https://stackoverflow.com/a/39395865/5438240 另请注意,如果您使用的是导航堆栈(
UINavigationController
),则即将弹出的viewController调用了
viewWillDisappear()
,接下来位于堆栈顶部的ViewController将调用
viewWillAppear()
    

要回复问题请先登录注册