iPad无表视图时UIButton拖拽自定义预览报错求助
问题:自定义拖拽预览触发UIDragInteraction断言错误
我开发了一款iPad应用,左侧视图包含若干UIButton,希望将按钮拖拽至右侧时使用自定义简单视图作为拖拽预览,未使用UITableView或UICollectionView,所有元素均为UIView或其子类。功能运行正常,但按住按钮开始拖拽时,控制台出现错误:
2022-09-30 09:58:37.378254-0400 MyApp[9837:259879] [Assert] CLIENT APP ERROR - Neither the view or container of the UITargetedPreview is currently in a window. This is in violation of UIDragInteraction API contract and can cause a severe visual glich. THIS IS A CLIENT APP BUG and will soon be a hard assert. PLEASE FIX ME
注释掉item.previewProvider代码块后,报错消失但拖拽预览变为按钮虚影。现有资料多针对表视图拖拽场景,未找到适配方案,求解决思路。另外,警告中'glitch'拼写错误,是否需提交反馈?
解决思路
- 确保自定义预览视图关联窗口层级:
断言错误的核心原因是你创建的UITargetedPreview对应的视图(或其容器)未处于当前窗口的视图层级中。解决时可以在生成预览前,将自定义预览视图临时添加到窗口内的某个容器(比如按钮的父视图、主窗口根控制器视图),再创建UITargetedPreview,之后可立即移除该临时视图:item.previewProvider = { let customPreview = YourCustomPreviewView() // 临时添加到按钮父视图,确保处于窗口层级 self.button.superview?.addSubview(customPreview) customPreview.isHidden = true // 避免临时显示 let preview = UITargetedPreview(view: customPreview) customPreview.removeFromSuperview() return preview } - 基于按钮快照生成自定义预览:
若不需要完全自定义的视图结构,可先对按钮生成快照,再修改快照视图作为预览。快照视图基于已在窗口中的按钮生成,不会触发断言:item.previewProvider = { guard let snapshot = self.button.snapshotView(afterScreenUpdates: true) else { return UITargetedPreview(view: self.button) } // 自定义调整快照,比如修改尺寸、添加装饰 snapshot.frame = CGRect(x: 0, y: 0, width: 100, height: 100) return UITargetedPreview(view: snapshot) } - 检查预览参数配置:
如果使用了UITargetedPreviewParameters,确认未错误设置容器视图,避免预览视图脱离当前窗口层级。
关于警告中的拼写错误
可以通过Apple反馈助手提交这个拼写错误('glich'应为'glitch'),这类细节反馈有助于Apple完善系统提示信息,提交是有意义的。
内容的提问来源于stack exchange,提问作者BP.
相关产品推荐
相关产品推荐

