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

iOS ShareLink初始化崩溃及点击时执行格式化函数需求问询

问题背景

在iOS 16及以上系统开发中,尝试通过ShareLink分享结构体数组的格式化内容,直接传入observedObject.toFormattedString()作为分享项时,遇到两个问题:

  • 当@AppStorage存储的数组非空时,应用启动立即触发Thread 1: EXC_BAD_ACCESS崩溃
  • 希望实现仅点击分享按钮时才调用格式化函数,但闭包形式的ShareLink在工具栏(Toolbar)中无法正常工作

崩溃原因定位

崩溃的核心原因是格式化函数中使用了String(format: "%s %s %s", a, b, c)的写法:

  • %s是C语言风格的格式符,要求传入UnsafePointer<CChar>类型的C字符串
  • 直接传入Swift的String类型会导致内存访问越界,触发EXC_BAD_ACCESS错误
  • 改用Swift原生的字符串插值"\(a) \(b) \(c)"后,崩溃完全消失

解决方案

1. 修复崩溃:替换C风格字符串格式化写法

将原来的格式化函数:

func toFormattedString() -> String {
    // 错误写法:导致崩溃
    return String(format: "%s %s %s", item.a, item.b, item.c)
}

修改为Swift原生字符串插值:

func toFormattedString() -> String {
    // 正确写法:避免内存错误
    return "\(item.a) \(item.b) \(item.c)"
}

2. 实现仅点击分享时调用格式化(适配Toolbar)

闭包形式的ShareLink在Toolbar中兼容性差,可通过绑定临时@State变量的方式实现延迟调用:

struct ContentView: View {
    @ObservedObject var viewModel: YourViewModel
    @AppStorage("savedItems") var storedItems: [YourStruct] = []
    // 临时存储分享内容,初始为nil
    @State private var sharedText: String? = nil
    
    var body: some View {
        MainContentView()
            .toolbar {
                // 绑定可选值的ShareLink,仅当sharedText有值时触发分享
                ShareLink(item: $sharedText) {
                    Image(systemName: "square.and.arrow.up")
                }
                // 点击时才调用格式化函数生成内容
                .onTapGesture {
                    sharedText = viewModel.toFormattedString()
                }
            }
    }
}

这种方式既保证了只有点击分享按钮时才执行格式化逻辑,又适配了Toolbar的使用场景,避免了启动时提前调用格式化函数导致的问题。

内容的提问来源于stack exchange,提问作者BPDev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 08:17:20