0

我正在尝试从 SwiftUI 使用,我让这段代码适用于 iOS 14,但是当我更新项目以使用 iOS 15 时,它现在已经损坏,并且 Picker 在分配视图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 中运行良好。

谢谢

4

2 回答 2

1

似乎 iOS 15 不像以前那样更改Statevar 的值并将其作为 Binding 发送到 Picker。

问题是它State var selectedCategory 作为绑定发送到 Picker,当我尝试selectedCategory在出现视图时更改 var 的值时,绑定没有更新,并且当您选择不同的类别时 Picker 值不会改变。

我所做的是在初始化 Picker 之前更改函数selectedCategory中的值:init

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核心数据记录的值而不是默认值Picker中的值onAppear被破坏并且不再工作,因此在 iOS 15 中执行此操作的最佳方法是在init函数中设置值,而不是在onAppear.

于 2021-10-06T04:13:01.467 回答
0

从 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
于 2021-10-05T13:50:09.400 回答