[英]iOS 15 SwiftUI 3 Picker binding is not working after changing @State value
我正在嘗試使用來自 SwiftUI 的Picker
,我的代碼適用於 iOS 14,但是當我更新項目以使用 iOS 15 時,它現在已損壞,並且在分配@State
視圖后 Picker 不再更新出現。
我從零開始創建了一個新項目來測試它,是的,我可以復制錯誤。
這是我正在使用的代碼:
import SwiftUI
struct Category: Identifiable {
let id: UUID = UUID()
let name: String
}
let categories: [Category] = [
Category(name: "Cat 1"),
Category(name: "Cat 2"),
Category(name: "Cat 3")
]
struct ContentView: View {
@State private var selectedCategory = -1
var body: some View {
NavigationView {
Form {
Section {
Picker("Category", selection: $selectedCategory) {
ForEach(0..<categories.count) {
Text(categories[$0].name)
.tag($0)
}
}
}
}
.onAppear {
self.selectedCategory = 1
}
}
}
}
正如您在onAppear
塊中看到的那樣,我正在更改selectedCategory
值,這段代碼在 iOS 14 中運行良好,但在 iOS 15 中運行良好。
謝謝
似乎 iOS 15 不能像以前那樣更改State
var 的值並將其作為綁定發送到選擇器。
問題是State var selectedCategory
作為綁定發送到 Picker,當我嘗試在出現視圖時更改selectedCategory
var 的值時,綁定不會更新,當您 select 不同的類別時,Picker 值不會更改.
我所做的是在初始化 Picker 之前更改init
function 中的selectedCategory
值:
import SwiftUI
struct Category: Identifiable {
let id: UUID = UUID()
let name: String
}
let categories: [Category] = [
Category(name: "Cat 1"),
Category(name: "Cat 2"),
Category(name: "Cat 3")
]
struct ContentView: View {
@State private var selectedCategory = -1
init() {
self._selectedCategory = State(initialValue: 1)
}
var body: some View {
NavigationView {
Form {
Section {
Picker("Category", selection: $selectedCategory) {
ForEach(0..<categories.count) {
Text(categories[$0].name)
.tag($0)
}
}
}
}
}
}
}
為什么我需要在 init 上賦值? 這是因為在我的項目中我需要更新核心數據記錄並將記錄作為ObservedObject
發送到視圖並更改類別我需要更改selectedCategory
以具有核心數據記錄的值而不是默認值,通過更改onAppear
中的值,Picker 會損壞並且不再工作,因此在 iOS 15 中執行此操作的最佳方法是在init
function 中設置值,而不是在onAppear
中設置值。
從 onAppear 中刪除 self.selectedCategory = 1 ,它將正常工作。
struct ContentView: View {
@State private var selectedCategory = 1
var body: some View {
NavigationView {
Form {
Section {
Picker("Category", selection: $selectedCategory) {
ForEach(0..<categories.count) {
Text(categories[$0].name)
.tag($0)
}
}
}
}
.onAppear {
// self.selectedCategory = 1
}
}
}
}
您可以在聲明時直接設置默認值
@State private var selectedCategory = 1 //this will set your default value
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.