当单击 UINavigationBar(左侧)中的“后退”按钮时,我想知道 View 发生了什么,它将返回到?
是“重新加载”还是“重新初始化”?
我问这个是因为我注意到当点击“后退”按钮时 View 框架被切断(我无法一直滚动到底部)。
但是当我通过 TabBar 转到另一个 View 并返回到那个 View 时,它不会。
我也在使用 Storyboard,这个问题只发生在 3.5 英寸设备上。
最佳答案
如果您引用 WWDC 2013 视频 Custom Transitions Using View Controllers它会引导您在较高层次上完成整个过程。显然,他们这样做是为了讨论如何在 iOS 7 中自定义这些转换,但它提供了一些有趣的背景。
简而言之,在弹出期间,不会重新加载先前 View Controller 的 View (例如,您不会看到 viewDidLoad
被调用),因为它在首次呈现时已经加载。 (iOS 6.0之前的版本存在内存压力导致卸载的情况,这里大概不用赘述)。该 View 也没有“重新初始化”。当您推开 View 时,该 View 只是从 View 层次结构中删除,但它由 View Controller 保留,因此当您弹出时,它只是添加回 View 层次结构。
因此,在弹出时,它将前一个 View Controller 的 View 添加回 View 层次结构(viewWillAppear
和我们弹出到的 View 的各种布局相关方法;viewWillDisappear
对于我们从中弹出的 View ),执行所需的动画,并通过删除弹出的 View 来完成转换(viewDidDisappear
对于我们从中弹出的 View ,viewDidAppear
for view we're popping to) 从 View 层次结构中,然后从 View Controller 层次结构中删除弹出的 View Controller 。
与其担心理论上可能会调用哪些方法,不如通过在相关方法中添加断点或 NSLog
语句来凭经验验证这一点,您会看到何时调用哪个方法。如果您遇到问题,请编辑您的问题以包含您实现的所有 View 外观/布局相关方法的代码,我们可以查看。
要诊断您的情况,我还建议您在模拟器中运行您的应用程序,执行您需要执行的操作以使屏幕处于不良状态,点击“暂停”按钮( ) 在调试器中,然后在 (lldb)
提示符下键入
po [[UIWindow keyWindow] recursiveDescription]
这将提供当前在 View 层次结构中的所有 View 及其框架的列表。如果您使用自动布局,您还可以在 (lldb)
提示符下输入以下内容:
po [[UIWindow keyWindow] _autolayoutTrace]
这将向您显示所有已存在的自动布局约束(以及它们是否存在任何问题)。
您必须进行一些诊断工作,然后向我们展示一些屏幕快照,告诉我们您是否使用自动布局,共享相关代码示例(特别是如果您以编程方式添加任何 View 或以编程方式更改任何框架或约束),如果使用自动布局,请描述您设置的约束,如果您不使用自动布局,请描述您有哪些自动调整掩码(例如什么 Spring 和支柱),等等
对我来说,这听起来有点像自动布局中的模棱两可的约束,但在您深入研究然后与我们分享您的发现之前我们不会知道。
关于ios - iOS 中 UINavigationBar 中的 "Back"按钮对 View 有何作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22511175/