gpt4 book ai didi

SwiftUI:ObservableObject 不适用于 fetchRequest init

转载 作者:行者123 更新时间:2023-12-05 06:14:47 25 4
gpt4 key购买 nike

我在我的 DateView 中有一个这样声明的 ObservableObject:

import SwiftUI

class SelectedDate: ObservableObject {
@Published var selectedMonth: Date = Date()

var startDateOfMonth: Date {
let components = Calendar.current.dateComponents([.year, .month], from: self.selectedMonth)
let startOfMonth = Calendar.current.date(from: components)!
return startOfMonth
}

var endDateOfMonth: Date {
var components = Calendar.current.dateComponents([.year, .month], from: self.selectedMonth)
components.month = (components.month ?? 0) + 1
let endOfMonth = Calendar.current.date(from: components)!
return endOfMonth
}
}

struct DateView: View {
// other code
}

我可以像这样在其他 View 中访问 startDateOfMonth 和 endDateOfMonth:

Text("\(self.selectedDate.startDateOfMonth)")

但是当我尝试在我的 TransactionsListView 中的 fetchRequest 初始值设定项中使用来自 ObservableObject 的那些变量时,我遇到了问题:

    import SwiftUI

struct TransactionsListView: View {

@Environment(\.managedObjectContext) var managedObjectContext
var fetchRequest: FetchRequest<NPTransaction>
var transactions: FetchedResults<NPTransaction> { fetchRequest.wrappedValue }
@EnvironmentObject var selectedDate: SelectedDate

// other code
init() {
fetchRequest = FetchRequest<NPTransaction>(entity: NPTransaction.entity(), sortDescriptors: [
NSSortDescriptor(keyPath: \NPTransaction.date, ascending: false)
], predicate: NSPredicate(format: "date >= %@ AND date < %@", self.selectedDate.startDateOfMonth as NSDate, self.selectedDate.endDateOfMonth as NSDate))
}

var body: some View {
// other code
}
}

我收到一个错误:

Variable 'self.fetchRequest' used before being initialized

我做错了什么?我试图在没有 self 的情况下使用 init 中的那些变量。同样的错误。它工作的唯一方法是如果那些 startDateOfMonth 和 endDateOfMonth 不在 ObservableObject 中,而是作为祖先 View 中的变量,我使用 fetchRequest init 作为参数传递给我的 View 。但是我很少有这样的 View ,并且想使用 ObservableObject,而不是一直将相同的参数传递给 subview 。

最佳答案

问题是您不能在init() 中使用@EnvironmentObject。此处可能的选项是将 EnvironmentObject 作为参数传递给 View 。然后在 init 中使用该参数。这是 View 的构造函数,然后您可以使用局部变量 selectedDate 访问开始和结束时间。

init(selectedDate : SelectedDate) 
{
//now you can access selectedDate here and use it in FetchRequest
fetchRequest = FetchRequest<NPTransaction>(entity: NPTransaction.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \NPTransaction.date, ascending: false)], predicate: NSPredicate(format: "date >= %@ AND date < %@", selectedDate.startDateOfMonth as NSDate, selectedDate.endDateOfMonth as NSDate))
}

在调用该 View 的地方,将 EnvironmentObject 作为参数传递。

                                    //Declared as Environment Object
TransactionsListView(selectedDate : self.selectedDate)

关于SwiftUI:ObservableObject 不适用于 fetchRequest init,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62748596/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com