Swift 绑定到计算 属性
Swift binding to a computed property
有以下情况。我有一个视图模型,它是一个具有 Bool 类型计算 属性 的可观察对象。我希望能够 enable/disable 基于计算 属性 的导航 link,但我需要一个绑定才能这样做。这里有一个简化的例子:
struct Project {
var name: String
var duration: Int
}
class MyViewModel: Observable Object {
@Published var project: Project
var isProjectValid: Bool {
return project.name != "" && project.duration > 0
}
}
struct MyView: View {
@EnvironmentObject var myVM: MyViewModel
var body: some View {
...
NavigationLink("Click Link", isActive: ?????, destination: NextView())
...
}
}
由于 isActive 需要绑定,因此我无法访问计算 属性,例如 myVM.isProjectValid。还尝试了项目 class 中的计算 属性,仍然是同样的问题。
还考虑过创建与计算相关的自定义绑定 属性,但不太确定 if/how 是否应该这样做。
我发布的第一个问题,所以如果我遗漏了一些细节,请多多包涵:)
将其设为 @Published
属性 并在 project
更改时更新它
class MyViewModel: ObservableObject {
@Published var project: Project {
didSet {
isProjectValid = project.name != "" && project.duration > 0
}
}
@Published var isProjectValid: Bool
//...
}
计算 属性 的使用建议用户不应直接触发 NavigationLink
的某种设计。但是 NavigationLink
应该作为代码中其他地方的某些其他机制的 side-effect 以编程方式触发。例如可能在用户完成表单或类似过程时完成。
如果这是目标,则不是 100%,但如果是,那么一种选择是将常量绑定传递给 NavigationLink
,例如
NavigationLink("Click Link", isActive: .constant(myVM.isProjectValid), destination: NextView())`
有以下情况。我有一个视图模型,它是一个具有 Bool 类型计算 属性 的可观察对象。我希望能够 enable/disable 基于计算 属性 的导航 link,但我需要一个绑定才能这样做。这里有一个简化的例子:
struct Project {
var name: String
var duration: Int
}
class MyViewModel: Observable Object {
@Published var project: Project
var isProjectValid: Bool {
return project.name != "" && project.duration > 0
}
}
struct MyView: View {
@EnvironmentObject var myVM: MyViewModel
var body: some View {
...
NavigationLink("Click Link", isActive: ?????, destination: NextView())
...
}
}
由于 isActive 需要绑定,因此我无法访问计算 属性,例如 myVM.isProjectValid。还尝试了项目 class 中的计算 属性,仍然是同样的问题。
还考虑过创建与计算相关的自定义绑定 属性,但不太确定 if/how 是否应该这样做。
我发布的第一个问题,所以如果我遗漏了一些细节,请多多包涵:)
将其设为 @Published
属性 并在 project
更改时更新它
class MyViewModel: ObservableObject {
@Published var project: Project {
didSet {
isProjectValid = project.name != "" && project.duration > 0
}
}
@Published var isProjectValid: Bool
//...
}
计算 属性 的使用建议用户不应直接触发 NavigationLink
的某种设计。但是 NavigationLink
应该作为代码中其他地方的某些其他机制的 side-effect 以编程方式触发。例如可能在用户完成表单或类似过程时完成。
如果这是目标,则不是 100%,但如果是,那么一种选择是将常量绑定传递给 NavigationLink
,例如
NavigationLink("Click Link", isActive: .constant(myVM.isProjectValid), destination: NextView())`