swift - SwiftUI:ObservableObject 不适用于 fetchRequest init
问题描述
我在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
}
我可以在其他视图中访问 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
}
}
我收到一个错误:
在初始化之前使用的变量“self.fetchRequest”
我做错了什么?我试图在没有 self 的情况下在 init 中使用这些变量。同样的错误。它起作用的唯一方法是,如果这些 startDateOfMonth 和 endDateOfMonth 不在 ObservableObject 中,而是作为祖先视图中的一个变量,我通过 fetchRequest init 作为参数传递给我的视图。但是我很少有这样的视图,并且想使用 ObservableObject,而不是一直将相同的参数传递给子视图。
解决方案
问题是你不能@EnvironmentObject
在init()
. 此处可能的选项是将EnvironmentObject
as 参数传递给视图。然后在 init 中使用该参数。这是视图的构造函数,然后您可以使用局部变量访问 start 和 endTime 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))
}
在调用该视图的地方,传递EnvironmentObject
as 参数。
//Declared as Environment Object
TransactionsListView(selectedDate : self.selectedDate)
推荐阅读
- validation - 如何删除 @ManyToOne @NotNull 引用?
- r - 如何在放大 R dygraph 时加载下采样数据?
- kotlin - 使用 Kotlin 的 Polymer 3.0 元素
- ios - LLVM 标头错误:全局命名空间中没有名为“xxxxxx”的成员(iOS、C++Builder)
- python - Python多处理:如何安全地更改其中一个进程的工作目录
- laravel - Laravel 多对多关系说没有方法用户
- ruby - 从 000 开始递增一个计数器
- ruby-on-rails - 强参数为空,不知道为什么
- r - r stargazer - 在回归输出中添加线并调整它们的顺序
- php - 如果没有检查 Recaptcha,为什么电子邮件会通过?