viewDidLoad中的代码每次调用时都会运行

时间:2014-11-05 14:49:08

标签: ios iphone swift

大家好我正在Udemy做一门课程,代码要求在viewDidLoad函数中放置代码,如下所示:

    override func viewDidLoad() {
    super.viewDidLoad()

    placesArray.append(["name":"Taj Mahal", "lat":"27.175607", "lon":"78.042112"])

}

数组追加应该只运行一次,但是,当我转到另一个viewController并返回时,它运行代码再次追加。所以我现在有一个有2行的数组,这两行都是Taj Mahal。

我认为viewDidLoad函数只运行一次代码?

有解决方法吗?

感谢。

附录: 我正在使用Swift,所以在创建和启动viewController时我没有看到任何alloc和init。听起来很奇怪,视频教程让它在viewDidLoad中工作,教练正在使用故事板从初始表视图控制器转到视图控制器上的地图视图,并且在地图视图上只有一个后退按钮#39;也可以通过故事板返回到表格视图控制器。 - 可能是因为我有最新版本的Swift语言而且教练使用的是早期版本,(因为我注意到之前编码方面略有不同),但你永远都不知道。无论何时,只要他触摸后退按钮,它就不再运行附加代码。 我试图与教练联系,作为这里的一些建议,虽然它们很好,似乎不起作用。 一旦我与培训师联系,我会把解决方案放在这里。

3 个答案:

答案 0 :(得分:1)

当您的视图控制器的viewDidLoad完成加载时,将调用view方法。当视图控制器的view属性为view且某些内容尝试访问它时,nil将加载。

UIViewController *myVC = [[UIViewController alloc] init];
UIView *aView = myVC.view; // this loads myVC's view; viewDidLoad is called when it completes loading.

如果view已卸载(通常由于内存限制),则在下次访问view属性时将调用它。

通常不应在视图方法中操作数据集。考虑将其移动到视图控制器的init(或者移动到不同的“数据源”类)。

答案 1 :(得分:0)

只要设置了视图控制器的视图属性,就会调用

viewDidLoad。这是什么时候发生的?这取决于视图控制器的包含方式:

的UINavigationController - 视图控制器视图在添加到导航堆栈时加载,并且“已卸载”(尽管不推荐使用viewDidUnload方法),因为它们已被删除。

的UITabBarController - 视图控制器视图在添加到选项卡栏时加载,无论它们是否在屏幕上。当您从标签更改为标签时,它们会保持加载状态。

根据您的需求和用例,您可以创建自己的视图控制器容器,以满足您的需要。以正确的方式检查Apple文档: https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/CreatingCustomContainerViewControllers/CreatingCustomContainerViewControllers.html

答案 2 :(得分:0)

我想您正在尝试在viewDidLoad中进行数据初始化。如果在viewDidLoad之前没有对placesArray进行其他操作,那么不是直接添加,而是直接设置placesArray:

placesArray = ["name":"Taj Mahal", "lat":"27.175607", "lon":"78.042112"]

然后,即使您的视图由于某些原因被卸载。泰姬陵仍将只增加一次。