Issue #516
Suppose we have an array of SearchObject
, and user can enter search query into text
property.
1 2 3 4 5 6 7 8 9 10 class SearchObject : ObservableObject { let name: String let search: (String ) -> [Country ] var text: String = "" init (name: String , search: @escaping (String ) -> [Country ]) { self .name = name self .search = search } }
Although SearchObject
is class, when we use ForEach
, the changes to passed object won’t be reflected in our array and there is no reload trigger, we need to point to object in array directly, like
1 self .$searchObjects[index].text
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 struct SearchScreen : View { @State var searchObjects: [SearchObject ] = [ SearchObject (name: "By name" , search: { CountryManager .shared.search(byName: $0 ) }), SearchObject (name: "By calling code" , search: { CountryManager .shared.search(byCallingCode: $0 ) }), SearchObject (name: "By domain" , search: { CountryManager .shared.search(byDomain: $0 ) }), SearchObject (name: "By language" , search: { CountryManager .shared.search(byLanguage: $0 ) }) ] var body: some View { ScrollView { VStack (alignment: .leading) { ForEach (searchObjects.enumerated().map ({ $0 }), id: \.element.name, content: { index, searchObject in VStack (alignment: .leading) { Text (searchObject.name) .styleLabel() TextField (searchObject.textFieldName, text: self .$searchObjects[index].text) .styleTitle() self .makeButton(searchObject: self .searchObjects[index]) } }) } } } }