Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 带导航控制器的3D触控窥视/弹出_Ios_Swift_Uinavigationcontroller_3dtouch - Fatal编程技术网

Ios 带导航控制器的3D触控窥视/弹出

Ios 带导航控制器的3D触控窥视/弹出,ios,swift,uinavigationcontroller,3dtouch,Ios,Swift,Uinavigationcontroller,3dtouch,这个问题与我的另一个问题有些关联 在苹果的示例代码中,我有以下用于3D Touch Peek&Pop的代码: func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? { guard let indexPath = tableView.indexPathForRow(

这个问题与我的另一个问题有些关联

在苹果的示例代码中,我有以下用于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”中显示一个顶部栏(同样,如前所述)。但是,如果我只提交新创建的同一个导航控制器,它会删除所有其他属性,例如后退按钮、自定义推/弹出动画等。因此,当视图控制器“弹出”(提交)时,我必须提取它并将其放回当前导航控制器中

问题 上面的代码工作得很好。然而,我离开了我在Peek内部制作的导航控制器,以防泄露。另外,当我测试泄漏时,它会显示一个小的内存泄漏。我将如何释放/释放在“Pop”中留下的导航控制器?

您所做的工作没有“漏洞”

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

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


我不明白这个问题。你似乎在说你的代码做你想要的。那么问题是什么呢?当我在Pop中提取视图控制器时,我将它包含的导航控制器留在后面,造成内存泄漏。我不相信这一点。如果这是真的,那将是苹果的问题,而不是你的。我正在检查是什么原因造成的。谢谢你的快速回复!根据以上两个要点:如果我为Peek初始化一个视图控制器,为commit初始化另一个视图控制器,这仍然没有负面影响?这并不常见,但我在文档中没有看到任何严格禁止它的内容。