CircleImage продолжает менять цвет после выбора параметра в средстве выбора и добавления в список

У меня возникает эта странная проблема, когда цвет элемента в списке изменяется при добавлении нового элемента с другим цветом, по сути, он не сохраняет свое значение цвета, а занимает новое. Я пытаюсь показать цвет, который соответствует уровню приоритета, выбранному пользователем.

Вот код:

struct PriorityGreen: View {
    var body: some View {
        Circle()
            .frame(width: 20, height: 20)
            .foregroundColor(Color.green)
    }
}

struct PriorityYellow: View {
    var body: some View {
        Circle()
            .frame(width: 20, height: 20)
            .foregroundColor(Color.yellow)
    }
}

struct PriorityOrange: View {
    var body: some View {
        Circle()
            .frame(width: 20, height: 20)
            .foregroundColor(Color.orange)
    }
}

struct PriorityRed: View {
    var body: some View {
        Circle()
            .frame(width: 20, height: 20)
            .foregroundColor(Color.red)
    }
}

Код для просмотра

import SwiftUI

struct AppView: View {
    @ObservedObject var data = Model()

    @State var showViewTwo = false

    var body: some View {
        NavigationView {
            VStack {
                List {
                    ForEach(data.arrayOfTask, id: \.self) { row in
                        HStack {
                            if self.data.priority == 0 {
                                PriorityGreen()
                            } else if self.data.priority == 1 {
                                PriorityYellow()
                            } else if self.data.priority == 2 {
                                PriorityOrange()
                            } else if self.data.priority == 3 {
                                PriorityRed()
                            }
                            Text("\(row)")
                        }
                    }
                        .onDelete(perform: removeItems).animation(.default)
                }
                    .listStyle(GroupedListStyle())
                    .environment(\.horizontalSizeClass, .regular)
            }
                .navigationBarTitle("Tasks")
                .navigationBarItems(leading:
                        EditButton().animation(.default),
                    trailing: Button(action: {
                        self.showViewTwo.toggle()
                    }) {
                        Text("New task")
                    }.sheet(isPresented: $showViewTwo) {
                        ViewTwo(data: self.data, showViewTwo: self.$showViewTwo)
                    })
        }
    }



    func removeItems(at offset: IndexSet) {
        data.arrayOfTask.remove(atOffsets: offset)
    }
}

struct AppView_Previews: PreviewProvider {
    static var previews: some View {
        AppView()
    }
}

struct ViewTwo: View {
    @State var data: Model
    @State var newName = ""
    @State var newCatergory = ""
    @State var newPriorityLevel = ""

    @State var defaultPriorityLevel = 1
    @State var priorityTypes = ["low", "medium", "high", "critical"]


    @Binding var showViewTwo: Bool
    var body: some View {
        NavigationView {
            Form {
                Section(header: Text("Add task name")) {

                    TextField("Name", text: $newName)
                    /*
                    This section will be implementated later on
                    TextField("Catergory", text: $newCatergory)
                    */
                }
                Section(header: Text("Select task priority")) {
                    Picker("Priority Levels", selection: $defaultPriorityLevel) {
                        ForEach(0..<priorityTypes.count) {
                            Text(self.priorityTypes[$0])
                        }
                    }
                        .pickerStyle(SegmentedPickerStyle())
                }
            }
                .navigationBarTitle("New task details")
                .navigationBarItems(trailing:
                        Button("Save") {
                            self.showViewTwo.toggle()
                            self.data.taskName = self.newName
                            self.data.arrayOfTask.append(self.newName)
                            self.data.priority = self.defaultPriorityLevel
                    })
        }
    }
}

struct PriorityCirleView: View {
    var body: some View {
        Circle()
            .frame(width: 20, height: 20)
            .foregroundColor(Color.green)
    }
}
import SwiftUI

enum Catergory {
    case work
    case home
    case family
    case health
    case bills
}

enum Priority {
    case low
    case medium
    case high
    case critical
}



class Model: ObservableObject {
    @Published var taskName = ""
    @Published var taskCategory = ""
    @Published var priority = 0

    @Published var arrayOfTask = [String]()
}

Эта гифка более наглядно демонстрирует проблему.

(Gif)[https://imgur.com/a/ffzpSft]

1 ответ

Решение

У вас есть только один приоритет в вашей модели вместо приоритета для каждой задачи.

Измените свою модель на эту:

class Model: ObservableObject {
    struct Task {
        var taskName = ""
        var taskCategory = ""
        var priority = 0
    }

    @Published var arrayOfTask = [Task]()
}

И обновите свой код, чтобы использовать новую модель:

struct AppView: View {
    @ObservedObject var data = Model()

    @State var showViewTwo = false

    var body: some View {
        NavigationView {
            VStack {
                List {
                    ForEach(data.arrayOfTask, id: \.taskName) { task in
                        HStack {
                            if task.priority == 0 {
                                PriorityGreen()
                            } else if task.priority == 1 {
                                PriorityYellow()
                            } else if task.priority == 2 {
                                PriorityOrange()
                            } else if task.priority == 3 {
                                PriorityRed()
                            }
                            Text("\(task.taskName)")
                        }
                    }
                        .onDelete(perform: removeItems).animation(.default)
                }
                    .listStyle(GroupedListStyle())
                    .environment(\.horizontalSizeClass, .regular)
            }
                .navigationBarTitle("Tasks")
                .navigationBarItems(leading:
                        EditButton().animation(.default),
                    trailing: Button(action: {
                        self.showViewTwo.toggle()
                    }) {
                        Text("New task")
                    }.sheet(isPresented: $showViewTwo) {
                        ViewTwo(data: self.data, showViewTwo: self.$showViewTwo)
                    })
        }
    }



    func removeItems(at offset: IndexSet) {
        data.arrayOfTask.remove(atOffsets: offset)
    }
}

struct ViewTwo: View {
    @State var data: Model
    @State var newName = ""
    @State var newCatergory = ""
    @State var newPriorityLevel = ""

    @State var defaultPriorityLevel = 1
    @State var priorityTypes = ["low", "medium", "high", "critical"]


    @Binding var showViewTwo: Bool
    var body: some View {
        NavigationView {
            Form {
                Section(header: Text("Add task name")) {

                    TextField("Name", text: $newName)
                    /*
                    This section will be implementated later on
                    TextField("Catergory", text: $newCatergory)
                    */
                }
                Section(header: Text("Select task priority")) {
                    Picker("Priority Levels", selection: $defaultPriorityLevel) {
                        ForEach(0..<priorityTypes.count) {
                            Text(self.priorityTypes[$0])
                        }
                    }
                        .pickerStyle(SegmentedPickerStyle())
                }
            }
                .navigationBarTitle("New task details")
                .navigationBarItems(trailing:
                        Button("Save") {
                            var task = Model.Task()
                            self.showViewTwo.toggle()
                            task.taskName = self.newName
                            task.priority = self.defaultPriorityLevel
                            self.data.arrayOfTask.append(task)
                    })
        }
    }
}

Используя taskName как idне лучшая идея. Обновите свойTask struct для включения уникального значения:

class Model: ObservableObject {
    struct Task: Identifiable {
        static var uniqueID = 0
        var taskName = ""
        var taskCategory = ""
        var priority = 0
        var id = 0
        
        init() {
            Task.uniqueID += 1
            self.id = Task.uniqueID
        }
    }

    @Published var arrayOfTask = [Task]()
}

А затем измените:

ForEach(data.arrayOfTask, id: \.taskName) { task in

к

ForEach(data.arrayOfTask) { task in
Другие вопросы по тегам