You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 20:50:31