ios - iOS 中 UINavigationBar 中的 "Back"按钮对 View 有何作用?

标签 ios iphone uiview uinavigationbar

当单击 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 外观/布局相关方法的代码,我们可以查看。

要诊断您的情况,我还建议您在模拟器中运行您的应用程序,执行您需要执行的操作以使屏幕处于不良状态,点击“暂停”按钮(pause ) 在调试器中,然后在 (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/

相关文章:

java - 有通用语言吗?

ios - 将 NSNumber 转换为 long

ios - Objective-C block 。上下文捕获相同的变量/复制相同的 NSStackBlock

cocoa-touch - 添加一个 UINavigationController 作为 UIView 的 subview

ios - 如何调整 SKEmitterNode 的大小?

ios - 将点击事件从 UIView 转发到内部 TextField

ios - 在 Swift 5 中获取字符串 md5

ios - 将 PFQuery 解析为数组 objective-c

iphone - UIView位置检测

iphone - 导航 Controller 的后退按钮问题 (iPhone)