RxSwift - 根据其他元素隐藏一个 UI 元素 hidden/not
RxSwift - make one UI element hidden/not hidden according to other element
我在我的项目中使用 RxSwift
和 RxCocoa
。
我有一些名为 "lastNameTF" 的 UITextField
,还有一个名为 "lastNameTitle" 的 UILabel
。
我想知道是否有任何方法可以使用 RxSwift
.
将 lastNameTitle 的 isHidden
值设置为始终等于 lastNameTF 的 isHidden
值
我相信您可以按照此处所述使用 KVO -
https://github.com/ReactiveX/RxSwift/blob/master/Documentation/GettingStarted.md#kvo
KVO超级好用。 Here is an example 你想做什么,只是不使用 RxSwift(不知道那是什么......)
这是它的要点
class ViewController: UIViewController {
private var lastNameTextFieldHiddenContext = 0
private var lastNameObservingView:UIView? = nil
@IBOutlet weak var lastNameLabel: UILabel!
@IBOutlet weak var lastNameTextField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
// add the observer
lastNameTextField.addObserver(
self,
forKeyPath: "hidden",
options: [.new],
context: &self.lastNameTextFieldHiddenContext
)
}
/// function will be called whenever an added observer is triggered
override func observeValue(
forKeyPath keyPath: String?,
of object: Any?,
change: [NSKeyValueChangeKey : Any]?,
context: UnsafeMutableRawPointer?
) {
// make sure it is our text field isHidden observer
if context == &self.lastNameTextFieldHiddenContext {
// get the new value that was set
if let newValue = change?[NSKeyValueChangeKey.newKey] as? Bool {
// do what needs to be done when the observer is triggered
self.lastNameLabel.isHidden = newValue
}
}
}
deinit {
// remove the observer
if let view = self.lastNameObservingView {
view.removeObserver(self, forKeyPath: "hidden")
self.lastNameObservingView = nil
}
}
@IBAction func showHideButtonAction(_ sender: Any) {
self.lastNameTextField.isHidden = !self.lastNameTextField.isHidden
}
}
如果您仍然需要简单的 RxSwift 方法,请试试这个:
// Controls are visible by default (isHidden = false)
let isControlHidden = BehaviorRelay<Bool>(value: false)
override func viewDidLoad() {
super.viewDidLoad()
let isHiddenDriver = self.isControlHidden.asDriver()
isHiddenDriver
.drive(self.lastNameTitle.rx.isHidden)
.disposed(by: disposeBag)
isHiddenDriver
.drive(self.lastNameTF.rx.isHidden)
.disposed(by: disposeBag)
}
由于您需要将两个控件的可见性相互绑定,您可以使用 Subject 或 Relay 来实现,在本例中为 isControlHidden。所以,如果你想show/hide,你只需发出一个新信号:
@IBAction func hide(_ sender: Any) {
self.isControlHidden.accept(true)
}
@IBAction func show(_ sender: Any) {
self.isControlHidden.accept(false)
}
我在我的项目中使用 RxSwift
和 RxCocoa
。
我有一些名为 "lastNameTF" 的 UITextField
,还有一个名为 "lastNameTitle" 的 UILabel
。
我想知道是否有任何方法可以使用 RxSwift
.
isHidden
值设置为始终等于 lastNameTF 的 isHidden
值
我相信您可以按照此处所述使用 KVO - https://github.com/ReactiveX/RxSwift/blob/master/Documentation/GettingStarted.md#kvo
KVO超级好用。 Here is an example 你想做什么,只是不使用 RxSwift(不知道那是什么......)
这是它的要点
class ViewController: UIViewController {
private var lastNameTextFieldHiddenContext = 0
private var lastNameObservingView:UIView? = nil
@IBOutlet weak var lastNameLabel: UILabel!
@IBOutlet weak var lastNameTextField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
// add the observer
lastNameTextField.addObserver(
self,
forKeyPath: "hidden",
options: [.new],
context: &self.lastNameTextFieldHiddenContext
)
}
/// function will be called whenever an added observer is triggered
override func observeValue(
forKeyPath keyPath: String?,
of object: Any?,
change: [NSKeyValueChangeKey : Any]?,
context: UnsafeMutableRawPointer?
) {
// make sure it is our text field isHidden observer
if context == &self.lastNameTextFieldHiddenContext {
// get the new value that was set
if let newValue = change?[NSKeyValueChangeKey.newKey] as? Bool {
// do what needs to be done when the observer is triggered
self.lastNameLabel.isHidden = newValue
}
}
}
deinit {
// remove the observer
if let view = self.lastNameObservingView {
view.removeObserver(self, forKeyPath: "hidden")
self.lastNameObservingView = nil
}
}
@IBAction func showHideButtonAction(_ sender: Any) {
self.lastNameTextField.isHidden = !self.lastNameTextField.isHidden
}
}
如果您仍然需要简单的 RxSwift 方法,请试试这个:
// Controls are visible by default (isHidden = false)
let isControlHidden = BehaviorRelay<Bool>(value: false)
override func viewDidLoad() {
super.viewDidLoad()
let isHiddenDriver = self.isControlHidden.asDriver()
isHiddenDriver
.drive(self.lastNameTitle.rx.isHidden)
.disposed(by: disposeBag)
isHiddenDriver
.drive(self.lastNameTF.rx.isHidden)
.disposed(by: disposeBag)
}
由于您需要将两个控件的可见性相互绑定,您可以使用 Subject 或 Relay 来实现,在本例中为 isControlHidden。所以,如果你想show/hide,你只需发出一个新信号:
@IBAction func hide(_ sender: Any) {
self.isControlHidden.accept(true)
}
@IBAction func show(_ sender: Any) {
self.isControlHidden.accept(false)
}