如何解决除了 FetchedData 之外,CoreData FetchRequest 正在加载带有可选结果数据的列表
我正在 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({ $0.company != nil })) { user in
if let company = user.company {
Text(company)
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。