iOS 15 SwiftUI 3 Picker 绑定在更改@State 值后不起作用
iOS 15 SwiftUI 3 Picker binding is not working after changing @State value
我正在尝试使用 SwiftUI 中的 Picker
,我的代码适用于 iOS 14,但是当我更新项目以使用 iOS 15 时,它现在才损坏在视图出现时分配 @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[[=11=]].name)
.tag([=11=])
}
}
}
}
.onAppear {
self.selectedCategory = 1
}
}
}
}
正如您在 onAppear
块中看到的那样,我正在更改 selectedCategory
值,这种代码和平在 iOS 14 中运行良好,但在 iOS 15 中运行良好。
谢谢
从 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[[=10=]].name)
.tag([=10=])
}
}
}
}
.onAppear {
// self.selectedCategory = 1
}
}
}
}
声明时可以直接设置默认值
@State private var selectedCategory = 1 //this will set your default value
似乎 iOS 15 无法像以前那样更改 State
var 的值并将其作为绑定发送到选择器。
问题是 State var selectedCategory
作为绑定发送到选择器,当我尝试在出现视图时更改 selectedCategory
var 的值时,绑定未更新并且当您 select 不同的类别时,选择器值不会改变。
我所做的是在初始化 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[[=10=]].name)
.tag([=10=])
}
}
}
}
}
}
}
为什么我需要在init上赋值?
这是因为在我的项目中我需要更新核心数据记录并将记录作为 ObservedObject
发送到视图并更改类别我需要更改 selectedCategory
以获得核心数据的值记录而不是默认值,通过更改 onAppear
中的值,选择器会损坏并且不再工作,因此在 iOS 15 中执行此操作的最佳方法是设置 init
函数而不是 onAppear
.
我正在尝试使用 SwiftUI 中的 Picker
,我的代码适用于 iOS 14,但是当我更新项目以使用 iOS 15 时,它现在才损坏在视图出现时分配 @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[[=11=]].name)
.tag([=11=])
}
}
}
}
.onAppear {
self.selectedCategory = 1
}
}
}
}
正如您在 onAppear
块中看到的那样,我正在更改 selectedCategory
值,这种代码和平在 iOS 14 中运行良好,但在 iOS 15 中运行良好。
谢谢
从 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[[=10=]].name)
.tag([=10=])
}
}
}
}
.onAppear {
// self.selectedCategory = 1
}
}
}
}
声明时可以直接设置默认值
@State private var selectedCategory = 1 //this will set your default value
似乎 iOS 15 无法像以前那样更改 State
var 的值并将其作为绑定发送到选择器。
问题是 State var selectedCategory
作为绑定发送到选择器,当我尝试在出现视图时更改 selectedCategory
var 的值时,绑定未更新并且当您 select 不同的类别时,选择器值不会改变。
我所做的是在初始化 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[[=10=]].name)
.tag([=10=])
}
}
}
}
}
}
}
为什么我需要在init上赋值?
这是因为在我的项目中我需要更新核心数据记录并将记录作为 ObservedObject
发送到视图并更改类别我需要更改 selectedCategory
以获得核心数据的值记录而不是默认值,通过更改 onAppear
中的值,选择器会损坏并且不再工作,因此在 iOS 15 中执行此操作的最佳方法是设置 init
函数而不是 onAppear
.