我可能已經瀏覽了整個互聯網,但找不到答案,因此我伸出手。
我正在嘗試為用戶使用 SwiftUI 輪選擇器來進行語言選擇,但選擇器堅持串列中的第一項,并且在嘗試滾動時沒有滾動到新選擇。這發生在模擬器和物理設備上。
我花了一天時間閱讀各種博客、論壇、問題、教程……所有這些。從我的代碼中可以看出,看起來一切都井井有條,但顯然我錯過了一些東西!
有人可以幫我診斷一下嗎?下面的代碼和環境詳細資訊。
我認為的輪子選擇器:
Picker("", selection: $model.selectedLanguageIndex, content: {
ForEach(0..<model.languages.count, id: \.self) { index in
Text(model.languages[index].name).tag(index)
}
}).pickerStyle(.wheel)
該視圖具有宣告的視圖模型:
@StateObject private var model = MyView.viewModel()
并且視圖onAppear在父元素外標簽處也有一個函式:
.onAppear(perform: model.load)
視圖模型如下所示:
extension MyView {
class viewModel: ObservableObject {
@Published var languages = [language]()
@Published var selectedLanguageIndex = 0
func load() {
MyService.getLanguages { (success, error, languages) in
guard success, error == nil, let languages = languages, !languages.isEmpty else { return }
DispatchQueue.main.async { self.languages = languages }
}
}
}
}
與集合一起language使用的模型languages:
struct language: Hashable, Identifiable {
let id: String
let code: String
let name: String
}
環境:
Xcode 13.2
Mac Mini M1 2020 macOS Monterey (Dev machine)
iPhone 11 Pro Max iOS 15.1 (Physical device used for testing)
任何幫助都將不勝感激!
uj5u.com熱心網友回復:
我無法復制您的問題。使用以下測驗代碼對我來說一切都很好。在 Mac Monterey 上,Xcode 13.2,目標是 ios 15 和催化劑 12。
這個測驗代碼對你有用嗎?如果是這樣,您的問題可能出在您未顯示的其他代碼中。
這是我的測驗代碼:
import SwiftUI
@main
struct TestApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
struct ContentView: View {
@StateObject private var model = ContentView.viewModel()
var body: some View {
Picker("", selection: $model.selectedLanguageIndex, content: {
ForEach(0..<model.languages.count, id: \.self) { index in
Text(model.languages[index].name).tag(index)
}
}).pickerStyle(.wheel)
.onAppear {
model.load()
}
}
}
extension ContentView {
class viewModel: ObservableObject {
@Published var languages = [Language]()
@Published var selectedLanguageIndex = 0
func load() {
// MyService.getLanguages { (success, error, languages) in
// guard success, error == nil, let languages = languages, !languages.isEmpty else { return }
// DispatchQueue.main.async { self.languages = languages }
// }
// for testing
languages = [Language(id: "1", code: "1", name: "name 1"),
Language(id: "2", code: "2", name: "name 2"),
Language(id: "3", code: "3", name: "name 3"),
Language(id: "4", code: "4", name: "name 4")]
}
}
}
struct Language: Hashable, Identifiable {
let id: String
let code: String
let name: String
}
注意:就我個人而言,我會將我的viewModel外部extension設定為視圖。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/384077.html
