3D Touch Peek / Pop with Navigation Controller

时间:2017-02-20 17:31:24

标签: ios swift uinavigationcontroller 3dtouch

此问题与here

中的其他问题有些相关

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

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'中留下的导航控制器?

1 个答案:

答案 0 :(得分:1)

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

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

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