定义状态变量后以编程方式推送视图
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
才能获得动画。
【讨论】:
以上是关于定义状态变量后以编程方式推送视图的主要内容,如果未能解决你的问题,请参考以下文章
如何在自定义单元格中点击以编程方式添加的 UiImageViews 推送新视图