2017-01-21 8 views
0

私はDifficultyViewDelegateの代理人を監視可能に移行しようとしています。カスタムDelegateProxyとプロトコルでイベントを受け取ることができません

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

そして、私のDifficultyView:これは私のDifficultyViewDelegateある

weak var delegate: DifficultyViewDelegate? 

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

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

そして、これは私がまた私のDifficultyViewに拡張子を追加しました私の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 
    } 
} 

です:

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

てみ使用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

IBOutletの関連がクリックされたとき 'decreaseLevelは(:)'関数が呼び出されます。 – XFreire

+0

クール、ポインタのおかげで。しかし、なぜDifficultyViewTypeを作成し、単にPublishSubjectプロパティを使用するのではないのですか? –

+0

他のサブビューでその動作を採用したくない場合は、 'DifficultyViewType'を作成する必要はありません。 – XFreire

関連する問題