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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 04:50:33