viewDidLoad和viewWillAppear与标签栏控制器

时间:2014-10-21 13:00:36

标签: ios objective-c uiviewcontroller

我正在研究viewDidLoad和viewDidAppear方法,以便更好地了解它们的作用,我遇到了article,它使用银行应用程序的示例来解释这些方法的工作原理:

  

考虑显示您当前余额的银行应用程序。一个用户   可以点击一个按钮,该按钮以模态显示附近的ATM列表   查看控制器。为了获得附近的ATM列表,   应用程序必须提出核心位置和Web服务请求。

     

在这种情况下,程序员可以逃避请求   viewDidLoad中服务器附近ATM的列表。风景   控制器只提供一次,包括viewDidLoad和   viewWillAppear:将背靠背调用,只有一次   特定视图控制器实例。代码的净效果   这两种方法中的任何一种都是相同的。

     

但这是一个坏主意。考虑如果你想要发生什么   将ATM视图控制器移动到标签栏控制器。现在,ATM   视图控制器 - 仅在viewDidLoad中使用其ATM提取代码   取一次ATM列表。所以你星期二在亚特兰大,开放   你的应用程序寻找自动取款机,然后检查你的余额。然后   你周三去纽约,重新开放银行应用程序,   而你只看到亚特兰大的ATM。视图已经加载,没有必要   调用viewDidLoad,现在你正在查看陈旧的数据。

可悲的是,我仍然不完全理解如何/为什么同时调用viewDidLoad和viewWillAppear'背靠背'或者将ATM视图控制器添加到标签栏控制器意味着什么?这些方法。

3 个答案:

答案 0 :(得分:15)

viewDidLoad方法只会调用一次viewController的生命周期,也就是当viewController对象首次加载到内存中时。 每当一个视图出现在屏幕上时你会调用viewWillAppear方法,或者你可以说是topViewController ......

<强>解释: 考虑您有基于选项卡的应用程序和两个选项卡与Tab1viewController1相关联的tab2viewController2相关联。现在,当您运行应用时,您会看到选项卡1已被选中且viewController1正在查看,您想要更改为tab2,当您点击tab2然后tabVieController2&# 39; s对象将首次创建并加载到内存,因此其viewDidLoad方法将调用,不久之后它将显示在窗口中,viewWillAppear也将调用。 现在,如果您尝试通过单击它们来更改选项卡,则只会调用viewWillAppear方法,因为它们已经在内存中。

答案 1 :(得分:8)

很简单,viewDidLoad在加载视图时调用,可以通过NIB,storyboard或loadView方法调用。在显示视图时调用viewWillAppear:

当视图添加到标签栏时,它只会加载一次,因此viewDidLoad只会被调用一次。但是,如果用户切换到其他选项卡并返回到同一视图,则不会调用viewDidLoad。这是因为视图已经加载。

然而,在显示视图之前,在两种情况下都会调用viewWillAppear:。因此,当用户首次打开选项卡并切换回该选项卡时,将调用此选项。

答案 2 :(得分:1)

我认为他们指的是每次模态视图控制器出现时加载视图(因此数据不断刷新),但只有当它是标签栏的一部分时才加载(仅在应用程序启动时加载)。尽管如此,解释这些方法的实例还是一种愚蠢的例子。

您可能希望了解视图控制器生命周期,以了解何时实现哪种方法:

Responding to Display-Related Notifications

View Loading and Unloading