编辑 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 出现光标定位错误?的主要内容,如果未能解决你的问题,请参考以下文章

发送到已释放实例 Core Data 的消息

UIButton 从 Core Data 增加一个数组,从另一个类完成

在 Core Data 中从 AppDelegate 执行回滚功能时需要访问 ManagedObjectContext 的同一实例

iPhone 上 Core-Data 中的字符串被截断

Core Data 在 Swift 中将数据添加到关系中

在 Core Data 中检测字符串或整数