是什么-viewWillAppear之间的区别:和-viewDidAppear :?

问题描述 投票:127回答:12

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

iphone ios
12个回答
288
投票

在一般情况下,这是我做的:

1)viewDidLoad中 - 每当我添加控件应该与视图一起出现,马上一个观点,我把它放在viewDidLoad方法。基本上每当视图装入存储器调用此方法。因此,举例来说,如果我的看法是一个形式3级的标签,我会在这里添加标签;视图将永远没有这些形式存在。

2)viewWillAppear中:我使用viewWillAppear中通常只是更新表格上的数据。所以,上面的例子,我会用这实际上是从我的域名到表单中加载数据。 UIViews的创作是相当昂贵的,你应该避免尽可能多地这样做,在viewWillAppear中的方法,监守当这个被调用,这意味着iPhone已经准备好展示了UIView给用户,并且任何重物,你在这里做将在一个很明显的方式影响性能(如动画被延迟,等等)。

3)ViewDidAppear:最后,我用的是ViewDidAppear,开始一个新的线程之类的东西,例如做一个Web服务调用,将需要很长的时间来执行,以获得额外的数据形式above.The好事,因为视图已经存在并正在显示给用户,则可以显示一个漂亮的“等待”的信息给用户,而你得到的数据。


3
投票

总结一下:

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

-viewDidAppear - >昂贵的操作(API调用一个不错的进步HUD!)


1
投票

正如其名之前的观点即将出现,当视图确实出现viewWillAppear被称为viewDidAppear被调用。


0
投票

用例,即当我应该使用哪一个?

viewDidLoad - 当标签,按钮(I,E任何控件/子视图)连接到View的接口文件,如果要加载所有这些在同一时间作为视图控制器的看法,如果你想这个加载到内存中一次,罢了

viewWillAppear - 比方说,你想改变的viewController出现在屏幕上的视图每次的背景颜色。或更为现实,如果你想在一天晚上的时间DarkMode背景颜色,和白天的背景视图的光色,去这些代码viewWillAppear

这里的另一个很好的利用情况qazxsw POI

还要注意的是,如果你使用的是导航堆栈(https://stackoverflow.com/a/39395865/5438240),也就是即将被弹出的的viewController有叫UINavigationController和ViewController中下一个将是在堆栈的顶部有一个名为viewWillDisappear()


46
投票

viewDidLoad中=== >>>把你的初始化代码在这里。不要把视图生命周期中可能发生变化的动态数据。所以,如果你是从核心数据提取数据,你不想做这里如果这可能视图的生活发生变化。例如:假设你有一个选项卡控制器。您从TAB1切换到TAB2和变化对TAB2模型的东西。如果你回来TAB1和模型代码viewDidLoad中做这将不会被更新(假设你没有使用志愿或NSFetchedResultsController等)。

viewWillAppear中=== >>>这就是所谓的每一个观点是即将出现的视图是否已在内存中的时间。把你的动态代码在这里,如模型的逻辑。

viewDidAppear === >>>将昂贵的操作在这里,你只希望做的,如果你一定认为是在屏幕上,如网络电话。

注意:如果您的应用程序转到后台运行,并返回到前台,你需要处理这个使用NSNotificationCenter。我写的代码出来,在下面的意见。你可能会认为viewWillAppear中/ viewDidAppear会火。把一个破发点出现并对其进行测试。它不火。所以,如果事情已经改变了您的应用程序,而这是在后台,您需要更新使用通知。


12
投票

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

当已经加载视图的viewDidAppear方法被调用,你要显示的东西。


8
投票

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


5
投票

viewWillAppear中会加载视图之前调用,这样就可以做某些任务加载一个视图和viewdidappear之前加载视图,后任务将在该方法完成后会调用


5
投票

一些意见:

  • 当视图是第一实例化的viewDidLoad方法被调用。 IBOutlet引用这个被称为时间挂钩,而不是之前。视图的frame可以不受此被称为时间来建立,虽然。这是一个伟大的地方添加/配置子视图和它们相关的约束。但是,如果你正在做的主视图的尺寸的基础上frame值的任何手动配置,这些帧的配置应推迟到viewWillAppearviewDidLayoutSubviews
  • 当视图层次视图的演示即将开始的viewWillAppear方法被调用。值得注意的是,这就是所谓的动画视图的演讲开始(如果有的话)。它的同伴,从这个观点远过渡开始时viewWillDisappear明显调用。
  • 当视图的呈现完成的viewDidAppear方法被调用,特别是当任何和所有相关的动画结束。它的同伴,当从这种观点远过渡完成viewDidDisappear明显调用。

两个重要的注意事项:

  • viewDidLoad被调用一次且仅一次,当视图第一次实例。在另一方面,viewWillAppearviewDidAppear不仅将称为视图时首次提出,但每随后的时间讨论了同样的观点被重新提出。例如,当你第一次提出一个观点,这些方法全部三个将被调用。如果有问题的观点随后提出,随后被驳回,则viewWillAppearviewDidAppear会时有问题的视图添加和动画回视图层次结构通常被再次调用另一种观点,但viewDidLoad不会。首先创建了这个特定的实例时viewDidLoad只调用。 所以,如果你想每一个视图重新出现的时间做一些事情(例如您关闭或弹回它),这样做在viewWillAppearviewDidAppear。如果您想在视图第一次实例它只是发生,这样做,在viewDidLoad
  • viewWillAppear的调用不保证该视图过渡将永远不会完成。值得注意的是,如果您使用交互转换由实时用户输入驱动,但交互转换可以被取消。即,只是因为viewWillAppear被调用,它并不意味着viewDidAppear将调用。一般来说,是的,但如果交互手势被取消,它不会(因为过渡从未完成)。 在WWDC 2013年,互动的转变的背景下,主持人开玩笑说,他们应该重新命名viewWillAppear为“viewMightAppear,或viewWillProbablyAppear,或iReallyWishThisViewWouldAppear”。 内置交互手势的示例使用“从左侧边缘滑动”一个UINavigationController和您发起的视图的流行时。该viewWillAppear将被要求到你如雨后春笋般冒出的观点,但如果取消,“从左侧边缘滑动”要返回从中启动这个流行的手势,在弹出被取消,该视图的viewDidAppear认为你开始流行回将永远不会被调用。 这样做的最终结果是,你要小心,你不写假定每次调用viewWillAppear将通过调用viewDidAppear最终跟随代码。如果转换被取消,这将不会是这样。

4
投票

区别“会”和“做” ......正如其名之前的观点即将出现,当视图确实出现viewDidAppear被称为viewWillAppear中被调用。


4
投票

1)viewWillAppear中:视图在存储器实际加载,在视图控制器调用一次,而且其框架,但仍然没有显示给用户

2)ViewDidAppear:添加到视图层次的控制器,所以你可以提出下一个控制器,也认为做布局子视图


3
投票

认为出现后者后来发生之前,前者发生。

© www.soinside.com 2019 - 2024. All rights reserved.