2017-01-21 1 views
0

Я пытаюсь перенести делегат из DifficultyViewDelegate на наблюдаемый. Это мой DifficultyViewDelegate:Не удается получить событие с помощью пользовательского делегата Proxy и протокола

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

И мой DifficultyView:

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) 

Это никогда не называется. У кого-то есть указатели?

ответ

1

Try использование PublishSubject:

DifficultyView:

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 
+0

'decreaseLevel (:)' функция будет вызываться, когда IBOutlet Ассоциированные нажата. – XFreire

+0

Прохладный, спасибо вам за указатели. Но зачем создавать DifficultyViewType, а не просто использовать свойства PublishSubject? –

+0

Вам не нужно создавать 'DifficultyViewType', если вы не хотите принимать это поведение в других подзонах – XFreire

Смежные вопросы