【发布时间】:2020-05-15 22:37:03
【问题描述】:
我正在尝试修复 Xcode 控制台中的 UIKit 警告请求帮助:
客户端应用程序错误 - UITargetedPreview 的视图或容器当前都不在窗口中。这违反了 UIDragInteraction API 合同,并可能导致严重的视觉故障。
我有一个UITableView 的拖动源,它实现了UITableViewDragDelegate。表视图位于拆分视图主视图内,目标位于拆分视图控制器内。拖放交互完美运行。问题是来自 Xcode 的相当可怕的错误!
UIDragItem 由以下人员生成:
extension Store: NSItemProviderWriting {
var dragItem: UIDragItem {
let dragItem = UIDragItem(itemProvider: NSItemProvider(object: self))
dragItem.localObject = self
dragItem.previewProvider = {
let image = UIImageView(image: self.imageFront)
image.frame = CGRect(x: 0, y: 0, width: 40, height: 40) // magic number for store preview size
return UIDragPreview(view: image)
}
return dragItem
}
}
我已尝试中断所有 UIDragDelegate 方法,但在生成预览时出现警告,这似乎是在此过程的后期。
我会发布我的拖动方法,看看我是否遗漏了什么。
提前致谢。
// MARK: - Table view drag delegate
extension StoresTableViewController: UITableViewDragDelegate {
func tableView(_ tableView: UITableView, itemsForBeginning session: UIDragSession, at indexPath: IndexPath) -> [UIDragItem] {
return [stores[indexPath.row].dragItem]
}
func tableView(_ tableView: UITableView, dragSessionWillBegin session: UIDragSession) {
guard let draggedStore = session.items.first?.localObject as? Store else { return }
if draggedStore.maxSimilarStores > session.items.count {
tableView.performBatchUpdates({
let index = stores.firstIndex(of: draggedStore)!
stores.remove(at: index)
stores.insert(draggedStore.copy() as! Store, at: index)
tableView.reloadRows(at: [IndexPath(row: index, section: 0)], with: .fade)
}, completion: nil)
}
}
func tableView(_ tableView: UITableView, itemsForAddingTo session: UIDragSession, at indexPath: IndexPath, point: CGPoint) -> [UIDragItem] {
guard let draggedStore = session.items.first?.localObject as? Store else { return [] }
let tableStore = stores[indexPath.row]
if draggedStore.name == tableStore.name && draggedStore.maxSimilarStores > session.items.count {
return [tableStore.dragItem]
} else {
return []
}
}
func tableView(_ tableView: UITableView, dragPreviewParametersForRowAt indexPath: IndexPath) -> UIDragPreviewParameters? {
guard let cell = tableView.cellForRow(at: indexPath) as? StoreTableViewCell else { return nil }
let parameters = UIDragPreviewParameters()
parameters.visiblePath = UIBezierPath(rect: cell.storeImageView.frame)
return parameters
}
}
我已经创建了一个调试项目来重现:
https://github.com/atapp/iTOLD_DEBUG
谢谢
【问题讨论】: