Core data CoreData FetchRequest正在加载我的列表,其中除了FetchedData之外还有可选的结果数据

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

我在AdminView结构内部调用@FetchRequest,希望使用ForEach在列表中显示数据。我正在请求所有用户实体数据,但当我运行应用程序时,列表显示了我的2个现有条目结果,但由于某些原因,它还显示了默认为可选字符串“TEST”的大约40个条目

我试图理解如何让列表只显示两个用户条目,而不显示列表中的默认字符串

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查看实际的数据库