我的应用程序在没有3Dtouch实现的情况下工作正常;但随着3Dtouch的添加,应用程序继续运行良好并正常旋转直到使用3D触摸(窥视或弹出);我有一个tableViewCell处理peek / pop和预览委托。演示文稿将完成两次并在控制台中触发:@"警告:尝试呈现已经呈现的内容(null)
答案 0 :(得分:0)
我遇到过同样的问题。原因是您在cellForRowAtIndexPath
中注册表格视图单元格。
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
// myTableViewCell is created or reused here
...
registerForPreviewingWithDelegate(self, sourceView: myTableViewCell)
...
}
这会导致单元格在表格视图中重复使用多次。但是不允许使用registerForPreviewingWithDelegate
多次注册同一个视图,这会导致您描述的警告和轮换问题。
您可以为单个注册的人指定多个源视图 视图控制器,但您不能将单个视图指定为源 查看不止一次。
解决方案很简单。在您再次注册之前检查视图是否已经注册,并在必要时取消注册。
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单元格中嵌套了集合视图,因此它更复杂。