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