除了 FetchedData 之外,CoreData FetchRequest 正在用可选结果数据加载我的列表

CoreData FetchRequest is loading my List with Optional result data in addition to the FetchedData

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

我正在尝试了解如何让列表仅显示两个用户条目而不显示列表中的默认字符串。

非常感谢!

相关代码如下:

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))
        })
        
    }
}

向列表添加过滤器。您也可以使用 let 代替 nil-coalescing 运算符。不需要 VStack,因为文本都在列表中。

List {
   ForEach(self.allUsers.filter({ [=10=].company != nil })) { user in
      if let company = user.company {
          Text(company)
      }
   }
}