App在iPhone 6s的'peek and pop'实现中处于冻结状态

我在我的应用程序中实现了窥视和流行,并且完美地工作。 但在不断尝试7-8次,该应用程序冻结偷看视图。 我唯一的选择是杀死应用程序并重新运行。 请让我知道冻结的原因。 我在我的项目中使用了以下代码来查看和弹出窗口:

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) 
}

这是我在几个月前向苹果工程师提出的问题,迄今为止还没有答案。 如果您调试视图层次结构,您会注意到UITransitionView图层是最顶层的视图,并且不会被删除。 这就是导致应用程序冻结的原因。 实际上,该应用程序的功能并未冻结 - 它仍能按预期运行,但用户界面“卡住”。 这里是我在堆栈溢出的原始帖子:如果轻轻触摸,Force Touch动画会冻结


我找到了这个错误的原因。

如果你的视图控制器需要支持强制触摸的预览,你需要通过调用- (id <UIViewControllerPreviewing>)registerForPreviewingWithDelegate:(id<UIViewControllerPreviewingDelegate>)delegate sourceView:(UIView *)sourceView NS_AVAILABLE_IOS(9_0);注册这个vc,它代表的是- (id <UIViewControllerPreviewing>)registerForPreviewingWithDelegate:(id<UIViewControllerPreviewingDelegate>)delegate sourceView:(UIView *)sourceView NS_AVAILABLE_IOS(9_0); 方法来做到这一点。

我只是突然调用这个函数两次(一次在超类的viewDidLoad() ,一次在子vc的),当我在我的子vc中删除一次,这个错误修复! 惊人...

它仍然是一个苹果的错误,因为它不会发生这种情况。 不过,希望这个答案可以帮助那些与我有同样问题的开发者。


我发现了这个bug的另一个可能的原因。

在viewControllerForLocation中,我实例化了一个视图控制器来显示...

func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {
    let vc = VCImageFullScreen.loadView()
    return vc
}

...但是这个ViewController在viewDidAppear中有一个错误的超级调用:

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

解决这个问题后,一切按预期工作。

链接地址: http://www.djcxy.com/p/90565.html

上一篇: App is freezing in 'peek and pop' implementation in iPhone 6s

下一篇: Spotify session management