如何在按钮点击时观察 PublishSubject

dan*_*nd1 2 uiview ios rx-swift rx-cocoa

我正在处理这种情况,我想在这里应用 RxSwift。

我有.xib带按钮的 UIView。

class RightButtonItemView: UIView {

    @IBOutlet weak var rightButtonimageView: UIImageView!
    @IBOutlet weak var rightButtonButton: UIButton!

    let performEventSegue = PublishSubject<Bool>()

    class func instanceFromNib() -> RightButtonItemView {
        return UINib(nibName: "NotificationView", bundle: nil).instantiate(withOwner: nil, options: nil)[0] as!  RightButtonItemView
    }

    override func awakeFromNib() {
       //I'm not sure how should I link button tap and my subject 
       rightButtonButton.rx.tap
    }
}
Run Code Online (Sandbox Code Playgroud)

我在 viewController 中创建了这个视图的一个实例

var rightButtonItemView = RightButtonItemView.instanceFromNib()
Run Code Online (Sandbox Code Playgroud)

Bu从我的segue点击这个按钮我需要移动到下一个VC,所以我订阅了UIView的主题

rightButtonItemView.performEventSegue.asObserver().subscribe(onNext: { (isAuthorized) in

        if isAuthorized {
            let storyboard = UIStoryboard(name: "Notifications", bundle: nil)
            let viewController = storyboard.instantiateViewController(withIdentifier: "UserNotificationsViewController")
            self.present(viewController, animated: true, completion: nil)
        }
    })
Run Code Online (Sandbox Code Playgroud)

但是我不知道如何通过更改发布主题的状态来链接按钮点击?

Dan*_* T. 5

bind在这种情况下使用运算符:

class RightButtonItemView: UIView {

    @IBOutlet weak var rightButtonimageView: UIImageView!
    @IBOutlet weak var rightButtonButton: UIButton!

    let performEventSegue = PublishSubject<Void>()
    private let bag = DisposeBag()

    class func instanceFromNib() -> RightButtonItemView {
        return UINib(nibName: "NotificationView", bundle: nil).instantiate(withOwner: nil, options: nil)[0] as!  RightButtonItemView
    }

    override func awakeFromNib() {
        rightButtonButton.rx.tap
            .bind(to: performEventSegue)
            .disposed(by: bag)
    }
}
Run Code Online (Sandbox Code Playgroud)

- 更新 -

我想到了这个解决方案,我认为它更好。您根本不需要主题:

class RightButtonItemView: UIView {

    @IBOutlet weak var rightButtonButton: UIButton!

    var performEventSegue: Observable<Void> {
        return rightButtonButton.rx.tap.asObservable()
    }
}
Run Code Online (Sandbox Code Playgroud)