我将尝试使用从外部API异步获取的数据填充选择器。
这是我的模型:
获取数据并发布的类为:
这是我的模型:
struct AppModel: Identifiable {
var id = UUID()
var appId: String
var appBundleId : String
var appName: String
var appSKU: String
}
获取数据并发布的类为:
class AppViewModel: ObservableObject {
private var appStoreProvider: AppProvider? = AppProvider()
@Published private(set) var listOfApps: [AppModel] = []
@Published private(set) var loading = false
fileprivate func fetchAppList() {
self.loading = true
appStoreProvider?.dataProviderAppList { [weak self] (appList: [AppModel]) in
guard let self = self else {return}
DispatchQueue.main.async() {
self.listOfApps = appList
self.loading = false
}
}
}
init() {
fetchAppList()
}
}
视图是:
struct AppView: View {
@ObservedObject var appViewModel: AppViewModel = AppViewModel()
@State private var selectedApp = 0
var body: some View {
ActivityIndicatorView(isShowing: self.appViewModel.loading) {
VStack{
// The Picker doesn't bind with appViewModel
Picker(selection: self.$selectedApp, label: Text("")) {
ForEach(self.appViewModel.listOfApps){ app in
Text(app.appName).tag(app.appName)
}
}
// The List correctly binds with appViewModel
List {
ForEach(self.appViewModel.listOfApps){ app in
Text(app.appName.capitalized)
}
}
}
}
}
}
虽然列表视图与观察对象appViewModel绑定,但选择器的行为不同。我无法理解原因。有任何帮助吗?
selectedApp
的类型应该与AppModel
的id
匹配(或者如果您要明确指定标记,则应该匹配标记类型)。 - Rob.pickerStyle(SegmentedPickerStyle())
,它会被更新。(我确定你不想要分段选择器,所以这不是你问题的答案,但这只是一个有趣的数据点。)感觉像PickerView
的updateUI
缺少一个reloadAllComponents
... - RobUIPickerView
创建自己的UIRepresentableView
包装器。它可以很好地工作。 - Rob