Core data CoreData FetchRequest正在加载我的列表,其中除了FetchedData之外还有可选的结果数据
我在AdminView结构内部调用@FetchRequest,希望使用ForEach在列表中显示数据。我正在请求所有用户实体数据,但当我运行应用程序时,列表显示了我的2个现有条目结果,但由于某些原因,它还显示了默认为可选字符串“TEST”的大约40个条目 我试图理解如何让列表只显示两个用户条目,而不显示列表中的默认字符串Core data CoreData FetchRequest正在加载我的列表,其中除了FetchedData之外还有可选的结果数据,core-data,swiftui,swiftui-list,Core Data,Swiftui,Swiftui List,我在AdminView结构内部调用@FetchRequest,希望使用ForEach在列表中显示数据。我正在请求所有用户实体数据,但当我运行应用程序时,列表显示了我的2个现有条目结果,但由于某些原因,它还显示了默认为可选字符串“TEST”的大约40个条目 我试图理解如何让列表只显示两个用户条目,而不显示列表中的默认字符串 List { ForEach(self.allUsers.filter({ $0.company != nil })) { user in if let co
List {
ForEach(self.allUsers.filter({ $0.company != nil })) { user in
if let company = user.company {
Text(company)
}
}
}
非常感谢
以下是相关代码:
import Foundation
import CoreData
extension User {
@nonobjc public class func fetchRequest() -> NSFetchRequest<User> {
return NSFetchRequest<User>(entityName: "User")
}
@NSManaged public var admin: Bool
@NSManaged public var company: String?
@NSManaged public var name: String?
@NSManaged public var password: String?
@NSManaged public var photo: Data?
@NSManaged public var username: String?
@NSManaged public var id: UUID?
@NSManaged public var tickets: NSSet?
}
// MARK: Generated accessors for tickets
extension User {
@objc(addTicketsObject:)
@NSManaged public func addToTickets(_ value: Ticket)
@objc(removeTicketsObject:)
@NSManaged public func removeFromTickets(_ value: Ticket)
@objc(addTickets:)
@NSManaged public func addToTickets(_ values: NSSet)
@objc(removeTickets:)
@NSManaged public func removeFromTickets(_ values: NSSet)
}
extension User : Identifiable {
}
extension User {
static func getAllUsers() -> NSFetchRequest<User> {
let request:NSFetchRequest<User> = User.fetchRequest()
let sortDescriptor = NSSortDescriptor(keyPath: \User.company, ascending: false)
request.sortDescriptors = [sortDescriptor]
return request
}
}
import SwiftUI
struct AdminView: View {
@Environment(\.managedObjectContext) var moc
@EnvironmentObject var goToContentView: moveToContentView
@ObservedObject var selectedUser : User
@State var selectedImageArray : [UIImage]
@FetchRequest(fetchRequest: User.getAllUsers()) var allUsers:FetchedResults<User>
var body: some View {
List{
ForEach(self.allUsers) { user in
VStack{
Text(user.company ?? "TEST")
}
}
}
.toolbar(content: {
EditButton()
})
.animation(.default)
.navigationBarBackButtonHidden(true)
.navigationTitle("ADMIN")
.navigationBarItems(leading: Button(action: {
if self.goToContentView.goToViewFromLogin == true {
self.goToContentView.goToViewFromLogin = false
} else {
self.goToContentView.goToViewFromRegister = false
}
}) {
HStack {
Text("Sign Out")
}
},trailing: HStack{
Image(systemName: "bell")
.font(.system(size: 30))
Image(uiImage: selectedImageArray.first!)
.resizable()
.scaledToFit()
.clipShape(Circle())
.frame(width: 50, height: 50)
Text(selectedUser.name!)
.font(.system(size: 20))
})
}
}
<代码>导入基础
导入CoreData
扩展用户{
@nonobjc公共类func fetchRequest()->NSFetchRequest{
返回NSFetchRequest(entityName:“用户”)
}
@NSManaged公共变量管理:Bool
@NSV管理的公共var公司:字符串?
@NSManaged公共变量名称:字符串?
@NSManaged公共var密码:字符串?
@NSV管理的公共var照片:数据?
@NSManaged公共变量用户名:字符串?
@NSManaged公共变量id:UUID?
@NSManaged公共var票证:NSSet?
}
//标记:为票据生成的访问者
扩展用户{
@objc(AddTicketObject:)
@NSManaged public func addToTickets(uu值:票证)
@objc(移除ICKETSOBJECT:)
@NSManaged public func removeFromTickets(u值:Ticket)
@objc(addTickets:)
@NSManaged public func addToTickets(u值:NSSet)
@objc(拆卸配件:)
@NSManaged public func removeFromTickets(u值:NSSet)
}
扩展用户:可识别{
}
扩展用户{
静态函数getAllUsers()->NSFetchRequest{
let请求:NSFetchRequest=User.fetchRequest()
让sortDescriptor=NSSortDescriptor(键路径:\User.company,升序:false)
request.sortDescriptors=[sortDescriptor]
退货申请
}
}
导入快捷键
结构管理员视图:视图{
@环境(\.managedObjectContext)变量moc
@EnvironmentObject变量goToContentView:moveToContentView
@ObservedObject变量selectedUser:用户
@状态变量selectedImageArray:[UIImage]
@FetchRequest(FetchRequest:User.getAllUsers())变量allUsers:FetchedResults
var body:一些观点{
名单{
ForEach(self.alluser){user in
VStack{
文本(用户公司??“测试”)
}
}
}
.工具栏(内容:{
编辑按钮()
})
.animation(.default)
.navigationBarBackButtonHidden(真)
.navigationTitle(“管理员”)
.navigationBarItems(前导:按钮(操作:{
如果self.goToContentView.goToViewFromLogin==true{
self.goToContentView.goToViewFromLogin=false
}否则{
self.goToContentView.goToViewFromRegister=false
}
}) {
HStack{
文本(“注销”)
}
},尾随:HStack{
图像(系统名称:“贝尔”)
.font(.system(大小:30))
图像(uiImage:selectedImageArray.first!)
.可调整大小()
.scaledofit()
.clipShape(圆())
.框架(宽度:50,高度:50)
文本(selectedUser.name!)
.font(.system(大小:20))
})
}
}
将过滤器添加到列表中。也可以使用let而不是nil合并运算符。不需要VStack,因为文本都将在列表中
List {
ForEach(self.allUsers.filter({ $0.company != nil })) { user in
if let company = user.company {
Text(company)
}
}
}
听起来您可能无意中在核心数据数据库中添加了大量空白条目。那可能发生了吗?可能值得从模拟器或手机中删除你的应用程序(取决于你运行它的位置),重建并重新添加两个用户记录,看看你是否有相同的行为。如果您愿意,我还可以告诉您如何使用SQLViewer查看实际的数据库