在 SwiftUI 中动态更新列表?

Posted

技术标签:

【中文标题】在 SwiftUI 中动态更新列表?【英文标题】:Dynamically updating a list in SwiftUI? 【发布时间】:2020-05-25 12:44:04 【问题描述】:

我又回来了,哈哈。我的内容视图如下所示:

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】:

观察视图模型,在这种情况下,每次使用的@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
//    

【讨论】:

哦,伙计,我可能在这里搞砸了,我在昨晚更新后打印了数组并且它正在工作,现在它不是......所以这绝对是问题的一部分这里。我将更新原始问题中的函数;如果你能看一看,那就太棒了,谢谢 Asperi! @nickcoding,你是什么意思? 我更新数组的函数显然也是错误的来源(因为数组没有被更新,所以我只是编辑了原始问题以显示数组更新)。很抱歉有任何困惑

以上是关于在 SwiftUI 中动态更新列表?的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI:如何更新由一组静态数据驱动的列表并从另一组动态数据中提取信息位?

SwiftUI+Combine - 动态订阅发布者的字典

在 SwiftUI 中动态更改导航标题?

如何在 Flutter 中动态更新列表中元素的样式?

SwiftUI:如何在动态列表或 LazyVStack 中获取视图框架

基于下拉列表中选项的选择动态更新表格的Angularjs代码