RxSwift - rx.tap 不工作

Posted

技术标签:

【中文标题】RxSwift - rx.tap 不工作【英文标题】:RxSwift - rx.tap not working 【发布时间】: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")
        
    

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

我做错了什么?

【问题讨论】:

【参考方案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)

希望对您有所帮助。

【讨论】:

以上是关于RxSwift - rx.tap 不工作的主要内容,如果未能解决你的问题,请参考以下文章

如何在 RxSwift 中过滤带有按钮标题的按钮点击?

RxSwift:重复(完成)流

RxSwift 对 MJRefresh 使用的封装

RxSwift - 如何限制缓冲区的时间跨度

RxSwift 以及如何制作简单的 TableViewController?

如何将控制事件添加到 RxCocoa 中的自定义按钮?