【问题标题】:NavigationLink when destination's required parameter is from optional state variable当目的地的必需参数来自可选状态变量时的 NavigationLink
【发布时间】: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) 如果selectedObjectnil,则创建一个自定义绑定以传递一些其他MyObject。由你决定如何做

标签: ios swiftui


【解决方案1】:

如果您确定selectedObject 将在链接激活时出现,那么您可以通过即时创建的绑定来解决这种情况,例如

    NavigationLink(destination: NextView(object:
        Binding(
            get: {selectedObject!},
            set: {selectedObject = $0}
        )), isActive: self.$selected) { EmptyView()
    }

【讨论】:

  • 谢谢,这是我丢失的关键。我还需要将NavigationLink 包装在if 中,检查self.$selected
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-05
  • 1970-01-01
  • 2014-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多