ピッカーの選択データをText()で表示しようとすると「Index out of range」というエラーが発生します。
ただし、選択したデータを表示する Text() にコメントを付けると、正常に機能します。以下は、形式のピッカーのコードです。
struct VMPickerView: View {
@State var vmIndex = 0
@ObservedObject var stockViewModel = StockViewModel()
var body: some View {
let allVM = self.stockViewModel.arrKey
return VStack {
Form {
Section {
Picker(selection: $vmIndex, label: Text("Location")) {
ForEach(0..<allVM.count, id: \.self) {
Text(allVM[$0]).tag($0)
}
}
//Text(allVM[vmIndex])
}
}
}
}
}
以下は、「Text(allVM[vmIndex])」にコメントしたときのアプリケーションの画像です。
以下は、firebase からデータを取得して配列に格納するために使用したコードです。
class StockViewModel: ObservableObject {
@Published var itemList = [ItemList]()
@Published var arrKey = [String]()
init() {
retrieveAllVM()
}
func retrieveAllVM() {
var arrKey = [String]()
let ref = Database.database().reference().child("VM")
ref.observeSingleEvent(of: .value, with: { snapshot in
for items in snapshot.children {
let itemSnap = items as! DataSnapshot
let allKey = itemSnap.key
arrKey.append(allKey)
}
self.arrKey = arrKey
print(self.arrKey)
})
}
}
*変更後の私のコード:
class StockViewModel: ObservableObject {
@Published var itemList = [ItemList]()
@Published var arrKey = [String]()
func retrieveAllVM() {
var arrKey = [String]()
let ref = Database.database().reference().child("VM")
ref.observeSingleEvent(of: .value, with: { snapshot in
for items in snapshot.children {
let itemSnap = items as! DataSnapshot
let allKey = itemSnap.key
arrKey.append(allKey)
}
DispatchQueue.main.async {
self.arrKey = arrKey
print(self.arrKey)
}
//self.arrKey = arrKey
})
}
}
struct VMPickerView: View {
@State var vmIndex = 0
@ObservedObject var stockViewModel: StockViewModel
var body: some View {
let allVM = self.stockViewModel.arrKey
return VStack {
Form {
Section {
Picker(selection: $vmIndex, label: Text("Location")) {
ForEach(0..<allVM.count, id: \.self) {
Text(allVM[$0]).tag($0)
}
}
//Text(allVM[vmIndex])
}
}
}.onAppear {
self.stockViewModel.retrieveAllVM()
}
}
}