我尝试了这里和其他地方提出的所有类型的解决方案(例如,添加集合的扩展,安全元素迭代等),但不幸的是没有一个有效。我也试过改“最后!”为了“第一!”在onDelete代码中,但这会导致相同的问题,尽管令人惊讶的是,它确实适用于我所见过的其他线程中的其他线程。我应该注意的是,只有当我在我的应用程序中结合了CoreData和Firebase时,这种情况才开始发生。您的帮助将不胜感激。提前谢谢。
用作环境对象并启动Firebase的类:
class DayData: ObservableObject, Identifiable {
@Published var date = Date()
@Published var completed = false
@Published var percentage: Double = 0.0
@Published var liquids: Double = 0
var allData : [DayCellModel] = []
let dbRef = Firestore.firestore()
init() {
readAllData()
}
func readAllData(){
dbRef.collection("keanu").addSnapshotListener{ (snap, err) in
guard let docs = snap else { return }
self.allData = docs.documents.compactMap({ (doc) -> DayCellModel? in
return try! doc.data(as: DayCellModel.self)
})
}
仅用于Firebase的DayCellModel结构:
struct DayCellModel : Identifiable, Codable {
@DocumentID var id: String?
var date : Date = Date()
var completed : Bool = false
var percentage : Double = 0.0
var liquids: Int = 0
}
仅用于CoreData的数据模型类:
extension NSDayData {
@nonobjc public class func getDayData() -> NSFetchRequest<NSDayData> {
let request:NSFetchRequest<NSDayData> = NSDayData.fetchRequest() as! NSFetchRequest<NSDayData>
let sortDescriptor = NSSortDescriptor(key: "date", ascending: true)
request.sortDescriptors = [sortDescriptor]
return request
}
@NSManaged public var completed: Bool
@NSManaged public var id: UUID?
@NSManaged public var liquids: Double
@NSManaged public var percentage: Double
@NSManaged public var date: Date?
}
extension NSDayData : Identifiable {
}
包含我的列表的代码和onDelete代码的结构:
struct ListView: View {
@Environment(\.managedObjectContext) var moc
@FetchRequest(fetchRequest : NSDayData.getDayData()) var dayItems:FetchedResults<NSDayData>
@EnvironmentObject var data : DayData
var body: some View {
NavigationView{
VStack(spacing: 10){
HStack{
Text("Date")
Text("Completion")
Text("Liquids")
}.font(.caption)
List{
ForEach(dayItems, id: \.id) { collection in
HStack{
Text("\(collection.date?.string(format: self.dateFormat) ?? Date().string(format: self.dateFormat))")
Text(collection.percentage > 0.95 ? "100%" : "\(Int(collection.percentage * 100))")
Text("\(Int(collection.liquids))oz")
}.font(.system(size: 10, weight: .light))
}.onDelete{ (index) in
let db = Firestore.firestore()
db.collection("keanu")
.document(self.data.allData[index.last!].id!)
.delete { (err) in
if err != nil{
print((err?.localizedDescription)!)
return
}
}
self.deleteItems(at: index)
}
}
}
func deleteItems(at offsets: IndexSet) {
withAnimation{
offsets.map { dayItems[$0] }.forEach(moc.delete)
saveMoc()
data.allData.remove(atOffsets: offsets)
}
}
我有另一个视图,我在其中添加新数据并将其保存到Firebase和CoreData,如下所示:
if self.newCollection {
let dayData = NSDayData(context: self.moc)
dayData.id = UUID()
dayData.date = self.data.date
dayData.completed = self.data.percentage > 0.95
dayData.percentage = self.data.percentage
dayData.liquids = self.data.liquids
do {
try moc.save()
} catch {
let error = error as NSError
fatalError("Unresolved Error: \(error)")
}
let db = Firestore.firestore()
db.collection("keanu").document()
.setData(
[
"date": self.data.date,
"completed": self.data.percentage > 0.95,
"percentage": self.data.percentage,
"liquids": self.data.liquids
]) { (err) in
if err != nil{
print((err?.localizedDescription)!)
return
}
}
发布于 2020-12-10 17:02:17
好了,在youtube上看了kavsoft的一些很棒的视频后,我终于找到了答案。对于那些可能遇到类似问题的人,这是我的解决方案:
@Binding var docID: String
状态在列表视图中,为docID的绑定变量创建@
@State var docID = ""
然后,当我从我的列表中显示编辑视图时,它显示如下:
.sheet(isPresented: $show, content: {
EditView(docID: $docID, show: self.$show newEntry: true)
.environment(\.managedObjectContext, self.moc)
})
if self.remove{ VStack{ VStack(action:{ let db = Firestore.firestore() db.collection("myCollection").document(docID).delete() moc.delete(moc.delete) saveMoc() } }) {VStack(systemName:"minus.circle.fill") }.buttonStyle(BorderlessButtonStyle()) }
5.2。我还有一个导航栏按钮,可以触发"-“符号出现
var deleteButton : some View {
Button(action: {
self.remove.toggle()
}) {
Image(systemName: self.remove ? "xmark.circle" :
"trash")
}
让dayData = NSDayData(context: self.moc) dayData.id = self.docID
Firebase属性:
let db = Firestore.firestore()
db.collection("yourCollection").document(self.docID)
.setData(
[
"id": self.docID,
...
https://stackoverflow.com/questions/65234642
复制相似问题