7

我已经在我的应用程序中实现了 peek and pop 并且它运行良好。但是在连续尝试 7-8 次后,该应用程序冻结在 peek view 上。我唯一的选择是杀死应用程序并重新运行。请告诉我冻结的原因。我在我的项目中使用了以下代码进行查看和弹出:

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

3 回答 3

3

这是我几个月前向苹果工程师提出的一个问题,到目前为止他们还没有回答。如果您调试视图层次结构,您会注意到 UITransitionView 层是最顶层的视图,并且它没有被删除。这就是导致应用程序冻结的原因。实际上,应用程序的功能并没有被冻结——它仍然可以按预期工作,但是 UI 是“卡住”的。这是我在 Stack Overflow 上的原始帖子:Force Touch Animation 如果轻轻触摸就会冻结

于 2016-03-11T08:18:17.193 回答
1

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

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

解决此问题后,一切都按预期工作。

于 2017-09-23T15:05:24.810 回答
1

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

如果您的视图控制器需要支持强制触摸预览,您需要通过调用- (id <UIViewControllerPreviewing>)registerForPreviewingWithDelegate:(id<UIViewControllerPreviewingDelegate>)delegate sourceView:(UIView *)sourceView NS_AVAILABLE_IOS(9_0);方法向委托注册此 vc 来执行此操作。

我只是突然调用了这个函数两次(一次在 super class 中viewDidLoad(),一次在 sub vc 中),当我在 sub vc 中删除一次时,这个 bug 修复了!惊人...

它仍然是 Apple 的错误,因为它没有任何意义。但是,希望这个答案可以帮助与我有同样问题的开发人员。

于 2016-07-05T06:29:09.900 回答