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

