我已经在我的应用程序中实现了窥视和弹出,它完美无缺。但是在不断尝试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)
}
答案 0 :(得分:3)
这是我几个月前在苹果工程师面前提出的一个问题,到目前为止他们没有回答。如果您调试视图层次结构,您会注意到UITransitionView图层是最顶层的视图,并且未被删除。这就是导致应用冻结的原因。实际上,该应用程序的功能并未冻结 - 它仍然按预期工作,但UI“卡住”。这是我在Stack Overflow上的原始帖子:Force Touch animation freezes if gently touched
答案 1 :(得分:1)
我找到了这个错误的原因。
如果您的视图控制器需要支持强制触摸预览,则需要通过调用- (id <UIViewControllerPreviewing>)registerForPreviewingWithDelegate:(id<UIViewControllerPreviewingDelegate>)delegate sourceView:(UIView *)sourceView NS_AVAILABLE_IOS(9_0);
方法向委托人注册此vc来执行此操作。
我只是突然调用了这个函数两次(一次在超级的viewDidLoad()
,一次在sub vc&s;),当我在我的子vc中删除一次时,这个错误修复了!惊人...
它仍然是一个苹果虫,因为它没有发生这种情况。但是,希望这个答案可以帮助那些与我有同样问题的开发人员。
答案 2 :(得分: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)
...
}
}
修复此问题后,一切都按预期工作。