Подпишитесь на переменную пользовательского UIView - PullRequest
2 голосов
/ 27 мая 2020

У меня есть настраиваемое представление, и в этом настраиваемом представлении я объявил var isSelected: false, который будет переключаться при нажатии на представление.

После того, как я добавлю два из этих настраиваемых представлений в свой ViewController.

Мне нужно : когда я выбираю одно из представлений, выбор другого сразу же отменяется, поэтому одновременно можно выбрать только одно.

Я не хорошо осведомлены об этом, но я предполагаю, что с помощью RxCocoa (или в идеале RxSwift) можно было бы установить эту isSelected переменную каждого представления как наблюдаемую, а затем в подписке установить для другого значение false, когда оно станет правда.

Помощь будет очень благодарна, заранее спасибо.

1 Ответ

1 голос
/ 28 мая 2020

Я знаю, что то, о чем вы просите, кажется разумной идеей, но это не так. Ваше логическое значение 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
        })
    }
}
...