SwiftUI:@Environment(\.presentationMode) 的解雇在 iOS14 中不起作用

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即使$showFilterfalse?说实话我不知道。

编辑2

我也尝试过:

if #available(iOS 15.0, *) {
                            let _ = Self._printChanges()
                        } else {
                            // Fallback on earlier versions
                        }
Run Code Online (Sandbox Code Playgroud)

在两者中FilterView,它都被称为JobTabsand 在两者中,我得到相同的结果:不变。

Lui*_*rez 2

在工作表中尝试添加此内容。

@Environment(\.dismiss) var dismiss // EnvironmentValue

Button("Some text") {
    // Code  
    dismiss() 
} 
Run Code Online (Sandbox Code Playgroud)

  • 原始问题的标题指定了 iOS 14 – `dismiss` 和 [`DismissAction`](https://developer.apple.com/documentation/swiftui/dismissaction#) 类型可从 iOS 15+ 开始使用。 (10认同)