【问题标题】:Subscribe to a variable of a custom UIView订阅自定义 UIView 的变量
【发布时间】:2020-05-27 14:05:50
【问题描述】:

我有一个自定义视图,在这个自定义视图中我声明了var isSelected: false,它会在点击视图时进行切换。

在我的 ViewController 中添加其中两个自定义视图之后。

我需要的是:当我选择一个视图时,另一个视图立即被取消选择,因此只能同时选择一个。

我对此了解不多,但我认为使用 RxCocoa(或理想情况下是 RxSwift)可能可以将每个视图的 isSelected 变量设置为可观察的,然后在订阅中设置一旦它变为真,另一个变为假。

非常感谢您的帮助,在此先感谢您。

【问题讨论】:

  • 即使没有 RxSomething 也是可能的。向视图添加一个回调闭包,并在 isSelected 更改为 true 时调用它。传递对闭包中视图的引用并分别取消选择另一个视图。或使用NSKeyValueObservation
  • 你能分享一些你已经完成的工作吗?

标签: ios swift reactive-programming rx-swift rx-cocoa


【解决方案1】:

我知道您的要求似乎是一个合理的想法,但事实并非如此。您的 isSelected 布尔值不会改变状态,除非您专门编写代码以 make 它改变状态。这就引出了一个问题,为什么其他代码监控您的视图的 isSelected 布尔值而不是导致布尔值改变状态的事件?为什么是中间人?尤其是作为您的视图系统一部分的中间人,而不是您的模型。

适当的解决方案是在您的模型中拥有一个绑定到您的两个视图的 Observable...

更好的是:

class CustomView: UIView {
    var isSelected: Bool = false
}

class Example {
    let viewA = CustomView()
    let viewB = CustomView()
    let disposeBag = DisposeBag()

    func example(model: Observable<Bool>) {
        disposeBag.insert(
            model.bind(to: viewA.rx.isSelected),
            model.map { !$0 }.bind(to: viewB.rx.isSelected)
        )
    }
}

extension Reactive where Base: CustomView {
    var isSelected: Binder<Bool> {
        Binder(base, binding: { view, isSelected in
            view.isSelected = isSelected
        })
    }
}

【讨论】:

    猜你喜欢
    • 2016-03-26
    • 2020-08-12
    • 1970-01-01
    • 2021-05-20
    • 2021-12-23
    • 2020-03-04
    • 1970-01-01
    • 2018-05-14
    • 2017-12-15
    相关资源
    最近更新 更多