定义状态变量后以编程方式推送视图

Posted

技术标签:

【中文标题】定义状态变量后以编程方式推送视图【英文标题】: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()


【问题讨论】:

【参考方案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 才能获得动画。

【讨论】:

以上是关于定义状态变量后以编程方式推送视图的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式切换自定义视图(推送和弹出)

病毒扫描后以编程方式移动文件

JSON请求后以编程方式TableView不会重新加载数据

如何在自定义单元格中点击以编程方式添加的 UiImageViews 推送新视图

使用自定义初始化程序 swift 以编程方式实例化和推送视图控制器

在UITextfield中输入文本后以编程方式更改焦点