iPadOS真机绑定Binding的TextField修改后光标跳至末尾求最优解
问题根因
这是iOS14.x搭配Xcode13测试版时SwiftUI的已知渲染Bug:直接传入的Binding字符串更新时会触发TextField所在视图的不必要重绘,系统未正确保留光标位置,就会出现每输入一个字符光标跳转到末尾的问题,模拟器的渲染逻辑和真机存在差异所以不会复现。
你当前的临时方案确实破坏了单一数据源原则,若外部cameraURL被其他逻辑修改,本地临时State无法同步更新会出现数据不一致问题,可使用以下更优方案:
解决方案
方案1:自定义绑定过滤无意义更新(最优,不破坏单一数据源)
直接基于原@Binding生成自定义绑定,仅在字符串实际发生变更时才更新绑定值,避免触发不必要的视图重绘,无需额外声明临时状态变量:
struct infoSheetView: View { @Binding var cameraURL: String var body: some View { VStack { Form{ Section(header: Text("Camera").font(.title)) { TextField("Camera URL", text: Binding( get: { cameraURL }, set: { newValue in guard newValue != cameraURL else { return } cameraURL = newValue } )) .autocapitalization(.none) .disableAutocorrection(true) } } } .frame(width:400,height:390) } }
方案2:添加固定ID避免视图重制
如果方案1未生效,可以给TextField添加固定的唯一标识,防止系统重绘时把它识别为新视图重置光标:
TextField("Camera URL", text: $cameraURL) .autocapitalization(.none) .disableAutocorrection(true) .id("fixedCameraURLTextField")
方案3:升级开发工具版本
该Bug已在Xcode13正式版及后续版本修复,若你的应用兼容版本可升级至iOS15及以上,升级开发工具到正式版即可彻底解决该问题。
内容的提问来源于stack exchange,提问作者Richard Legault
相关产品推荐
相关产品推荐

