RxSwiftを使ったデリゲート実装方法
RxSwiftを勉強中です。
概念から、実際の実装まで、まだまだわからないことだらけです。
わかったことから少しづつ記事にしようと思います。
間違いがありましたら、ツッコミお願いしますm(_ _)m
今回はRxSwiftでViewをタップしたらViewControllerでイベントを検知する方法を見ていきたいと思います。
UIViewの実装
//SampleView.swift
class SampleView: UIView {
//weak var delegate: SumpleViewDelegate?
// ここでは`PublishSubject`を使ってイベントを送信する
let rx_message = PublishSubject<String>()
private func didSelect() {
rx_message.on(.Next("message"))
}
override func awakeFromNib() {
self.userInteractionEnabled = true
}
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
self.didSelect()
print("touchesBegan")
}
}
PublishSubject
クラスのインスタンスrx_message
をプロパティとして保持します。
didSelect()
メソッドでrx_message.on
メソッドで文字列を渡します。
touchesBegan(_:withEvent)
メソッドでdidSelect()
実行します。
ViewControllerの実装
//ViewController.swift
import UIKit
import RxSwift
import RxCocoa
class ViewController: UIViewController {
@IBOutlet weak var sampleView: SampleView!
let disposeBag = DisposeBag()
sampleView.rx_message
.subscribeNext { [ weak sampleView] message in
print("Did select : \(message): \(sampleView!)")
}
.addDisposableTo(disposeBag)
@IBOutlet weak var sampleView: SampleView!
で
SampleViewクラス
のインスタンスsampleView
を保持します。
let disposeBag = DisposeBag()
でストリーム終わった場合に解除するdisposeBag
インスタンスを作ります
sampleView.rx_message
.subscribeNext { [ weak sampleView] message in
print("Did select : \(message): \(sampleView!)")
}
.addDisposableTo(disposeBag)
でsampleViewのrx_messageメソッドを購読して、イベントがあったら、sampleView、messageインスタンスをコンソールに表示するようにします。
結果
アプリを実行して、sampleViewをタップするとコンソールに以下のような文字列が出力されます
Did select : message: <SampleWebView.SampleView: 0x7fbed952dea0; frame = (107 268; 200 200); autoresize = RM+BM; layer = <CALayer: 0x7fbed95147c0>>
touchesBegan