gpt4 book ai didi

swift - 使用 FetchedResults 填充 SwiftUI Picker 的最佳实践

转载 作者:行者123 更新时间:2023-12-04 15:12:13 24 4
gpt4 key购买 nike

我目前正在使用 CoreData FetchedResultsSwiftUIs PickerView。这样做时,我在使用 FetchedResults 填充 PickerView 时遇到了问题:

我显然可以使用 FetchedResults 来填充 PickerView,但是什么解决方案是最好的(也是从 UI/UX 的角度来看)为所选结果定义 @State?

@FetchRequest(sortDescriptors: [NSSortDescriptor(keyPath: \User.lastName, ascending: true)], animation: .default) private var users: FetchedResults<User>
@State var user: User = User()

// ...

Picker(selection: $user, label: Text("User")) {
ForEach(users) { user in
Text(lastName).tag(user)
}
}

这确实有效,但是它可能不是最优雅的方式来创建一个新的空用户对象以将其设置为默认值。

你们有没有更好的想法/最佳实践来解决这个可能经常出现的问题?

最佳答案

如果您不想一直创建一个虚拟的 User(),这不是您提到的好的做法,您必须在 init() 中执行 FetchRequest 或通过你的 FetchedResult 到另一个 View 。

这是另一种观点的解决方案

struct ContentView : View {

@FetchRequest(sortDescriptors: [NSSortDescriptor(keyPath: \User.lastName, ascending: true)], animation: .default) private var users: FetchedResults<User>

var body : some View {
PickerView(users: Array(users))
}
}

struct PickerView : View {

var users : [User]
@State var selectedUser : User?

init(users: [User]) {
self.users = users
self._selectedUser = State(initialValue: users.first)
}

var body : some View {
Picker(selection: $selectedUser, label: Text("Users")) {
ForEach(users) { user in
Text(user.lastName ?? "").tag(user as User?)
}
}

}
}

编辑:

实际上,您可以将您的 Person 声明为可选的。因此您不必提供默认值。获取时,它将自动移动到选择器中的第一个项目。如果你想选择不同的,你可以使用上面的方法。关于 init() 中的 FetchRequest,它在几个月前发布了一个答案 here

关于swift - 使用 FetchedResults 填充 SwiftUI Picker 的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65002096/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com