点击"返回" UINavigationBar中的按钮(在左侧),我想知道,视图会发生什么,它会回到?
是否重新加载"或者它是否已经重新初始化"?
我问这个是因为我注意到了" Back"按钮视图框被切断(我无法一直滚动到底部)。
但是当我通过TabBar转到另一个视图并返回该视图时,它并没有。
我也在使用故事板,问题只发生在3.5英寸设备上。
答案 0 :(得分:1)
如果您参考WWDC 2013视频Custom Transitions Using View Controllers,它会引导您完成整个过程。显然,他们正在讨论如何在iOS 7中自定义这些过渡,但它提供了一些有趣的背景。
简而言之,在弹出窗口期间,之前的视图控制器视图将不会被重新加载(例如,您不会看到viewDidLoad
被调用),因为它在首次呈现时已经加载。 (在6.0之前的iOS版本中存在由于内存压力而可能已卸载的情况,但我们可能不需要进入此处)。视图不是"重新初始化"无论是。当您从视图层次结构中推开视图时,视图只是从视图层次结构中删除,但视图控制器会保留视图,因此当您弹回时,它只是添加回视图层次结构中。
因此,在弹出窗口时,它会将之前的视图控制器视图添加回视图层次结构(viewWillAppear
以及我们要弹出的视图的各种与布局相关的方法; {{ 1}}对于我们正在弹出的视图,执行所需的动画,并通过删除弹出的视图(viewWillDisappear
为我们弹出的视图viewDidDisappear
以查看我们&#)来完成转换39;从视图层次结构中重新弹出),然后从视图控制器层次结构中删除弹出的视图控制器。
不要担心理论上可能会调用哪些方法,而是通过在相关方法中添加断点或viewDidAppear
语句来验证这一点,这可能更好,并且您将看到哪个被称为什么时候。如果您遇到问题,请编辑您的问题以包含您实施的所有视图外观/布局相关方法的代码,我们可以看一下。
为了诊断您的情况发生了什么,我还建议您在模拟器中运行您的应用,执行您需要做的操作以使屏幕处于不良状态,点击&# 34;暂停"按钮()在调试器中,然后在NSLog
提示符下键入
po [[UIWindow keyWindow] recursiveDescription]
这将提供视图层次结构中当前所有视图及其框架的列表。如果您使用自动布局,还可以在(lldb)
提示符下输入以下内容:
po [[UIWindow keyWindow] _autolayoutTrace]
这将显示所有自动布局约束(以及它们是否存在任何问题)。
您必须完成一些此诊断工作,然后向我们展示一些屏幕快照,告诉我们您是否使用自动布局,分享相关代码示例(特别是如果您是以编程方式添加任何视图或以编程方式更改任何框架或约束),如果使用自动布局,描述您已设置的约束,如果您不使用自动布局,请描述自动调整遮罩的内容(例如,弹簧 - 并且struts)你有适当的等等。
对我而言,这听起来有点像汽车布局中的模棱两可的限制,但我们不会知道,直到你挖掘一下,然后与我们分享你的发现。
答案 1 :(得分:0)
如果您正在使用沼泽标准视图控制器,则触摸返回只会将顶视图控制器弹出导航堆栈。以前的视图控制器仍驻留在内存中。这使得应用程序能够快速响应。
答案 2 :(得分:0)
向NSLog(@"%s", __PRETTY_FUNCTION__)
之类的所有方法添加viewDid/viewWill
之类的内容,并查看导航时发生的调用链,可以帮助您了解出现了什么问题