簡體   English   中英

iOS 15 SwiftUI 3 更改@State 值后選取器綁定不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM