Динамически обновляете список в SwiftUI? - PullRequest
1 голос
/ 25 мая 2020

Я снова вернулся, лол. Мое представление содержимого выглядит так:

struct ContentView: View {
    @ObservedObject var VModel = ViewModel()
    @State private var resultsNeedToBeUpdated: Bool = false
    var body: some View {
        VStack {
            if self.resultsNeedToBeUpdated == true {
                SearchResults(VModel: VModel, resultsNeedToBeUpdated: $resultsNeedToBeUpdated)
            }
        }
    }
}

Вид SearchBar выглядит так:

struct SearchResults: View {
    var VModel: ViewModel
    @Binding var resultsNeedToBeUpdated: Bool
    var body: some View {
        List {
            ForEach(VModel.searchResults, id: \.self) { result in 
                Text(result)
            }
        }
    }
}

Наконец, класс ViewModel выглядит так:

class ViewModel: ObservableObject {
    @Published var searchResults: [String] = []
    func findResults(address: String) {
        let Geocoder = Geocoder(accessToken: 'my access token')
        searchResults = []
        Geocoder.geocode(ForwardGeocodeOptions(query: address)) { (placemarks, attribution, error) in
            guard let placemarks = placemarks
            else {
                return
            }
            for placemark in placemarks {
                self.searchResults.append(placemark.formattedName)
                print("Formatted name is: \(placemark.formattedName)") //this works
            }
        }
      //I'm doing my printing on this line and it's just printing an empty array ;(
}

Переменная ' resultsNeedToBeUpdated '- это логическая привязка, которая обновляется, когда пользователь вводит текст в представление панели поиска, и по сути просто сообщает вам, что представление SearchResults должно отображаться, если оно истинно, и не должно отображаться, если оно ложно. Я пытаюсь обновить представление SearchResults в зависимости от того, что ввел пользователь.

Ошибка определенно связана с отображением представления SearchResults (я думаю, что он отображает только начальное представление, прежде чем массив обновлен). Я попытался использовать привязку, потому что думал, что это вызовет перезагрузку ContentView и обновит SearchResultsView, но это не сработало.

1 Ответ

2 голосов
/ 25 мая 2020

Сделать модель просмотра наблюдаемой, в этом случае она будет обновлять вид каждый раз при изменении используемого свойства @Published var searchResults

struct SearchResults: View {
    @ObservedObject var VModel: ViewModel
//    @Binding var resultsNeedToBeUpdated: Bool // << not needed here

в дополнение к вышеуказанным опубликованным свойствам должны обновляться в основной очереди, как

DispatchQueue.main.async {
    self.searchResults = placemarks.compactMap{ $0.formattedName }

//    for placemark in placemarks {
//        print("Formatted name is: \(placemark.formattedName)") //this works
//    }
}
...