IOS中的viewDidLoad和ViewWillAppear有什么区别?

4
请帮我解决这个问题。我创建了一个简单的项目,其中有两个视图,如下所示。我已经附上了我的故事板和Swift文件的图片。所以,我读到viewdidload只会在将视图加载到内存中时执行一次。但是,当我从第二个视图转换到第一个视图时,viewdidload再次执行,而且viewdidload方法中的打印语句也是如此。
请有人向我解释这个问题。 enter image description hereenter image description here

Count/2 应该被初始化为0。 - Dasem
3个回答

10
viewDidLoad不仅仅针对应用程序只被调用一次,它还会在视图创建和加载时被调用。所以,每当你将视图控制器推送到堆栈中,就会多次调用viewDidLoad
以下是两个与此相关的方法:
- viewDidLoad():当视图控制器的内容视图(其视图层次结构的顶部)被创建和加载时调用。 - viewWillAppear():用于在视图变为可见之前执行任何操作。
有关更多信息,请查看链接:https://developer.apple.com/library/content/referencelibrary/GettingStarted/DevelopiOSAppsSwift/Lesson4.html 因此,如果视图已经在内存中(如您的情况),则无需再次推入,只需要使用此代码将其弹出即可。
self.navigationController?.popViewControllerAnimated(true)

谢谢您的回复。您能否举个例子来解释一下?另外,如果我们转到另一个视图控制器,该视图控制器的对象会从内存中删除吗? - Swifty
是的,当从viewController返回时,viewController对象的内存将被删除。例如,在项目中的viewDidLoad、viewWillAppear中设置断点,然后查看何时调用它们。可以通过以下方式进行检查,在推到第二个VC之前,在第一个VC中使用整数变量为10,然后将其推到第二个VC并使用popViewController方法返回第一个VC,打印该变量的值,您将看到10,但如果您通过推进到同一个VC,则不会得到10(它是0或某些随机值)。待续.. - Janmenjaya
这表明,之前加载的屏幕视图与现在的不同。最好的检查方法是将主视图的背景颜色设置为相同的方式进行检查,然后可以知道屏幕视图是否相同。希望能有所帮助,如果是,请接受答案并点赞。 - Janmenjaya
那么,在导航控制器的情况下,它是如何工作的呢?如果我们不断添加新的视图控制器到导航控制器的堆栈中,它是否会存储无限数量的视图控制器对象的值? - Swifty
感谢您的帮助。 - Swifty
显示剩余2条评论

1

不应该从secondViewController转换到firstViewController进行返回。使用以下代码弹出第二个视图控制器以返回:

self.navigationController?.popViewControllerAnimated(true)

当您进行转换时,它会从您的firstViewController创建一个新实例,但当您弹出第二个视图控制器时,它会关闭您的secondViewController并再次显示您最后查看的视图控制器。
或者
在您不使用navigationController的情况下,您应该使用以下代码来关闭您的secondViewController
self.dismissViewControllerAnimated(true, completion: {});

重要的是不要在后退时使用新的转换效果。

0
最简单的方法:
1.首先将您的ViewController嵌入NavigationController中
2.调用此方法(而不是创建返回segue)
navigationController?.popToRootViewController(animated: true)

viewDidLoad方法仅会被调用一次


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接