説明なし

MessageListViewController.swift 5.7KB

    // // MessageListViewController.swift // Paiai_iOS // // Created by FFIB on 16/5/13. // Copyright © 2016年 FFIB. All rights reserved. // import UIKit import RxSwift import RxCocoa import RxDataSources import PaiaiDataKit import PaiaiUIKit import PullToRefresh protocol MessageViewControllerDelegate: class { func didSelect(item: MessageItem) } final class MessageListViewController: UIViewController { @IBOutlet weak var tableView: UITableView! var emptyView: UILabel = { let empty = UILabel(frame: CGRect(x: kScreenWidth / 2 - 50, y: 5, width: 50, height: 50)) empty.isHidden = true empty.text = "当前没有任何消息" empty.textColor = UIColor.gray empty.font = UIFont.systemFont(ofSize: 14) empty.sizeToFit() return empty }() var viewModel: MessageListViewModel! var type: MessageType! fileprivate let disposeBag = DisposeBag() // MARK: view function override func viewDidLoad() { super.viewDidLoad() view.addSubview(emptyView) setup() binding() setupNavigationBar() self.viewModel.reload() } private func setupNavigationBar() { navigationItem.title = type.model.title let rightItem = UIBarButtonItem(image: UIImage.Navigation.right, target: self, action: #selector(clearMessage)) navigationItem.setRightItem(rightItem) } private func setup() { setupReloadControl() setupLoadingControl() } private func setupReloadControl() { tableView.addPullToRefresh(PullToRefresh()) { [weak self] in guard let `self` = self else { return } self.viewModel.reload() } tableView.startRefreshing(at: .top) } private func setupLoadingControl() { tableView.addPullToRefresh(PullToRefresh(position: .bottom)) { [weak self] in guard let `self` = self else { return } self.viewModel.preload() } } // MARK: button function @objc func clearMessage() { let alert = ActionSheetController() alert.addAlertAction(AlertAction(title: "取消", style: .cancel)) alert.addAlertAction(AlertAction(title: "清空消息", handler: { _ in self.viewModel.removeAll() })) presentController(alert) } deinit { tableView.removeAllPullToRefresh() } } fileprivate extension MessageListViewController { func observeMessage() { viewModel.showMessage .asDriver { _ in fatalError("Unexpected error from error messages observable.") } .drive(onNext: { message in Toast.show(message: message) }) .disposed(by: disposeBag) } } fileprivate extension MessageListViewController { var dataSource: RxTableViewSectionedAnimatedDataSource<AnimatableSectionModel<Int, MessageListItem>> { return RxTableViewSectionedAnimatedDataSource<AnimatableSectionModel<Int, MessageListItem>>( configureCell: { (_, tableView, indexPath, item) in switch self.type! { case .system: let cell = tableView.dequeueReusableCell(withIdentifier: "messageSystemCell", for: indexPath) as! MessageSystemCell cell.setInfo(item) return cell case .comment, .thumbup: let cell = tableView.dequeueReusableCell(withIdentifier: "messageCommentAndThumbupCell", for: indexPath) as! MessageCommentAndThumbupCell cell.setInfo(item) return cell } }, canEditRowAtIndexPath: { _, _ in true }) } func binding() { observeMessage() bindViewModelToTableView() bindTableViewToViewModel() bindViewModelToRefreshing() } func bindViewModelToTableView() { viewModel.isEmpty .bind(to: emptyView.rx.isHidden) .disposed(by: disposeBag) viewModel.contents .bind(to: tableView.rx.items(dataSource: dataSource)) .disposed(by: disposeBag) } func bindTableViewToViewModel() { tableView.rx.itemDeleted .asDriver() .drive(onNext: { [unowned self] in self.viewModel.remove(of: $0.row) }) .disposed(by: disposeBag) tableView.rx.modelSelected(MessageListItem.self) .asDriver() .drive(onNext: { [unowned self] in self.viewModel.didSelect(item: $0) }) .disposed(by: disposeBag) tableView.rx.willDisplayCell .asDriver() .drive(onNext: { [unowned self] in self.preload(indexPath: $0.indexPath) }) .disposed(by: disposeBag) } func preload(indexPath: IndexPath) { guard indexPath.row == tableView.numberOfRows(inSection: 0) - 5 else { return } tableView.startRefreshing(at: .bottom) } func bindViewModelToRefreshing() { viewModel.isLoading .asDriver(onErrorJustReturn: true) .drive(onNext: {[weak self] flag in guard let `self` = self else { return } if flag { self.tableView.endRefreshing(at: .top) } else { self.tableView.endRefreshing(at: .bottom) } }).disposed(by: disposeBag) } } extension MessageListViewController: NavigationBackViewController {} extension MessageListViewController: Storyboarded { static func instantiate() -> MessageListViewController { return UIStoryboard.message.instantiateViewController(type: MessageListViewController.self) } }