【问题标题】:Push View Programmatically After State Variable Defined定义状态变量后以编程方式推送视图
【发布时间】:2021-09-09 23:38:01
【问题描述】:

在我的 UI 中,我有一个供用户创建新项目的按钮。当点击按钮时,我想触发一个新视图来加载新创建的项目。

我知道我可以使用NavigationLink with isActive set to a state variable,但是在加载时还没有定义需要传递给新视图的参数(只有在创建项目之后)。如何防止项目实体尚未定义的错误?

例如:

struct FirstView: View {
    @State var newProject: Project = Project()
    @State var pushNewProject:Bool = false

var body: some View {
...
    .toolbar{
            ToolbarItem(placement: .navigationBarTrailing){
                Button(action: {
                    self.newProject = Project.create(context: viewContext)
                    self.pushNewProject = true
                }){
                   Text("Create Project")
                }
            }
        }// toolbar

        NavigationLink(destination:
                        ProjectSideBar(project:  self.newProject),
           isActive: self.$pushNewProject) {
             EmptyView()
        }.hidden()
}

【问题讨论】:

    标签: swift swiftui


    【解决方案1】:

    您可以将newProject 设为可选,因为在创建之前您并不真正想要该值。然后,您可以使用if let 可选绑定仅将目标返回到ProjectSideBar,如果有值则可用。

    这是您的代码的简化版本:

    struct Project {
        var name: String
    }
    
    struct FirstView: View {
        @State var newProject: Project?
        @State var pushNewProject:Bool = false
        
        @ViewBuilder var navDestination : some View {
            if let newProject = newProject {
                ProjectSideBar(project:  newProject)
            } else {
                EmptyView()
            }
        }
        
        var body: some View {
            NavigationView {
                VStack {
                    Button(action: {
                        self.newProject = Project(name: "test")
                        self.pushNewProject = true
                    }){
                        Text("Create Project")
                    }
                    
                    NavigationLink(destination: navDestination,
                                   isActive: self.$pushNewProject) {
                        EmptyView()
                    }.hidden()
                }
            }
        }
    }
    
    struct ProjectSideBar : View {
        var project : Project
        
        var body: some View {
            Text(project.name)
        }
    }
    

    请注意,我首先尝试在NavigationLink 周围使用if let,而不必执行navDestination 计算属性,但这会导致新视图没有动画的情况。我相信这曾经可以工作,但从 iOS 15 开始,它似乎一直需要层次结构中的 NavigationLink 才能获得动画。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-22
      • 1970-01-01
      • 1970-01-01
      • 2019-12-10
      • 1970-01-01
      • 2017-06-18
      相关资源
      最近更新 更多