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

Swift中iPad端HSAttachmentPicker崩溃问题解决求助

解决HSAttachmentPicker在iPad上崩溃的问题

崩溃原因是iPad上UIAlertControllerStyleActionSheet样式的弹窗必须通过popoverPresentationController指定显示位置(sourceView/sourceRect或barButtonItem),第三方框架未处理该适配逻辑,我们可以在自己的代理方法中补充适配代码,无需修改框架源码。

修改步骤:

  1. 在你的控制器中添加变量,保存点击的上传按钮引用:
class PostEnquiryViewController: UIViewController {
    let picker = HSAttachmentPicker()
    weak var currentUploadButton: UIButton? // 新增变量
    
    // ... 其他原有代码
}
  1. 更新上传按钮点击事件,保存按钮引用:
@IBAction func uploadButtonTapped(_ sender: UIButton) {
    currentUploadButton = sender // 保存触发点击的按钮
    picker.delegate = self
    picker.showAttachmentMenu()
}
  1. 修改代理的show controller方法,补充iPad适配逻辑:
func attachmentPickerMenu(_ menu: HSAttachmentPicker, show controller: UIViewController, completion: (() -> Void)? = nil) {
    // 为iPad上的ActionSheet弹窗设置popover锚点
    if let alert = controller as? UIAlertController,
       alert.preferredStyle == .actionSheet,
       let popover = alert.popoverPresentationController,
       let button = currentUploadButton {
        popover.sourceView = button
        popover.sourceRect = button.bounds
        popover.permittedArrowDirections = .down // 可选:指定弹窗箭头方向
    }
    
    self.present(controller, animated: true, completion: completion)
}

原理说明:

iPad上ActionSheet默认以popover形式展示,系统强制要求指定弹窗的锚点位置。通过在代理方法中拦截框架传递的UIAlertController,为其popoverPresentationController设置来源视图(点击的上传按钮),即可满足系统要求,避免崩溃。

内容的提问来源于stack exchange,提问作者Swift

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 17:01:04