iPhone 6s 中“peek and pop”功能的应用程序卡顿。

7

我已经在我的应用程序中实现了peek和pop功能,而且它运行得非常完美。但是在连续尝试7-8次之后,应用程序会在peek视图上冻结。我唯一的选择就是杀死应用程序并重新运行。请告诉我冻结的原因。我在我的项目中使用了以下代码来实现peek和pop:

var isPresentedBy3Dtouch: Bool = false
var passedDetails:DetailModel!

func previewingContext(previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {

  guard let indexPath = tableView?.indexPathForRowAtPoint(location)
    else { return nil }

  guard let cell = tableView?.cellForRowAtIndexPath(indexPath)
    else { return nil }

  guard let detailViewController = self.storyboard?.instantiateViewControllerWithIdentifier("Navigation") as? UINavigationController
    else { return nil }

   (detailViewController.topViewController as! DetailViewController).passedDetails = self.customerLists[indexPath.row]
   (detailViewController.topViewController as! DetailViewController).isPresentedBy3Dtouch = true
   detailVC.preferredContentSize = CGSize(width: 0.0, height: 480.0)
    previewingContext.sourceRect = cell.frame
    return detailVC
}

func previewingContext(previewingContext: UIViewControllerPreviewing, commitViewController viewControllerToCommit :UIViewController) {
    showViewController(viewControllerToCommit, sender: self) 
}
3个回答

3
这是我数月前向苹果工程师提出的问题,但至今尚未收到他们的答复。如果你调试视图层次结构,你会注意到一个名为UITransitionView的图层是最上面的视图,它没有被移除。这就是导致应用程序冻结的原因。实际上,应用程序的功能并没有冻结 - 它仍然按预期工作,但界面却“卡住”了。以下是我在Stack Overflow上发布的原始帖子:Force Touch 动画在轻触时冻结

我在使用xCode 9 GM时遇到了同样的问题... 我没有重复调用... 你是否获得了任何额外的信息? - HixField

1
我找到了另一个可能导致这个错误的原因。
在viewControllerForLocation中,我实例化了一个视图控制器以显示...
func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {
    let vc = VCImageFullScreen.loadView()
    return vc
}

...但是这个视图控制器在它的viewDidAppear中调用了错误的super方法:

    class VCImageFullScreen : UIViewController {
        override func viewDidAppear(_ animated: Bool) {
            super.viewWillAppear(animated)
            //BUG --> should be super.view**Did**Appear(animated)
            ...
        }
    }

修复了这个问题之后,一切都按预期工作。


1
我找到了这个 bug 的原因。
如果您的视图控制器需要支持 3D Touch 预览,您需要通过调用 - (id <UIViewControllerPreviewing>)registerForPreviewingWithDelegate:(id<UIViewControllerPreviewingDelegate>)delegate sourceView:(UIView *)sourceView NS_AVAILABLE_IOS(9_0); 方法来注册此 VC 与委托。
我突然调用了这个函数两次(一次在超类的 viewDidLoad() 中,一次在子 VC 中),当我在子 VC 中删除其中一个时,这个 bug 就被修复了!太神奇了...
这仍然是一个苹果的 bug,因为这没有任何意义。但是,希望这个答案能帮助遇到同样问题的开发人员。

@UmarFarooque 删除调用该函数的一次即可解决我的问题。 - kimimaro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接