iOS 15 SwiftUI 3 Picker绑定在改变@State值后不工作



我正在尝试使用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不像以前那样改变Statevar的值并将其作为绑定发送给Picker。

问题是State var selectedCategory被发送到Picker作为绑定,当我试图改变selectedCategoryvar在出现视图时的值时,绑定没有更新,当您选择不同的类别时,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

相关内容

  • 没有找到相关文章

最新更新