在 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:如何更新由一组静态数据驱动的列表并从另一组动态数据中提取信息位?