【问题标题】:SwiftUI: @Environment(\.presentationMode)'s dismiss not working in iOS14SwiftUI:@Environment(\.presentationMode) 的关闭在 iOS14 中不起作用
【发布时间】:2022-07-06 23:12:03
【问题描述】:

我有一个显示用于过滤列表中项目的工作表的视图。视图有这个变量:

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)
        }
    }

但是,在工作表中,我正在尝试以下操作,我无法在单击“完成”按钮时关闭视图,只能在“取消”按钮上:

...
.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,就像 Paul 说的 here,但没有运气。 有什么解决方法,还是我做错了什么?

提前致谢!

【问题讨论】:

  • 只看代码,什么都没有。我会尝试注释掉除dismiss() 行之外的所有内容并验证其是否有效,然后逐行添加其余部分以查看是否有任何内容阻止解雇?
  • 需要最小的可重现示例,这是其他代码中的内容。

标签: swift swiftui environmentobject


【解决方案1】:

在工作表中尝试添加它。

@Environment(\.dimiss) var dismiss 

Button("Some text") {
    // Code  
    dismiss() 
} 

【讨论】:

    【解决方案2】:

    根据您的代码,我假设您的 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")
                    }
                }
            }
        }
    }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-08
      • 1970-01-01
      • 2020-04-21
      • 2021-04-18
      • 1970-01-01
      相关资源
      最近更新 更多