2016-03-11 23 views
7

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

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

回答

2

这是我在苹果公司一年前从他们至今长大的工程师在没有答案的问题。如果您调试视图层次结构,您会注意到UITransitionView图层是最顶层的视图,并且不会被删除。这就是导致应用程序冻结的原因。实际上,该应用程序的功能并未冻结 - 它仍能按预期运行,但用户界面“卡住”。这里是我在堆栈溢出这里的原始帖子:Force Touch animation freezes if gently touched

+0

我与xCode 9 GM有同样的问题...我没有双重电话...你有没有得到任何额外的信息? – HixField

1

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

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

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

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

+0

该bug的任何更新? –

+0

@UmarFarooque删除一次该函数的调用修复了我的问题。 – kimimaro

1

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

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

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

...但这个视图控制器已经在其viewDidAppear一个错误的超级电话:

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

修复此问题后,一切都按预期工作。