首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SwiftUI:@Environment(\.presentationMode)解雇不在iOS14工作

SwiftUI:@Environment(\.presentationMode)解雇不在iOS14工作
EN

Stack Overflow用户
提问于 2022-07-06 14:50:08
回答 4查看 1.4K关注 0票数 1

我有一个视图,该视图显示用于筛选列表中项目的工作表。该视图具有以下变量:

代码语言:javascript
运行
复制
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)
        }
    }

但是,在工作表中,我正在尝试以下操作,在单击“已完成”按钮(仅在“取消”按钮上)时,无法使视图被取消:

代码语言:javascript
运行
复制
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),而且很可能,由于我正在更新绑定jobFilterFilterView将再次显示,即使$showFilterfalse?我不知道老实说。

EDIT2:我也尝试过 if #available(iOS 15.0,*) { let _= Self._printChanges() }Self._printChanges{ //回退到早期版本}

代码语言:javascript
运行
复制
in both `FilterView` and its called `JobTabs` and in both, I get the same result: unchanged
EN

回答 4

Stack Overflow用户

发布于 2022-07-06 15:08:14

在工作表中,尝试添加以下内容。

代码语言:javascript
运行
复制
@Environment(\.dimiss) var dismiss 

Button("Some text") {
    // Code  
    dismiss() 
} 
票数 0
EN

Stack Overflow用户

发布于 2022-07-06 15:12:03

根据您的代码,我假设您的FilterView()不是子视图,而是它自己的独立视图。因此,要确保"presentationMode.wrappedValue.dismiss()“工作正常,不需要在FilerView()之外创建@Binding或@State变量来在不同视图之间来回传递数据。只需在FilterView()中创建一个变量即可使其工作。我没有完整的代码,但我创建了与您的问题类似的情况,如下代码所示:

代码语言:javascript
运行
复制
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")
                }
            }
        }
    }
}
}
票数 0
EN

Stack Overflow用户

发布于 2022-07-06 16:07:20

缺少参数onDismiss

代码语言:javascript
运行
复制
.sheet(isPresented: $showFilter, onDismiss: { isPresented = false }) { ... }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72885667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档