iOS 18中PHPickerViewController全屏显示且无法选择或关闭问题
iOS 18下PHPickerViewController全屏无响应问题排查思路
1. 简化并检查PHPickerConfiguration配置
iOS 18可能对配置参数有新约束,先尝试极简配置验证基础功能:
let config = PHPickerConfiguration() config.selectionLimit = 1 let picker = PHPickerViewController(configuration: config) picker.delegate = self // 后续present逻辑不变
同时确认Info.plist中相册权限描述NSPhotoLibraryUsageDescription已正确配置,且用户已授权相册访问权限——iOS 18对权限校验可能更严格。
2. 修正ViewController的Present层级
直接使用window?.rootViewControllerpresent可能存在层级问题,换用当前活跃的顶层ViewController来弹出picker:
// 先实现顶层VC获取方法 func topViewController(controller: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? { if let navVC = controller as? UINavigationController { return topViewController(controller: navVC.visibleViewController) } if let tabVC = controller as? UITabBarController { if let selectedVC = tabVC.selectedViewController { return topViewController(controller: selectedVC) } } if let presentedVC = controller?.presentedViewController { return topViewController(controller: presentedVC) } return controller } // 调用顶层VC弹出picker if let topVC = topViewController() { topVC.present(phPicker, animated: true) }
另外可尝试直接用FlutterViewController实例present,而非通过window的rootVC。
3. 确保Delegate实现完整
iOS 18可能要求必须实现PHPickerViewControllerDelegate的核心方法,否则picker无法响应交互:
// 确保类遵循协议 class YourClass: NSObject, PHPickerViewControllerDelegate { // 必须实现该方法处理选择完成/关闭操作 func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) { picker.dismiss(animated: true) // 按需处理选择结果 } }
同时确认phPicker.delegate = self的赋值代码没有遗漏。
4. 调整ModalPresentationStyle
尝试手动设置picker的弹出样式,适配iOS 18的默认行为变更:
phPicker.modalPresentationStyle = .pageSheet // 或.automatic/.fullScreen
5. 升级Flutter插件版本
如果使用的是旧版image_picker,执行flutter pub upgrade image_picker升级到最新版本——插件大概率已针对iOS 18做了兼容性修复。
内容的提问来源于stack exchange,提问作者Liangwei Chen
相关产品推荐
相关产品推荐

