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
相关产品推荐
相关产品推荐

