Swift中iPad端HSAttachmentPicker崩溃问题解决求助
解决HSAttachmentPicker在iPad上崩溃的问题
崩溃原因是iPad上UIAlertControllerStyleActionSheet样式的弹窗必须通过popoverPresentationController指定显示位置(sourceView/sourceRect或barButtonItem),第三方框架未处理该适配逻辑,我们可以在自己的代理方法中补充适配代码,无需修改框架源码。
修改步骤:
- 在你的控制器中添加变量,保存点击的上传按钮引用:
class PostEnquiryViewController: UIViewController { let picker = HSAttachmentPicker() weak var currentUploadButton: UIButton? // 新增变量 // ... 其他原有代码 }
- 更新上传按钮点击事件,保存按钮引用:
@IBAction func uploadButtonTapped(_ sender: UIButton) { currentUploadButton = sender // 保存触发点击的按钮 picker.delegate = self picker.showAttachmentMenu() }
- 修改代理的
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
相关产品推荐
相关产品推荐

