Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 在选取器中选择一个选项并添加到列表后,CircleImage会不断更改颜色_Swift_Swiftui_Swiftui List_Swiftui Foreach - Fatal编程技术网

Swift 在选取器中选择一个选项并添加到列表后,CircleImage会不断更改颜色

Swift 在选取器中选择一个选项并添加到列表后,CircleImage会不断更改颜色,swift,swiftui,swiftui-list,swiftui-foreach,Swift,Swiftui,Swiftui List,Swiftui Foreach,我遇到了一个奇怪的问题,当添加一个不同颜色的新项目时,列表中某个项目的颜色会发生变化,基本上它不会保留其颜色值,而是使用一个新的颜色。 我想做的是显示一种与用户选择的优先级相对应的颜色 代码如下: struct PriorityGreen: View { var body: some View { Circle() .frame(width: 20, height: 20) .foregroundColor(Color.gr

我遇到了一个奇怪的问题,当添加一个不同颜色的新项目时,列表中某个项目的颜色会发生变化,基本上它不会保留其颜色值,而是使用一个新的颜色。 我想做的是显示一种与用户选择的优先级相对应的颜色

代码如下:

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)
    }
}
这个gif更清楚地说明了这个问题


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

您的模型中只有一个优先级,而不是每个任务的优先级

将您的模型更改为:

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)
                    })
        }
    }
}
然后改变:

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


在帖子中添加了模型谢谢你的回复,代码现在可以正常工作了,我会在早上的第一件事中尝试更好地理解它。再次感谢。请查看我的更新。代码使用
taskName
作为
id
,这意味着具有相同名称的两个任务将显示相同的优先级。我制作了
任务
可识别
,并为其添加了一个唯一的
id
值。
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