Mac Catalyst中UIPopoverPresentationController的sourceItem兼容问题
兼容iOS 15/16与Mac Catalyst的弹窗源设置方案
针对你遇到的Mac Catalyst编译报错问题,核心原因是Mac Catalyst环境下的UIPopoverPresentationController并未实现sourceItem属性,仅靠版本可用性判断无法绕过编译检查。以下是兼容所有目标环境的代码方案:
let nc = UINavigationController(rootViewController: vc) nc.modalPresentationStyle = .popover #if targetEnvironment(macCatalyst) // Mac Catalyst下直接使用barButtonItem,无sourceItem支持 nc.popoverPresentationController?.barButtonItem = btnAdd #else // iOS环境按系统版本优先使用sourceItem if #available(iOS 16.0, *) { nc.popoverPresentationController?.sourceItem = btnAdd } else { nc.popoverPresentationController?.barButtonItem = btnAdd } #endif
方案说明
- 利用
#if targetEnvironment(macCatalyst)编译条件,将Mac Catalyst的代码分支与iOS隔离,避免编译器在Mac环境下找不到sourceItem属性的问题。 - iOS环境内保留版本判断,优先使用iOS 16新增的
sourceItem,同时兼容iOS 15的barButtonItem。 - 完全覆盖需求:支持iOS 15/16、Mac Catalyst 12.3+,且iOS 16下优先使用非废弃API。
内容的提问来源于stack exchange,提问作者HangarRash
相关产品推荐
相关产品推荐

