我有这样的看法:
struct View1: View {
@Binding var myVariable: Bool
init() {
_myVariable = Binding.constant(true) // It works but myVariable is immutable, so I can't edit myVariable
}
init(myVariable: Binding<Bool>) {
_myVariable = myVariable
}
var body: some View {
Button("Change") {
myVariable.toggle()
}
}
}
struct View2: View {
var body: some View {
View1()
}
}
struct View3: View {
@State var myVariable = false
var body: some View {
View1(myVariable: $myVariable)
}
}
Run Code Online (Sandbox Code Playgroud)
我想要这样做:如果提供了一个参数,请将其设置为 myVariable,就像 View1 中的第二个 init 一样。否则,像第一个 init 中一样设置 myVariable 的第一个值。
我尝试使用 Binding.constant(value) 但它是不可变的。而且我无法编辑该变量。因此,我需要一个可变的 Binding 初始值设定项,例如 Binding.constant(value)。但我找不到它。
我怎么解决这个问题?
Geo*_*e_E -2
为了避免过于复杂View1,您可以创建一个具有该名称的中间视图,然后拥有一个private具有实际实现的“内部”视图。
代码:
private struct View1Internal: View {
@Binding var myVariable: Bool
var body: some View {
Button("Change") {
myVariable.toggle()
}
}
}
Run Code Online (Sandbox Code Playgroud)
struct View1: View {
private enum Kind {
case state
case binding(Binding<Bool>)
}
@State private var state = true
private let kind: Kind
init() {
kind = .state
}
init(myVariable: Binding<Bool>) {
kind = .binding(myVariable)
}
var body: some View {
switch kind {
case .state: View1Internal(myVariable: $state)
case .binding(let binding): View1Internal(myVariable: binding)
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
497 次 |
| 最近记录: |