我有一个视图,该视图显示用于筛选列表中项目的工作表。该视图具有以下变量:
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)
}
}
但是,在工作表中,我正在尝试以下操作,在单击“已完成”按钮(仅在“取消”按钮上)时,无法使视图被取消:
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()
}
}
}
我也尝试过像保罗那样的@Binding
,这里说,但是没有运气。有什么解决办法吗,还是我做错了什么?
提前感谢!
编辑:我已经发布了两个视图的属性,因为我认为问题来自于FilterView
self.jobFilter = self.draft
中的行。这里我要做的是创建一个过滤器视图,当用户按DONE按钮时,前面的行将被执行:我希望在JobsTab
中指定绑定JobsTab
中的FilterView
源的值(这是一个@State
),而且很可能,由于我正在更新绑定jobFilter
,FilterView
将再次显示,即使$showFilter
是false
?我不知道老实说。
EDIT2:我也尝试过 if #available(iOS 15.0,*) { let _= Self._printChanges() }Self._printChanges{ //回退到早期版本}
in both `FilterView` and its called `JobTabs` and in both, I get the same result: unchanged
发布于 2022-07-06 15:08:14
在工作表中,尝试添加以下内容。
@Environment(\.dimiss) var dismiss
Button("Some text") {
// Code
dismiss()
}
发布于 2022-07-06 15:12:03
根据您的代码,我假设您的FilterView()不是子视图,而是它自己的独立视图。因此,要确保"presentationMode.wrappedValue.dismiss()“工作正常,不需要在FilerView()之外创建@Binding或@State变量来在不同视图之间来回传递数据。只需在FilterView()中创建一个变量即可使其工作。我没有完整的代码,但我创建了与您的问题类似的情况,如下代码所示:
import SwiftUI
struct Main: View {
@State private var showFilter = false
var body: some View {
Button {
self.showFilter = true
} label: {
Image(systemName: "line.horizontal.3.decrease.circle")
.renderingMode(.original)
}
.sheet(isPresented: $showFilter) {
FilterView()
}
}
}
struct FilterView: View {
@Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
var body: some View {
NavigationView {
VStack {
Text("Filter View")
}.toolbar {
ToolbarItem(placement: .navigationBarLeading) {
Button {
presentationMode.wrappedValue.dismiss()
} label: {
Text("cancel")
}
}
ToolbarItem(placement: .navigationBarTrailing) {
Button {
presentationMode.wrappedValue.dismiss()
} label: {
Text("okay")
}
}
}
}
}
}
发布于 2022-07-06 16:07:20
缺少参数onDismiss
:
.sheet(isPresented: $showFilter, onDismiss: { isPresented = false }) { ... }
https://stackoverflow.com/questions/72885667
复制相似问题