在SwiftUI中,Picker
是一个常用的UI组件,用于在多个选项中选择一个。而 @FetchRequest
和 @State
是SwiftUI中的两个重要属性包装器,分别用于数据获取和状态管理。
NSFetchRequest
一起使用。Picker()
中使用 @FetchRequest
和 @State
?是的,你可以在 Picker()
中同时使用 @FetchRequest
和 @State
。@FetchRequest
可以用来获取选项列表,而 @State
可以用来跟踪当前选中的选项。
以下是一个简单的示例,展示了如何在 Picker()
中使用 @FetchRequest
和 @State
:
import SwiftUI
import CoreData
struct ContentView: View {
@FetchRequest(entity: Item.entity(), sortDescriptors: [])
var items: FetchedResults<Item>
@State private var selectedItemId: UUID?
var body: some View {
VStack {
Picker("Select an item", selection: $selectedItemId) {
ForEach(items) { item in
Text(item.name ?? "")
.tag(item.id)
}
}
.pickerStyle(SegmentedPickerStyle())
if let selectedItem = items.first(where: { $0.id == selectedItemId }) {
Text("Selected: \(selectedItem.name ?? "")")
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
let context = PersistenceController.preview.container.viewContext
return ContentView().environment(\.managedObjectContext, context)
}
}
@FetchRequest
来获取 Item
实体的所有实例,并按默认顺序排序。@State
来跟踪当前选中的 Item
的ID。Picker
中,我们使用 ForEach
来遍历 items
,并为每个 Item
创建一个选项。每个选项的标签是 Item
的名称,而 tag
则设置为 Item
的ID,以便与 selectedItemId
进行匹配。selectedItemId
是否存在于 items
中,并显示选中的 Item
的名称。这种组合在需要从数据库中动态获取选项并在用户选择时更新状态的场景中非常有用。例如,在一个待办事项应用中,你可以使用这种方式让用户从他们的任务列表中选择一个任务。
问题: 如果 Picker
不更新或显示不正确的数据,可能是由于以下原因之一:
@FetchRequest
正确配置并且数据已成功加载。@State
变量正确绑定到 Picker
的 selection
参数。解决方法:
NSFetchRequest
的配置是否正确。items
是否包含预期的数据。selectedItemId
在用户选择时正确更新。通过这种方式,你可以有效地在SwiftUI中使用 Picker
结合 @FetchRequest
和 @State
来创建动态且响应式的用户界面。
领取专属 10元无门槛券
手把手带您无忧上云