我在swiftUI视图中具有绑定。类似于:
struct MyCoolView: View {
@ObservedObject var viewModel: ViewModel
var body: some View {
Text("Here is a cool Text!").sheet(isPresented: $viewModel.MyProperty) {
SomeModalView()}
}
}
我希望isPresented使用属性中存储的 opposite 布尔值。
Swift不会让我做类似
.sheet(isPresented: !$viewModel.MyProperty)
((这给我一个关于无法将Binding <Bool>
转换为Bool
的错误)
有关如何处理此问题的任何想法?
答案 0 :(得分:7)
如何创建自定义前缀运算符?
prefix func ! (value: Binding<Bool>) -> Binding<Bool> {
Binding<Bool>(
get: { !value.wrappedValue },
set: { value.wrappedValue = !$0 }
)
}
然后,您可以运行代码而无需进行任何修改:
.sheet(isPresented: !$viewModel.MyProperty)
如果您不喜欢运算符,则可以在Binding类型上创建扩展名:
extension Binding where Value == Bool {
var not: Binding<Value> {
Binding<Value>(
get: { !self.wrappedValue },
set: { self.wrappedValue = !$0 }
)
}
}
,然后做类似的事情:
.sheet(isPresented: $viewModel.MyProperty.not)
甚至尝试使用全局not函数:
func not(_ value: Binding<Bool>) -> Binding<Bool> {
Binding<Bool>(
get: { !value.wrappedValue },
set: { value.wrappedValue = !$0 }
)
}
并像这样使用它:
.sheet(isPresented: not($viewModel.MyProperty))
答案 1 :(得分:3)
您可以自己建立绑定:
Text("Here is a cool Text!").sheet(isPresented:
Binding<Bool>(get: {return !self.viewModel.MyProperty},
set: { p in self.viewModel.MyProperty = p})
{ SomeModalView()} }
答案 2 :(得分:3)
根据@ E.Com的回答,这是构造Binding<Bool>
的较短方法:
Binding<Bool>(
get: { !yourBindingBool },
set: { yourBindingBool = !$0 }
)
答案 3 :(得分:0)
添加扩展名,如下所示:
extension Binding where Value == Bool {
func negate() -> Bool {
return !(self.wrappedValue)
}
}