不要使用self.dismiss…..永远!

如果您正在阅读本文,我假设您对速捷语言有一些初学者到中级的知识。 self.dismiss(动画:true,完成:nil)是您必须至少遇到的一种东西,用于关闭视图以返回到原始视图。 即使这是一个很好的工具,在某些情况下它也不是最佳选择。

我的故事

在我的早期开发经验中,当我仍然掌握基本知识时(仍在一定程度上),每当我想返回视图时,我都会使用self.dismiss。 但是,当您的应用程序变得更加复杂时,您需要调用服务器以提取某些信息,或者如果您当前所在的视图需要触发对前一个视图的操作,那么self.dismiss并不是一个好工具。

这就是为什么

self.dismiss的问题在于,如果您首先使用实例化方法显示视图,则它不会在前一个视图中触发viewDidLoad函数。 对于许多刚起步的开发人员来说,这可能会造成很大的问题,因为youtube上的更多入门教程将其所有功能都放入viewDidLoad中,如果未调用这些功能,那么开发人员就会困惑为什么某些事情无法正常工作。

修复#1

快速解决方案是使用segue或实例化方法返回视图。 原因是,当这些函数用于呈现某个视图时,它将触发viewDidLoad函数。

修复#2

如果修订1对您的情况不起作用,或者您仍然想使用self.dismiss,该怎么办? 对此的另一个解决方法是将要激活的功能放在viewDidAppear / viewWillAppear中。 起作用的原因是遵循以下逻辑。 实例化视图或选择视图时,请考虑将视图堆叠在一起,这意味着初始视图已经加载并且在后台,并且调用self.dismiss视图时,所有视图它会删除顶层视图并返回到初始视图。 由于初始视图已经加载,因此不会触发viewDidLoad函数。 而viewDidAppear / viewWillAppear遵循不同的逻辑,并在视图实际出现时被激活。

结论

我不确定是否需要一个示例,可以快速了解它在实践中的作用。 如果您创建2个视图,则在主视图中有一个显示数字的标签,当视图加载时,增加该数字。 设置好之后,创建另一个视图,并调用实例化方法来呈现它。 呈现它时,创建一个具有以下操作的按钮:self.dismiss(动画:true,完成:nil),您会注意到,当返回初始视图时,最初的数字没有变化。 但是,如果在viewDidAppear / viewDidLoad中增加数字,则会看到数字增加。 我希望这是清楚而有意义的。