【问题标题】:Cannot receive event with custom DelegateProxy and Protocol无法使用自定义 DelegateProxy 和协议接收事件
【发布时间】:2017-06-06 14:08:51
【问题描述】:

我尝试将 DifficultyViewDelegate 的委托迁移到 observable。这是我的 DifficultyViewDelegate :

@objc protocol DifficultyViewDelegate: class {
  func levelDidIncrease()
  func levelDidDecrease()
}

还有我的难度视图:

  weak var delegate: DifficultyViewDelegate?

  @IBAction func decreaseLevel(_ sender: Any) {
    delegate?.levelDidDecrease()
  }

  @IBAction func increaseLevel(_ sender: Any) {
    delegate?.levelDidIncrease()
  }

这是我的 RxDifficultyViewDelegateProxy

class RxDifficultyViewDelegateProxy: DelegateProxy, DelegateProxyType {
  static func currentDelegateFor(_ object: AnyObject) -> AnyObject? {
    let difficultyView: DifficultyView = object as! DifficultyView
    return difficultyView.delegate
  }

  static func setCurrentDelegate(_ delegate: AnyObject?, toObject object: AnyObject) {
    let difficultyView: DifficultyView = object as! DifficultyView
    difficultyView.delegate = delegate as? DifficultyViewDelegate
  }
}

我还在 DifficultyView 上添加了一个扩展:

extension DifficultyView {
  public var rx_delegate: RxDifficultyViewDelegateProxy {
    return  RxDifficultyViewDelegateProxy.proxyForObject(RxDifficultyViewDelegateProxy.self)
  }

  public var rx_levelDidIncrease: Observable<Void> {
    return rx_delegate.methodInvoked(#selector(DifficultyViewDelegate.levelDidIncrease)).map { _ in return }
  }
}

但似乎当我这样做时:

difficultyView.rx_levelDidIncrease.asObservable().subscribe(onNext: {
  print("did increase")
}).addDisposableTo(disposeBag)

它从来没有被调用过。有人有什么指点吗?

【问题讨论】:

    标签: ios swift swift3 rx-swift


    【解决方案1】:

    尝试使用PublishSubject:

    难度查看:

    class DifficultyView: UIView {
        var levelDidIncrease = PublishSubject<Void>()
        var levelDidDecrease = PublishSubject<Void>()
    
        @IBAction func decreaseLevel(_ sender: Any) {
            levelDidDecrease.onNext()
        }
    
        @IBAction func increaseLevel(_ sender: Any) {
            levelDidIncrease.onNext()
       }
    }
    

    然后:

    var difficultyView = DifficultyView()
    
    difficultyView.levelDidDecrease.asObservable()
        .subscribe(onNext: {
            print("did decrease")
        })
        .addDisposableTo(disposeBag)
    
    
    difficultyView.decreaseLevel(theSender) // <- THIS line performs the side effect
    

    【讨论】:

    • decreaseLevel(:) 函数会在关联的 IBOutlet 被点击时被调用。
    • 酷,谢谢你的指点。但是为什么要创建 DifficultyViewType 而不仅仅是使用 PublishSubject 属性呢?
    • 如果您不想在其他子视图中采用该行为,则无需创建 DifficultyViewType
    • 我已经更新了删除DifficultyViewType 协议的答案。
    • 我喜欢这个主意,谢谢。在您正在进行的项目中,它是您替代委托和协议样板代码的吗?
    猜你喜欢
    • 1970-01-01
    • 2018-05-25
    • 1970-01-01
    • 1970-01-01
    • 2015-01-10
    • 2014-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多