3dtouch尝试提供已经呈现的* * *(null)

时间:2016-05-16 08:20:52

标签: ios objective-c 3dtouch

我的应用程序在没有3Dtouch实现的情况下工作正常;但随着3Dtouch的添加,应用程序继续运行良好并正常旋转直到使用3D触摸(窥视或弹出);我有一个tableViewCell处理peek / pop和预览委托。演示文稿将完成两次并在控制台中触发:@"警告:尝试呈现已经呈现的内容(null)

1 个答案:

答案 0 :(得分:0)

我遇到过同样的问题。原因是您在cellForRowAtIndexPath中注册表格视图单元格。

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    // myTableViewCell is created or reused here
    ...
    registerForPreviewingWithDelegate(self, sourceView: myTableViewCell)
    ...

}

这会导致单元格在表格视图中重复使用多次。但是不允许使用registerForPreviewingWithDelegate多次注册同一个视图,这会导致您描述的警告和轮换问题。

请参阅Apple documentation

  

您可以为单个注册的人指定多个源视图   视图控制器,但您不能将单个视图指定为源   查看不止一次。

解决方案很简单。在您再次注册之前检查视图是否已经注册,并在必要时取消注册。

private var previewingContexts = [MyTableViewCellClass: UIViewControllerPreviewing]()

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    // myTableViewCell is created or reused here
    ...
    if let previewingContext = previewingContexts[myTableViewCell] {
        unregisterForPreviewingWithContext(previewingContext)
    }

    let previewingContext = registerForPreviewingWithDelegate(self, sourceView: myTableViewCell)
    previewingContexts[myTableViewCell] = previewingContext
    ...

}

您还可以使用此处描述的方法: http://krakendev.io/peek-pop/ 这使用location参数传递给委托,以找出被点击的单元格。通过这种方式,您只需注册整个表视图而不是每个单元格。这可能是一个更好的解决方案。在我的情况下,这是不可能的,因为我在tableview单元格中嵌套了集合视图,因此它更复杂。