123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- 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()
-
- 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()
- }
- }
- @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.endAllRefreshing()
- }
- }
- 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)
- }
- }
|