Skip to content

Instantly share code, notes, and snippets.

@FarshidRoohi
Created February 28, 2020 15:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save FarshidRoohi/a660556888489cd1e486de3246cbee7f to your computer and use it in GitHub Desktop.
Save FarshidRoohi/a660556888489cd1e486de3246cbee7f to your computer and use it in GitHub Desktop.
import SwiftUI
struct ContentView: View {
@ObservedObject var myViewModel = MyViewModel()
var body: some View {
ScrollView {
VStack {
ForEach(self.myViewModel.items.indices , id : \.self) {index in
RowForTest(item: self.myViewModel.items[index])
}
Button(action: {
print(self.myViewModel.items[0].value)
}){
Text("Submit")
}.padding()
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
struct RowForTest: View {
@State var item :MyModel
var body: some View {
HStack {
Text(item.title)
TextField("enter value", text: Binding(get: {
return self.item.value
}, set: { newValue in
self.item.value = newValue
}))
}.padding()
}
}
@alekseypotapov-dev
Copy link

alekseypotapov-dev commented Feb 29, 2020

  1. Create a new func in your MyViewModel.swift
    func binding(for index: Int) -> Binding<String> {
        Binding(
            get: { self.items[index].value },
            set: { self.items[index].value = $0 }
        )
    }
  1. Update your RowForTest.swift
struct RowForTest: View {
    var item: MyModel // to read only
    @Binding var itemValue: String // to write

    var body: some View {
        HStack {
            Text(item.title)
            TextField("enter value", text: $itemValue)
        }.padding()
    }
}
  1. Update the ContentView's ForEach as:
RowForTest(item: self.myViewModel.items[index], itemValue: self.myViewModel.binding(for: index))

The whole code:

import SwiftUI

struct ContentView: View {

    @ObservedObject var myViewModel = MyViewModel()

    var body: some View {
        ScrollView {
            VStack {
                ForEach(self.myViewModel.items.indices, id : \.self) { index in
                    RowForTest(item: self.myViewModel.items[index],
                               itemValue: self.myViewModel.binding(for: index))
                }

                Button(action: {
                    print("set value: \(self.myViewModel.items[0].value)")
                }){
                    Text("Submit")
                }.padding()
            }
        }
    }
}

struct RowForTest: View {
    var item: MyModel // to read only
    @Binding var itemValue: String // to write

    var body: some View {
        HStack {
            Text(item.title)
            TextField("enter value", text: $itemValue)
        }.padding()
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

class MyViewModel: ObservableObject {
    @Published var items:[MyModel] = []

    init() {
        populateItem()
    }

    func populateItem(){
        self.items.append(MyModel(id: 0, title: "title #1", value: ""))
        self.items.append(MyModel(id: 1, title: "title #2", value: ""))
        self.items.append(MyModel(id: 2, title: "title #3", value: ""))
        self.items.append(MyModel(id: 3, title: "title #4", value: ""))
        self.items.append(MyModel(id: 4, title: "title #5", value: ""))
        self.items.append(MyModel(id: 5, title: "title #6", value: ""))
    }

    func binding(for index: Int) -> Binding<String> {
        Binding(
            get: { self.items[index].value },
            set: { self.items[index].value = $0 }
        )
    }
}

struct MyModel : Identifiable {
    var id:Int64
    var title:String
    var value:String
}

@FarshidRoohi
Copy link
Author

Thank you very much for your guidance
I learned :))

@AvinashRamireddy31
Copy link

Really helpful to start with

But what if I have multiple textfields(name, value, oneLinedescription) in each row of list? Should I create 3 variables in RowForTest for write or is there any better way to pass entire object for write?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment