【问题标题】:RxSwift - rx.tap not workingRxSwift - rx.tap 不工作
【发布时间】:2017-08-09 09:34:27
【问题描述】:

我有视图控制器。在里面我有视图

lazy var statusView: StatusView = {
       var statusView = StatusView()
        return statusView
}()

在 statusView 里面我有按钮

lazy var backButton: UIButton = {
        var button = UIButton(type: .system)
        button.titleLabel?.font = UIFont().regularFontOfSize(size: 20)
        return button
  }()

在控制器中我有

override func viewDidLoad() {
        super.viewDidLoad()
        setupRx()
}

func setupRx() {            
        _ = statusView.backButton.rx.tap.subscribe { [weak self] in
            guard let strongSelf = self else { return }
            print("hello")
        }
    }

但是当我点击按钮时,控制台没有打印任何内容。

我做错了什么?

【问题讨论】:

    标签: swift rx-swift rx-cocoa


    【解决方案1】:

    一般没有错,但有一个小窍门。

    你使用 backButton.rx.tap.subscribe { [weak self] in

    但是你需要使用 backButton.rx.tap.subscribe { [weak self] _ in ...

    您注意到第二个版本中的下划线了吗?第二个版本调用方法

    public func subscribe(_ on: @escaping (Event<E>) -> Void)
    

    ObservableType。在这种情况下,提供了on 闭包来传递事件,但我们只是使用下划线忽略此闭包的传入参数

    【讨论】:

    • 这对我有用!超级想知道为什么不带参数调用它会通过编译?
    【解决方案2】:

    setupRx 返回后,订阅似乎已超出范围。如果在视图控制器中添加DisposeBag 并将订阅添加到 dispose 包中,是否可以解决问题?像这样的:

    func setupRx() {            
        statusView.backButton.rx.tap
            .subscribe { [weak self] in
                guard let strongSelf = self else { return }
                    print("hello")
                }
            }
            .addDisposableTo(self.disposeBag)
    }
    

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2019-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-20
      • 2015-12-21
      • 2019-04-27
      • 1970-01-01
      相关资源
      最近更新 更多