nol*_*man 6 swift swiftui environmentobject
我有一个视图,显示用于过滤列表中项目的工作表。该视图有这个变量:
struct JobsTab: View {
@State private var jobFilter: JobFilter = JobFilter()
var filter: some View {
Button {
self.showFilter = true
} label: {
Image(systemName: "line.horizontal.3.decrease.circle")
.renderingMode(.original)
}
.sheet(isPresented: $showFilter) {
FilterView($jobFilter, categoriesViewModel, jobsViewModel)
}
}
Run Code Online (Sandbox Code Playgroud)
但是,在工作表中,我正在尝试以下操作,但单击“完成”按钮时无法关闭视图,只能单击“取消”按钮:
struct FilterView: View {
@Environment(\.presentationMode) var presentationMode
@ObservedObject var categoriesViewModel: CategoriesViewModel
@ObservedObject var jobsViewModel: JobsViewModel
let filterViewModel: FilterViewModel
@Binding var jobFilter: JobFilter
@State private var draft: JobFilter
@State var searchText = ""
init(_ jobFilter: Binding<JobFilter>, _ categoriesViewModel: CategoriesViewModel, _ jobsViewModel: JobsViewModel) {
_jobFilter = jobFilter
_draft = State(wrappedValue: jobFilter.wrappedValue)
self.categoriesViewModel = categoriesViewModel
self.jobsViewModel = jobsViewModel
self.filterViewModel = FilterViewModel()
}
...
.toolbar {
ToolbarItem(placement: .navigationBarLeading) {
Button("FilterView.Button.Cancel.Text".capitalizedLocalization) {
presentationMode.wrappedValue.dismiss()
}
}
ToolbarItem(placement: .navigationBarTrailing) {
Button("FilterView.Button.Done.Text".capitalizedLocalization) {
let request = Job.defaultRequest()
request.predicate = filterViewModel.buildPredicate(withJobFilterDraft: self.draft)
request.sortDescriptors = [NSSortDescriptor(key: #keyPath(Job.publicationDate), ascending: false)]
jobsViewModel.filteredJobsFetchRequest = request
self.jobFilter = self.draft
presentationMode.wrappedValue.dismiss()
}
}
}
Run Code Online (Sandbox Code Playgroud)
我也尝试过@Binding像保罗在这里所说的那样,但没有运气。有什么解决方法吗,还是我做错了什么?
我已经发布了两个视图的属性,因为我认为问题来自FilterView self.jobFilter = self.draft.
我在这里尝试做的是创建一个过滤器视图,并且当用户按下“完成”按钮时将执行上述行:我想jobFilter在真实来源JobsTab的值中分配我的绑定FilterView(这是 a @State)和可能,因为我正在更新绑定,jobFilter所以FilterView即使$showFilter是false?说实话我不知道。
我也尝试过:
if #available(iOS 15.0, *) {
let _ = Self._printChanges()
} else {
// Fallback on earlier versions
}
Run Code Online (Sandbox Code Playgroud)
在两者中FilterView,它都被称为JobTabsand 在两者中,我得到相同的结果:不变。
在工作表中尝试添加此内容。
@Environment(\.dismiss) var dismiss // EnvironmentValue
Button("Some text") {
// Code
dismiss()
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8909 次 |
| 最近记录: |