SwiftUI:将绑定转换为另一个绑定

时间:2019-11-19 14:34:24

标签: swiftui

有没有办法例如逻辑上否定Binding<Bool>?例如,我有一个状态变量

@State var isDone = true

我将其作为出价传递给不同的子视图。然后我想使用它例如与isActive中的NavigationLink一起使用,以便仅在not isDone时显示:

NavigationLink(destination: ..., isActive: ! self.$isDone ) // <- `!` means `not done`

当然,我可以使用isDone -> isNotDone反转逻辑,但是在许多情况下这是不自然的。那么,有没有简单的方法可以使布尔绑定反向?

1 个答案:

答案 0 :(得分:2)

如果我正确理解您的需求,则需要满足以下条件:

extension Binding where Value == Bool {
    public func negate() -> Binding<Bool> {
        return Binding<Bool>(get:{ !self.wrappedValue }, 
            set: { self.wrappedValue = !$0})
    }
}

struct TestInvertBinding: View {
    @State var isDone = true
    var body: some View {
        NavigationView {
            NavigationLink(destination: Text("Details"), 
                isActive: self.$isDone.negate()) {
                Text("Navigate")
            }
        }
    }
}

struct TestInvertBinding_Previews: PreviewProvider {
    static var previews: some View {
        TestInvertBinding()
    }
}