SwiftUI绑定TextField给absoluteString赋值报只读属性错误如何解决
错误原因
URL结构体的absoluteString是只读计算属性,仅对外提供取值能力,没有实现赋值逻辑,不支持直接修改。你在自定义Binding的set闭包中直接给self.navigationState.url?.absoluteString赋值,属于对只读属性的写入操作,是触发编译报错的直接原因。- 原set逻辑还有一个隐含问题:可选链
?.的赋值操作在url为nil时不会执行任何写入,即使absoluteString可写,也无法在url为空时通过输入内容初始化新的URL值。
修复方法
不要尝试直接修改URL实例的absoluteString,在set闭包中把用户输入的字符串处理后生成新的URL实例,直接赋值给navigationState.url即可,参考修改后的实现:
@ObservedObject var navigationState = NavigationState() // 地址栏 TextField("请输入网址", text: Binding<String>( get: { self.navigationState.url?.absoluteString ?? "" }, set: { inputText in let trimmedText = inputText.trimmingCharacters(in: .whitespacesAndNewlines) // 按需补全协议头,避免用户未输入http/https时URL初始化失败 var finalUrlStr = trimmedText if !finalUrlStr.hasPrefix("http://") && !finalUrlStr.hasPrefix("https://") { finalUrlStr = "https://" + finalUrlStr } self.navigationState.url = URL(string: finalUrlStr) })) .textFieldStyle(RoundedBorderTextFieldStyle()) .padding(.top, 1.5) .onSubmit { // 保留你原有的网页加载逻辑即可 guard let targetUrl = navigationState.url else { return } // 执行webView加载操作 }
- 上述实现兼容
url为可选类型的场景:用户清空输入框时,URL(string: "")会返回nil,和get块的空字符串兜底逻辑完全对齐,不会出现状态不一致问题。 - 你可以根据自己的业务需求调整set块里的字符串处理逻辑,比如对本地路径、自定义scheme的特殊处理。
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

