我正在查看viewDidLoad和viewDidAppear方法以更好地理解它们的作用,我遇到了article,它使用银行应用程序的示例来解释这些方法的工作原理:
考虑一个显示您当前余额的银行应用程序 . 用户可以点击按钮,该按钮在模态视图控制器中呈现附近的ATM列表 . 为了获得附近ATM的列表,应用程序必须提出核心位置和Web服务请求 . 在这种情况下,程序员可以在viewDidLoad中从服务器请求附近的ATM列表 . 视图控制器只显示一次,viewDidLoad和viewWillAppear:将为该特定视图控制器实例重新调用一次,并且只调用一次 . 这两种方法中的代码的净效果是相同的 . 但这是个坏主意 . 考虑如果您想将ATM视图控制器移动到标签栏控制器中会发生什么 . 现在,ATM视图控制器 - 在viewDidLoad中使用其ATM提取代码仅获取ATM列表一次 . 因此,您周二在亚特兰大,打开您的申请以寻找自动柜员机,然后检查您的余额 . 然后你周三前往纽约,重新打开银行应用程序,你只能看到亚特兰大的ATM . 视图已加载,无需调用viewDidLoad,现在您正在查看过时的数据 .
遗憾的是,我仍然不完全理解如何/为什么viewDidLoad和viewWillAppear将被“背对背”调用,或者将ATM视图控制器添加到标签栏控制器意味着这些方法 .
3 回答
viewDidLoad
方法只会调用一次viewController的生命周期,也就是当viewController对象首次加载到内存中时 . 每当一个视图出现在屏幕上时,viewWillAppear
方法会调用,或者你可以说是topViewController ...Explanation :假设您有基于标签的应用,其中包含两个标签 .
Tab1
与viewController1
和tab2
相关联viewController2
. 现在,当你运行你的应用程序时,你会看到选项卡1被选中并且viewController1
正在查看,你想要更改为tab2
,当你点击tab2然后tabVieController2
的对象将创建并加载到内存第一次因此它的viewDidLoad
方法会调用,很快就会出现在窗口中,viewWillAppear
也会调用 . 现在,如果您尝试通过单击它们来更改标签,则只会调用viewWillAppear
方法,因为它们已经在内存中 .很简单,viewDidLoad在加载视图时调用,通过
NIB
,storyboard或loadView方法 . 显示视图时会调用viewWillAppear: .将视图添加到选项卡栏时,它只会加载一次,因此viewDidLoad只会被调用一次 . 但是,如果用户切换到另一个选项卡并返回到同一视图,则不会调用viewDidLoad . 这是因为视图已经加载 .
但是,在显示视图之前的两种情况下都会调用viewWillAppear: . 因此,当用户首次打开选项卡并切换回该选项卡时,将调用此选项 .
我认为它们指的是每次模态视图控制器出现时加载视图(因此数据不断刷新),但只有当它是标签栏的一部分时才加载(仅在应用程序启动时加载) . 虽然解释这些方法有点笨拙的例子 .
您可能希望阅读视图控制器生命周期,以了解何时实现哪种方法:
Responding to Display-Related Notifications
View Loading and Unloading