带导航控制器的 3D Touch Peek/Pop

Posted

技术标签:

【中文标题】带导航控制器的 3D Touch Peek/Pop【英文标题】:3D Touch Peek/Pop with Navigation Controller 【发布时间】:2017-02-20 17:31:24 【问题描述】:

这个问题与我在here的另一个问题有些相关

在 Apple 的示例代码中,我有以下 3D Touch Peek & Pop 代码:

func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? 
    guard let indexPath = tableView.indexPathForRow(at: location) else  return nil 

    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let viewController = storyboard.instantiateViewController(withIdentifier: ChatDetailViewController.identifier)
    guard let chatDetailViewController = viewController as? ChatDetailViewController else  return nil 

    chatDetailViewController.chatItem = chatItem(at: indexPath)
    let cellRect = tableView.rectForRow(at: indexPath)
    previewingContext.sourceRect = previewingContext.sourceView.convert(cellRect, from: tableView)
    chatDetailViewController.isReplyButtonHidden = true

    let navigationController = UINavigationController(rootViewController: viewController
    return navigationController


func previewingContext(_ previewingContext: UIViewControllerPreviewing, commit viewControllerToCommit: UIViewController) 

    self.navigationController!.show((viewControllerToCommit as! UINavigationController).viewControllers[0], sender: self)


所以,在 Peek 中,我将刚刚创建的视图控制器包装在一个新的导航控制器中并自行返回:

let navigationController = UINavigationController(rootViewController: viewController
return navigationController

但是,在 Pop 中,我必须丢弃上面创建的导航控制器并在我当前所在的导航控制器中“显示”它。

为什么要这样?

我想在“Peek”中显示一个顶部栏(同样,正如 here 所讨论的那样)。但是,如果我只是提交新创建的同一个导航控制器,它会带走所有其他属性,例如后退按钮、自定义推送/弹出动画等。因此,当视图控制器被“弹出”(已提交)时,我必须将其提取并放回我所在的当前导航控制器中。

问题

以上代码完美运行。但是,我要离开我在 Peek 内部制作的导航控制器,以免泄露。此外,当我测试泄漏时,它会显示一个小的内存泄漏。我将如何释放/解除分配在“Pop”中留下的导航控制器?

【问题讨论】:

我不明白这个问题。你似乎在说你的代码做你想做的事。那么有什么问题呢? 当我在 Pop 中提取视图控制器时,我将它包含的导航控制器留在后面,造成内存泄漏。 我不相信。如果这是真的,那将是苹果的问题,而不是你的。 明白。我正在检查看看还有什么原因造成的。感谢您的快速回复! 【参考方案1】:

你正在做的事情没有“泄漏”。

viewControllerForLocation 返回的视图控制器在用户查看时由运行时保留,并在用户停止查看时释放。

commit 中显示的视图控制器是一个普通的显示视图控制器,并由运行时保留为视图控制器层次结构的一部分。当您以通常的方式从该视图控制器中放松(关闭或弹出)时,它会被释放。

【讨论】:

根据以上两个要点:如果我为 Peek 初始化一个视图控制器,为提交初始化另一个视图控制器,那仍然没有负面影响吗? 这不是通常的,但我在文档中没有看到任何严格禁止它的内容。

以上是关于带导航控制器的 3D Touch Peek/Pop的主要内容,如果未能解决你的问题,请参考以下文章

午餐后静态 3D Touch 不显示导航和标签栏

3D Touch 快速操作无法快速运行 3

仅使用Stack类中的构造函数、push()、peek()、pop()、以及empty()等方法实现任意长度数组的逆序

快捷方式的 3D Touch 崩溃

带有选项卡式导航的 Cocoa-Touch 后退按钮

使用 3D Touch 的精简预览视图