编辑 Core Data 类实例字符串时,SwiftUI List 中的 TextField 出现光标定位错误?
Posted
技术标签:
【中文标题】编辑 Core Data 类实例字符串时,SwiftUI List 中的 TextField 出现光标定位错误?【英文标题】:TextField within SwiftUI List has cursor positioning error when editing Core Data class instance string? 【发布时间】:2020-04-17 01:23:45 【问题描述】:在 SwiftUI 列表中的 TextField 中编辑文本时,出现光标定位错误?任何想法如何避免这种情况?请参阅随附的视频和代码。
注意 - 不确定这是否重要,但 gcTask 是一个 NSManagedObject(即核心数据类实例)。
更新:现在确认此问题确实与 TextField 字符串变量与 Core Data 类实例字符串属性相关联的情况直接相关。在这种情况下,核心数据 NSManagedClass GCTask 有一个字符串属性“title”。这就是为什么我的核心数据使用会出现这个问题,而如果我只使用本地 @State 字符串变量就不会出现这个问题?
背景:想要一个简单的待办事项列表,能够点击一行并进行内联编辑,这在某些应用程序中确实可以看到。只是想了解如何在 SwiftUI 中执行此操作。
代码:
struct GCTaskRow : View
@ObservedObject var gcTask: GCTask
@State var beingEdited : Bool = false
var body: some View
HStack
Image(systemName: gcTask.completed ? "checkmark.square" : "square")
.onTapGesture
self.gcTask.completed.toggle()
GCCoreData.save()
VStack
TextField(
"Enter:",
text: $gcTask.title,
onEditingChanged: changed in
print("\(self.gcTask.title) => onEditingChanged = \(changed)")
self.beingEdited = changed
,
onCommit:
print("\(self.gcTask.title) => onCommit")
// GCCoreData.save() // normally save here
)
动画 GIF - 当我在 TextField 中单击并输入 1、2、3、4、5 时会发生什么:
【问题讨论】:
【参考方案1】:以下简单的测试在 ios 13.4.1 和催化剂上对我很有效。 这表明 gcTask 是问题的根源。
import SwiftUI
struct ContentView: View
@State var gcTask = "xxxx"
@State var beingEdited = false
var body: some View
List
TextField("Enter:", text: $gcTask,
onEditingChanged: changed in
print("\(self.gcTask) => onEditingChanged = \(changed)")
self.beingEdited = changed
,
onCommit:
print("\(self.gcTask) => onCommit")
// where I'll put code to save/finalise update
)
【讨论】:
tks - 让我试试 - re gcTask (来自我的核心数据 GCTask 类),我已经在问题中为视图添加了更多代码 - 不知道这可能会触发问题(相对于本地@State 变量)? 是的,确认它特定于我的 GCTask 核心数据实例属性。我会更新问题以使其更清楚。以上是关于编辑 Core Data 类实例字符串时,SwiftUI List 中的 TextField 出现光标定位错误?的主要内容,如果未能解决你的问题,请参考以下文章
UIButton 从 Core Data 增加一个数组,从另一个类完成
在 Core Data 中从 AppDelegate 执行回滚功能时需要访问 ManagedObjectContext 的同一实例