Skip to content

Instantly share code, notes, and snippets.

@KentarouKanno
Last active April 28, 2019 00:52
Show Gist options
  • Save KentarouKanno/994138c2df384515b22a9d6db1be0498 to your computer and use it in GitHub Desktop.
Save KentarouKanno/994138c2df384515b22a9d6db1be0498 to your computer and use it in GitHub Desktop.

参考URL: RxSwiftのUITableViewとのバインディングまとめ

  • Observable
import UIKit
import RxSwift
import RxCocoa

final class ViewController: UIViewController {
    
    let itemObservable: Observable<[String]> = Observable.from(optional: ["A", "B", "C", "D", "E"])
    
    private let disposeBag = DisposeBag()

    @IBOutlet weak private var tableView: UITableView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        bindViews()
    }
    
    private func bindViews() {
        
        itemObservable
            .bind(to: tableView.rx.items(cellIdentifier: "CustomCell", cellType: CustomCell.self)) { row, element, cell in
                cell.configure(text: element)
                cell.bind()
                cell.tapSignal
                    .emit(onNext: { _ in
                        print("cell.button.tap!!\(element)")
                    })
                    .disposed(by: cell.disposeBag)
            }
            .disposed(by: disposeBag)
        
        /* Cell Tap */
        tableView.rx.itemSelected
            .withLatestFrom(itemObservable) { indexPath, items in
                return (items[indexPath.row], indexPath)
            }
            .subscribe(onNext: { (item, indexPath) in
                print("indexPath = \(indexPath), item = \(item)")
            })
            .disposed(by: disposeBag)
    }
}



class CustomCell: UITableViewCell {
    
    @IBOutlet weak private var titleLabel: UILabel!
    @IBOutlet weak fileprivate var button: UIButton!
    fileprivate var titleText: String = ""
    var disposeBag = DisposeBag()
    
    var tapSignal: Signal<Void> {
        return button.rx.tap.asSignal()
    }
    
    func configure(text: String) {
        titleText = text
        self.titleLabel.text = text
    }
    
    func bind() {
        button.rx.tap
            .asSignal()
            .emit(onNext: { _ in
                print("Tap!!\(self.titleLabel.text!)")
            })
            .disposed(by: disposeBag)
    }
    
    override func prepareForReuse() {
        super.prepareForReuse()
        self.disposeBag = DisposeBag()
    }
}
  • Driver①
import UIKit
import RxSwift
import RxCocoa

final class ViewController: UIViewController {
    
    let itemDriver: Driver<[String]> = Driver.just(["A", "B", "C", "D", "E"])
    
    private let disposeBag = DisposeBag()

    @IBOutlet weak private var tableView: UITableView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        bindViews()
    }
    
    private func bindViews() {
        
        itemDriver
            .asDriver()
            .drive(tableView.rx.items (cellIdentifier: "CustomCell")) { row, element, cell in
                if let cell = cell as? CustomCell {
                    cell.configure(text: element)
                    cell.bind()
                    cell.tapSignal
                        .emit(onNext: { _ in
                            print("cell.button.tap!!\(element)")
                        })
                        .disposed(by: cell.disposeBag)
                }
            }
            .disposed(by: disposeBag)
        
        /* Cell Tap */
        tableView.rx.itemSelected
            .withLatestFrom(itemDriver) { indexPath, items in
                return (items[indexPath.row], indexPath)
            }
            .subscribe(onNext: { (item, indexPath) in
                print("indexPath = \(indexPath), item = \(item)")
            })
            .disposed(by: disposeBag)
    }
}



class CustomCell: UITableViewCell {
    
    @IBOutlet weak private var titleLabel: UILabel!
    @IBOutlet weak fileprivate var button: UIButton!
    fileprivate var titleText: String = ""
    var disposeBag = DisposeBag()
    
    var tapSignal: Signal<Void> {
        return button.rx.tap.asSignal()
    }
    
    func configure(text: String) {
        titleText = text
        self.titleLabel.text = text
    }
    
    func bind() {
        button.rx.tap
            .asSignal()
            .emit(onNext: { _ in
                print("Tap!!\(self.titleLabel.text!)")
            })
            .disposed(by: disposeBag)
    }
    
    override func prepareForReuse() {
        super.prepareForReuse()
        self.disposeBag = DisposeBag()
    }
}
  • Driver②
import UIKit
import RxSwift
import RxCocoa

final class ViewController: UIViewController {
    
    let itemDriver: Driver<[String]> = Driver.just(["A", "B", "C", "D", "E"])
    
    private let disposeBag = DisposeBag()

    @IBOutlet weak private var tableView: UITableView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        bindViews()
    }
    
    private func bindViews() {
        
        itemDriver
            .asDriver()
            .drive(tableView.rx.items(cellIdentifier: "CustomCell", cellType: CustomCell.self)) { row, element, cell in
                cell.configure(text: element)
                cell.bind()
                cell.tapSignal
                    .emit(onNext: { _ in
                        print("cell.button.tap!!\(element)")
                    })
                    .disposed(by: cell.disposeBag)
            }
            .disposed(by: disposeBag)
        
        /* Cell Tap */
        tableView.rx.itemSelected
            .withLatestFrom(itemDriver) { indexPath, items in
                return (items[indexPath.row], indexPath)
            }
            .subscribe(onNext: { (item, indexPath) in
                print("indexPath = \(indexPath), item = \(item)")
            })
            .disposed(by: disposeBag)
    }
}



class CustomCell: UITableViewCell {
    
    @IBOutlet weak private var titleLabel: UILabel!
    @IBOutlet weak fileprivate var button: UIButton!
    fileprivate var titleText: String = ""
    var disposeBag = DisposeBag()
    
    var tapSignal: Signal<Void> {
        return button.rx.tap.asSignal()
    }
    
    func configure(text: String) {
        titleText = text
        self.titleLabel.text = text
    }
    
    func bind() {
        button.rx.tap
            .asSignal()
            .emit(onNext: { _ in
                print("Tap!!\(self.titleLabel.text!)")
            })
            .disposed(by: disposeBag)
    }
    
    override func prepareForReuse() {
        super.prepareForReuse()
        self.disposeBag = DisposeBag()
    }
}
  • Driver③
import UIKit
import RxSwift
import RxCocoa

final class ViewController: UIViewController {
    
    let itemDriver: Driver<[String]> = Driver.just(["A", "B", "C", "D", "E"])
    
    private let disposeBag = DisposeBag()

    @IBOutlet weak private var tableView: UITableView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        bindViews()
    }
    
    private func bindViews() {
        
        itemDriver
            .asDriver()
            .drive(tableView.rx.items) { tableView, row, element in
                
                if let cell = tableView.dequeueReusableCell(withIdentifier: "CustomCell") as? CustomCell {
                    cell.configure(text: element)
                    cell.bind()
                    cell.tapSignal
                        .emit(onNext: { _ in
                            print("cell.button.tap!!\(element)")
                        })
                        .disposed(by: cell.disposeBag)
                    return cell
                }
                return UITableViewCell()
            }
            .disposed(by: disposeBag)
        
        /* Cell Tap */
        tableView.rx.itemSelected
            .withLatestFrom(itemDriver) { indexPath, items in
                return (items[indexPath.row], indexPath)
            }
            .subscribe(onNext: { (item, indexPath) in
                print("indexPath = \(indexPath), item = \(item)")
            })
            .disposed(by: disposeBag)
    }
}



class CustomCell: UITableViewCell {
    
    @IBOutlet weak private var titleLabel: UILabel!
    @IBOutlet weak fileprivate var button: UIButton!
    fileprivate var titleText: String = ""
    var disposeBag = DisposeBag()
    
    var tapSignal: Signal<Void> {
        return button.rx.tap.asSignal()
    }
    
    func configure(text: String) {
        titleText = text
        self.titleLabel.text = text
    }
    
    func bind() {
        button.rx.tap
            .asSignal()
            .emit(onNext: { _ in
                print("Tap!!\(self.titleLabel.text!)")
            })
            .disposed(by: disposeBag)
    }
    
    override func prepareForReuse() {
        super.prepareForReuse()
        self.disposeBag = DisposeBag()
    }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment