更新选择器中列出的对象后视图关闭/崩溃

问题描述 投票:0回答:0

我有一个显示跑步锻炼细节的视图。在此视图中,我有 Picker,允许用户选择锻炼中使用的一双鞋。一旦用户选择了这双鞋并按下“更新”按钮,鞋子的里程就会更新。里程数是鞋子实体的一个属性(核心数据)

核心数据对象的更新工作正常(数据按预期更新),但视图崩溃。最初我认为这是一个核心数据问题,但现在我认为选择器正在努力更新选择器中列出的对象。

我正在尝试,因此仍然有一些不必要的代码行(一旦它工作正常,我必须清理它)。

这是我声明属性/变量的方式:

@State private var wOshoes = [WorkoutShoeEntity]()
@State private var selectedShoe = ShoeEntity ()
@State private var unselectedShoe: ShoeEntity?
@State private var newShoe: ShoeEntity?
@State private var initialShoe = String()
@State private var buttonDisabled = true
@FetchRequest(sortDescriptors: []) var shoes: FetchedResults<ShoeEntity>
@FetchRequest(sortDescriptors: []) var workoutShoes: FetchedResults<WorkoutShoeEntity>
@Environment(\.managedObjectContext) var moc

这里是景色:

HStack{
        Label("Summary", systemImage:"shoeprints.fill")
            .font(.headline)
            .foregroundColor(.gray)
            .labelStyle(.iconOnly)
        Picker ("Select your shoes", selection: $selectedShoe){
            Text(initialShoe).tag(UUID())
            ForEach(shoes, id: \.self){ shoe in
                Text (shoe.name ?? "Fehlerteufel").tag(Optional(shoe))
                
            }
        }.onTapGesture {
            buttonDisabled.toggle()
        }
        Spacer()
        Button("Update"){
            updateMileage()
            buttonDisabled.toggle()
        }.disabled(buttonDisabled)
    }
    .padding(20)
    .onAppear(){
        initialShoe = "No shoe assigned..."
        getShoe()
        print(wOshoes.count)
        if (wOshoes.count>0){
            print ("schon schuhe dran")
            selectedShoe = getShoeDetails(shoeID: (wOshoes.first?.shoeID)!)
            initialShoe = getShoeName(shoeID: (wOshoes.first?.shoeID)!)
        }
        
        
    }
        
}

updateMileage() 函数是这样的:

    func updateMileage(){
    
    if(wOshoes.count>0){
        print ("Bereits ein Schuh zugewiesen")
        unselectedShoe = getShoeDetails(shoeID: (wOshoes.first?.shoeID)!)
        let value = (unselectedShoe?.distance ?? 0.0) - (workout.distance ?? 0.0)
        updateShoeDistance(shoe: unselectedShoe!, newValue: value)
        
        let value1 = (selectedShoe.distance ?? 0.0) + (workout.distance ?? 0.0)
        
        updateShoeWorkAssignment(shoeWorkout: wOshoes.first!, shoe: selectedShoe)
        newShoe = getShoeDetails(shoeID: (selectedShoe.id)!)
        updateShoeDistance(shoe: selectedShoe.self, newValue: value1)
    }else{
        /*print ("noch kein Schuh zugewiesen")
        
        let value = (selectedShoe.distance ?? 0.0) + (workout.distance ?? 0.0)
        //updateShoeDistance(shoe: selectedShoe!.self, newValue: value)
        assignNewShoeToWorkout(shoeID: (selectedShoe.id)!, workoutID: workout.id)
       selectedShoe?.name = "ich habe es aktualisiert"
        
        newShoe = getShoeDetails(shoeID: (selectedShoe.id)!)
        //newShoe?.mainImage = "Das wäre Image"
        print (newShoe)*/
    }
    
    
}

updateDistance函数如下:

func updateShoeDistance(shoe: ShoeEntity, newValue: Double){
    
    print(shoe.description)
    shoe.distance = newValue
    shoe.setValue(newValue, forKey: "distance")
    try? moc.save()
}

如前所述,核心数据对象正在更新,但视图在更新过程后关闭。我在控制台中没有收到任何错误消息。我认为问题出在选择器上。

有人能给我一些小费吗?

swift swiftui core-data picker
© www.soinside.com 2019 - 2024. All rights reserved.