当目的地的必需参数来自可选状态变量时的 NavigationLink
Posted
技术标签:
【中文标题】当目的地的必需参数来自可选状态变量时的 NavigationLink【英文标题】:NavigationLink when destination's required parameter is from optional state variable 【发布时间】:2021-12-07 03:47:50 【问题描述】:使用可选状态参数导航真的让我很困惑。下面的代码无法编译,因为selectedObject
必须为零合并,因为它是NextView
的要求,但我没有什么可以合并它的。 NextView
需要此参数,因此无法编译可选。 MyObject
是一个具有所有必需属性的结构,所以我没有空的构造函数。我正在使用selected
状态来管理导航何时发生,但由于可选对象,它仍然无法编译。
struct MyView: View
@EnvironmentObject var model: Model
@State var selected = false
@State var selectedObject: MyObject? // optional because there isn't one until it's set by the child view
var body: some View
NavigationLink(destination: NextView(object: $selectedObject), isActive: self.$selected)
EmptyView()
// ... child view that when interacted with sets the selectedObject as a binding ... //
struct MyObject: Identifiable, Codable
var property1: String
var property2: String
// .... many more ...
struct NextView: View
@Binding var object: MyObject // required binding
var body: some View
Text("some stuff about my object")
【问题讨论】:
selectedObject 将如何获得价值?哪些动作或步骤使 selectedObject 获得了一些真正的价值? PS:您的问题很简单,但您需要确保我们可以为自己创建问题!我认为它缺少创建问题所需的代码。 几个选项: 1) 传入Binding<MyObject?>
而不是Binding<MyObject>
; 2) 做一个懒惰的NavigationLink
并强制解包,如果你可以确定 selectedObject
永远不会是nil
; 3) 如果selectedObject
是nil
,则创建一个自定义绑定以传递一些其他MyObject
。由你决定如何做
【参考方案1】:
如果您确定selectedObject
将在链接激活时出现,那么您可以通过即时创建的绑定来解决这种情况,例如
NavigationLink(destination: NextView(object:
Binding(
get: selectedObject!,
set: selectedObject = $0
)), isActive: self.$selected) EmptyView()
【讨论】:
谢谢,这是我丢失的关键。我还需要将NavigationLink
包装在if
中,检查self.$selected
。以上是关于当目的地的必需参数来自可选状态变量时的 NavigationLink的主要内容,如果未能解决你的问题,请参考以下文章