我正在尝试使用SwiftUI的Picker
,我有这个代码为iOS 14工作,但是当我更新项目以与iOS 15一起工作时,它现在已经坏了,Picker在分配@State
后不再更新。
我已经创建了一个新项目从零到测试它,是的我可以复制错误。
下面是我使用的代码: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的值并将其作为绑定发送给Picker。
问题是State var selectedCategory
被发送到Picker作为绑定,当我试图改变selectedCategory
var在出现视图时的值时,绑定没有更新,当您选择不同的类别时,Picker值不会改变。
我所做的是在初始化Picker之前改变init
函数中的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
选择器坏了,不工作了,所以最好的方法在iOS 15是设置init
函数中的值,而不是在onAppear
。
删除self。selectedCategory = 1 from onAppear就可以了
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