核心数据值检查 - SwiftUi

Posted

技术标签:

【中文标题】核心数据值检查 - SwiftUi【英文标题】:Core Data value check - SwiftUi 【发布时间】:2021-07-20 20:15:46 【问题描述】:

伙计们。

我的 WatchOS 应用允许创建目标。如果标题以前在其他目标中使用过,或者用户在文本字段中没有输入任何内容,我正在尝试禁用该按钮。

所以我尝试获取我的数据,并写了.disabled(goalTitle == item.goalTitle)。但是它会导致问题,如果没有创建的目标,按钮就会消失。在其他情况下,在输入存在的标题后,它会复制按钮 - 一个禁用,一个正在工作。

这是我的观点的代码:

struct AddGoalView: View 
@State private var goalTitle = ""
@FetchRequest (
entity:NewGoal.entity(),
   sortDescriptors:[NSSortDescriptor(keyPath: \NewGoal.dateAdded, ascending: false)],
    animation: .easeInOut )

var results:FetchedResults<NewGoal>

@Environment(\.managedObjectContext) var context
@Environment(\.presentationMode) var presentationMode

var body: some View 
    ScrollView
    VStack (alignment: .leading, spacing: 6)
    TextField("Goal Name...", text: $goalTitle)
            .padding(.bottom)

        ForEach(results)item in ///---> This leads to the Button duplicating
        Button(action: addGoal) 
            Text("Add Goal")
            
        
        .frame(maxWidth: .infinity, alignment: .center)
        .disabled(goalTitle == "")
        .disabled(goalTitle == item.goalTitle) ///---> Here I am trying to disable a button when the user writes down the existed title, to prevent Goal duplicates. 
        
    


private func addGoal()
    let goal = NewGoal(context: context)
    goal.goalTitle = goalTitle
    goal.dateAdded = Date()
    do
        try context.save()
        presentationMode.wrappedValue.dismiss()
    catch let err
        print(err.localizedDescription)
        
    

【问题讨论】:

【参考方案1】:

您可以在results 上使用.contains(where:) 来确定是否已经有使用该标题的目标,而不是使用ForEach 来循环您的元素:

var body: some View 
    ScrollView
        VStack (alignment: .leading, spacing: 6)
            TextField("Goal Name...", text: $goalTitle)
                .padding(.bottom)
            
            Button(action: addGoal) 
                Text("Add Goal")
            .disabled(
                goalTitle.isEmpty ||
                results.contains(where:  $0.goalTitle == goalTitle)
            )
        
    

【讨论】:

以上是关于核心数据值检查 - SwiftUi的主要内容,如果未能解决你的问题,请参考以下文章

在插入之前检查 sqlite 中的重复项(核心数据)

在核心数据中查找重复值

检查 NSFetchedResultsController / Core Data 中的现有值

angularjs

Swift - 将 nil 核心数据字符串转换为可选值

核心数据检查是不是已经保存,Swift