【发布时间】:2021-09-06 08:51:40
【问题描述】:
我正在尝试将绑定传递给我的虚拟机,它应该是一个过滤器,以便虚拟机根据参数传递的过滤器获取对象。
很遗憾,我无法初始化 VM,因为我在初始化 VM self.jobsViewModel = JobsViewModel(jobFilter: $jobFilter) 的行中收到错误 'self' used before all stored properties are initialized
struct JobsTab: View {
@ObservedObject var jobsViewModel: JobsViewModel
@ObservedObject var categoriesViewModel: CategoriesViewModel
@StateObject var searchText: SearchText = SearchText()
@State private var isEditing: Bool
@State private var showFilter: Bool
@State private var jobFilter: JobFilter
init() {
self.categoriesViewModel = CategoriesViewModel()
self.jobFilter = JobFilter(category: nil)
self.showFilter = false
self.isEditing = false
self.jobsViewModel = JobsViewModel(jobFilter: $jobFilter)
}
我想我正在初始化所有变量,而 self.searchText 不在 init 块中,因为编译器抱怨它是一个只能获取的属性。
还有其他方法吗?
谢谢!
编辑:这是我的虚拟机:
class JobsViewModel: ObservableObject {
@Published var isLoading: Bool = false
@Published var jobs: [Jobs] = []
@Binding var jobFilter: JobFilter
init(jobFilter: Binding<JobFilter>) {
_jobFilter = jobFilter
}
...
}
struct JobFilter {
var category: Category?
}
我的想法是在 JobsTab 中将作业过滤器作为一个状态,并且每次该状态发生变化时,VM 都会尝试获取与 JobFilter 匹配的作业
【问题讨论】:
-
您在初始化之前访问了该值,但即使您在初始化时没有问题,也可以在出现时使用
-
非常感谢您的及时回答!
onAppear是什么意思?我应该在哪里做,在JobsTab或JobsViewModel? -
我更喜欢从超级视图注入 ViewModelError 的模式。你可能应该注入一个
JobsTabViewModel,你已经用JobsModel和CategoriesModel或其他东西初始化了它;这个视图不应该知道其他视图视图模型的任何信息 -
使用自定义初始化在 SwiftUI 中效果不佳。远离自定义初始化。您的 Viewmodel 可能会泄漏,并且您的状态变量未正确初始化。 developer.apple.com/documentation/swiftui/…
-
@Cristik 对此感到抱歉;我现在已将其添加到原始问题中