如何在swiftUI中将文本旁边的颜色添加到列表中?(数据流)

如何在swiftUI中将文本旁边的颜色添加到列表中?(数据流),swiftui,dataflow,swiftui-list,Swiftui,Dataflow,Swiftui List,我尝试从用户那里获取(文本和颜色),并将它们添加到SwiftUI中的列表中。我已经可以传递文本数据,但不幸的是,对于颜色,我不能传递,因为它们应该是相同的,下面有一个应用程序的图像。要工作,我们应该为PreAddTextField提供绑定。感谢您的帮助 这是我的密码: import SwiftUI struct AddListView: View { @Binding var showAddListView : Bool @ObservedObject var appState : App

我尝试从用户那里获取(文本和颜色),并将它们添加到SwiftUI中的列表中。我已经可以传递文本数据,但不幸的是,对于颜色,我不能传递,因为它们应该是相同的,下面有一个应用程序的图像。要工作,我们应该为PreAddTextField提供绑定。感谢您的帮助 这是我的密码:

import SwiftUI

struct AddListView: View {


@Binding var showAddListView : Bool
@ObservedObject var appState : AppState
@StateObject private var viewModel = AddListViewViewModel()

var body: some View {
    ZStack {
        
        Title(addItem: { viewModel.textItemsToAdd.append(.init(text: "", color: .purple)) })
        
        VStack {
            ScrollView {
                ForEach(viewModel.textItemsToAdd, id: \.id) { item in //note this is id: 

\.id and not \.self
                        PreAddTextField(textInTextField: viewModel.bindingForId(id: item.id), colorPickerColor: <#Binding<Color>#>)
                }
                
            }
        }
        .padding()
        .offset(y: 40)
        
        Buttons(showAddListView: $showAddListView, save: {
                        viewModel.saveToAppState(appState: appState)
                    })
        
    }
    .frame(width: 300, height: 200)
    .background(Color.white)
    .shadow(color: Color.black.opacity(0.3), radius: 10, x: 0, y: 10)
}
}

struct SwiftUIView_Previews: PreviewProvider {
    static var previews: some View {
        AddListView(showAddListView: .constant(false),appState: AppState())
    }
}

struct PreAddTextField: View {


@Binding var textInTextField : String
@Binding var colorPickerColor :  Color

var body: some View {
    HStack {
        TextField("Enter text", text: $textInTextField)
        ColorPicker("", selection: $colorPickerColor)
    }
}
}

struct Buttons: View {
    @Binding var showAddListView : Bool
    var save : () -> Void
    var body: some View {
        VStack {
            HStack(spacing:100) {
                Button(action: {
                        showAddListView = false}) {
                    Text("Cancel")
                }
                Button(action: {
                    showAddListView = false
                    // What should happen here to add Text to List???
                    save()
                }) {
                    Text("Add")
                }
            }
        }
        .offset(y: 70)
    }
}

struct Title: View {

var addItem : () -> Void

var body: some View {
    VStack {
        HStack {
            Text("Add Text to list")
                .font(.title2)
            Spacer()
            Button(action: {
                addItem()
            }) {
                Image(systemName: "plus")
                    .font(.title2)
            }
        }
        .padding()
        Spacer()
    }
}
}

您可以为整个
Text1
项创建
绑定,而不是仅对
字符串使用
绑定

class AddListViewViewModel : ObservableObject {
    @Published var textItemsToAdd : [Text1] = [.init(text: "", color: .purple)]
    
    func saveToAppState(appState: AppState) {
        appState.textData.append(contentsOf: textItemsToAdd.filter { !$0.text.isEmpty })
    }
    
    func bindingForId(id: UUID) -> Binding<Text1> { //now returns a Text1
        .init { () -> Text1 in
            self.textItemsToAdd.first(where: { $0.id == id }) ?? Text1(text: "", color: .clear)
        } set: { (newValue) in
            self.textItemsToAdd = self.textItemsToAdd.map {
                guard $0.id == id else {
                    return $0
                }
                return newValue
            }
        }
    }
}

struct PreAddTextField: View {
    @Binding var item : Text1
    
    var body: some View {
        HStack {
            TextField("Enter text", text: $item.text) //gets the text property of the binding
            ColorPicker("", selection: $item.color) //gets the color property
        }
    }
}

struct AddListView: View {
    @Binding var showAddListView : Bool
    @ObservedObject var appState : AppState
    @StateObject private var viewModel = AddListViewViewModel()
    
    var body: some View {
        ZStack {
            Title(addItem: { viewModel.textItemsToAdd.append(.init(text: "", color: .purple)) })
            VStack {
                ScrollView {
                    ForEach(viewModel.textItemsToAdd, id: \.id) { item in
                        PreAddTextField(item: viewModel.bindingForId(id: item.id)) //parameter is changed here
                    }
                }
            }
            .padding()
            .offset(y: 40)
            
            Buttons(showAddListView: $showAddListView, save: {
                viewModel.saveToAppState(appState: appState)
            })
            
        }
        .frame(width: 300, height: 200)
        .background(Color.white)
        .shadow(color: Color.black.opacity(0.3), radius: 10, x: 0, y: 10)
    }
}
class AddListViewModel:ObserveObject{
@已发布的变量textItemsToAdd:[Text1]=[.init(文本:,颜色:。紫色)]
func saveToAppState(appState:appState){
appState.textData.append(contentsOf:textItemsToAdd.filter{!$0.text.isEmpty})
}
func bindingForId(id:UUID)->Binding{//现在返回一个Text1
.init{()->Text1在
self.textItemsToAdd.first(其中:{$0.id==id})??Text1(文本:,颜色:。清除)
}集合:{(newValue)在
self.textItemsToAdd=self.textItemsToAdd.map{
guard$0.id==id else{
返回$0
}
返回新值
}
}
}
}
结构PreAddTextField:视图{
@绑定变量项:Text1
var body:一些观点{
HStack{
TextField(“entertext”,text:$item.text)//获取绑定的text属性
ColorPicker(“,selection:$item.color)//获取颜色属性
}
}
}
结构AddListView:视图{
@绑定变量showAddListView:Bool
@ObservedObject变量appState:appState
@StateObject私有变量viewModel=addListViewModel()
var body:一些观点{
ZStack{
标题(addItem:{viewModel.textItemsToAdd.append(.init(文本:“”,颜色:。紫色))})
VStack{
滚动视图{
ForEach(viewModel.textItemsToAdd,id:\.id){item in
PreAddTextField(item:viewModel.bindingForId(id:item.id))//参数在此处更改
}
}
}
.padding()
.偏移量(y:40)
按钮(showAddListView:$showAddListView,保存:{
viewModel.saveToAppState(appState:appState)
})
}
.框架(宽:300,高:200)
.背景(颜色.白色)
阴影(颜色:颜色。黑色。不透明度(0.3),半径:10,x:0,y:10)
}
}
谢谢您的帮助
import SwiftUI

struct ListView: View {

@StateObject var appState = AppState() //store the AppState here
@State private var showAddListView = false

var body: some View {
    NavigationView {
        VStack {
            ZStack {
                List(appState.textData, id : \.self){ text in
                    HStack {
                        Image(systemName: "square")
                            .foregroundColor(text.color)
                        Text(text.text)
                    }
                                        
                                    }
                if showAddListView {
                                        AddListView(showAddListView: $showAddListView, appState: appState)
                                            .offset(y:-100)
                                    }
            }
        }
        .navigationTitle("List")
        .navigationBarItems(trailing:
                                Button(action: {showAddListView = true}) {
                                    Image(systemName: "plus")
                                        .font(.title2)
                                }
        )
    }
}
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ListView()
    }
}
class AddListViewViewModel : ObservableObject {
    @Published var textItemsToAdd : [Text1] = [.init(text: "", color: .purple)]
    
    func saveToAppState(appState: AppState) {
        appState.textData.append(contentsOf: textItemsToAdd.filter { !$0.text.isEmpty })
    }
    
    func bindingForId(id: UUID) -> Binding<Text1> { //now returns a Text1
        .init { () -> Text1 in
            self.textItemsToAdd.first(where: { $0.id == id }) ?? Text1(text: "", color: .clear)
        } set: { (newValue) in
            self.textItemsToAdd = self.textItemsToAdd.map {
                guard $0.id == id else {
                    return $0
                }
                return newValue
            }
        }
    }
}

struct PreAddTextField: View {
    @Binding var item : Text1
    
    var body: some View {
        HStack {
            TextField("Enter text", text: $item.text) //gets the text property of the binding
            ColorPicker("", selection: $item.color) //gets the color property
        }
    }
}

struct AddListView: View {
    @Binding var showAddListView : Bool
    @ObservedObject var appState : AppState
    @StateObject private var viewModel = AddListViewViewModel()
    
    var body: some View {
        ZStack {
            Title(addItem: { viewModel.textItemsToAdd.append(.init(text: "", color: .purple)) })
            VStack {
                ScrollView {
                    ForEach(viewModel.textItemsToAdd, id: \.id) { item in
                        PreAddTextField(item: viewModel.bindingForId(id: item.id)) //parameter is changed here
                    }
                }
            }
            .padding()
            .offset(y: 40)
            
            Buttons(showAddListView: $showAddListView, save: {
                viewModel.saveToAppState(appState: appState)
            })
            
        }
        .frame(width: 300, height: 200)
        .background(Color.white)
        .shadow(color: Color.black.opacity(0.3), radius: 10, x: 0, y: 10)
    }
}