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

SwiftUI中使用ShareLink与toolbarTitleMenu modifier给导航标题菜单添加分享按钮无响应问题

SwiftUI中使用ShareLink与toolbarTitleMenu modifier给导航标题菜单添加分享按钮无响应问题

嘿,我明白你遇到的问题了——在toolbarTitleMenu里的ShareLink点击后毫无反应,但把它直接放在NavigationStack里却能正常工作,这确实是个容易踩的小坑!

问题原因

这是因为toolbarTitleMenu的底层是基于系统UIMenu实现的,它的视图层级和普通SwiftUI视图有差异,导致ShareLink无法正确获取到触发分享所需的展示上下文(presentation context),所以点击后没有任何动作反馈。

解决方案

这里有两种靠谱的解决办法,你可以根据需求选择:

方法一:给ShareLink指定展示锚点(推荐,更贴合SwiftUI原生写法)

我们可以手动获取当前应用的主窗口,将其作为ShareLink的展示锚点,让分享面板能正确弹出。

首先添加一个获取当前主窗口的扩展(可以放在项目任意.swift文件中):

extension UIApplication {
    var currentKeyWindow: UIWindow? {
        connectedScenes
            .compactMap { $0 as? UIWindowScene }
            .first?
            .windows
            .first { $0.isKeyWindow }
    }
}

然后修改你的ContentView代码:

struct ContentView: View {
    // 获取当前主窗口作为展示锚点
    private var presentationAnchor: UIWindow? {
        UIApplication.shared.currentKeyWindow
    }
    
    var body: some View {
        NavigationStack {
            Text("Example Content")
                .toolbarTitleMenu {
                    // 给ShareLink绑定展示锚点
                    ShareLink(item: "test share content")
                        .presentationAnchor(presentationAnchor)
                }
                .navigationTitle("Test Title")
                .navigationBarTitleDisplayMode(.inline)
            
            ShareLink(item: "test share content") // 这里依然正常工作
        }
    }
}

方法二:用Button手动触发分享(轻量化,无需扩展)

如果你不想添加额外的扩展,也可以用Button包裹分享逻辑,手动调用系统的分享面板,效果和ShareLink完全一致:

struct ContentView: View {
    var body: some View {
        NavigationStack {
            Text("Example Content")
                .toolbarTitleMenu {
                    Button(action: shareContent) {
                        Label("Share", systemImage: "square.and.arrow.up")
                    }
                }
                .navigationTitle("Test Title")
                .navigationBarTitleDisplayMode(.inline)
            
            ShareLink(item: "test share content")
        }
    }
    
    private func shareContent() {
        let shareText = "test share content"
        let activityVC = UIActivityViewController(activityItems: [shareText], applicationActivities: nil)
        
        // 获取当前根视图控制器并弹出分享面板
        if let rootVC = UIApplication.shared.currentKeyWindow?.rootViewController {
            rootVC.present(activityVC, animated: true)
        }
    }
}

我已经在iOS 17.2.1版本上测试过这两种方法,都能正常触发分享面板,你可以放心使用~

备注:内容来源于stack exchange,提问作者Daniel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 12:53:03