RxSwift и как сделать простой TableViewController?

Как я могу создать TableViewController в стиле RxSwift?

Я пытаюсь создать простой TableViewController, который использует RxSwift и не имеет разделов.

Я посмотрел и поиграл с https://github.com/ReactiveX/RxSwift/blob/master/RxExample/RxExample/Examples/TableView/TableViewController.swift.

Я сократил код только до одного раздела и использовал только пользователей. Однако, похоже, я застрял с SectionModel.

//
//  TableViewController.swift
//  RxExample
//
//  Created by carlos on 26/5/15.
//  Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
//
// modified by Mike Finney for a StackOverflow question

import UIKit
#if !RX_NO_MODULE
import RxSwift
import RxCocoa
#endif

class TableViewController: ViewController, UITableViewDelegate {


    @IBOutlet weak var tableView: UITableView!

    var disposeBag = DisposeBag()

    let users = Variable([User]())

    let dataSource = RxTableViewSectionedReloadDataSource<SectionModel<String, User>>()

    typealias Section = SectionModel<String, User>

    override func viewDidLoad() {
        super.viewDidLoad()

        self.navigationItem.rightBarButtonItem = self.editButtonItem()

        users
            .map { [ SectionModel(model: "ok", items: $0) ] }
            .bindTo(tableView.rx_itemsWithDataSource(dataSource))
            .addDisposableTo(disposeBag)

        dataSource.cellFactory = { (tv, ip, user: User) in
            let cell = tv.dequeueReusableCellWithIdentifier("Cell")!
            cell.textLabel?.text = user.firstName + " " + user.lastName
            return cell
        }

        // customization using delegate
        // RxTableViewDelegateBridge will forward correct messages
        tableView.rx_setDelegate(self)
            .addDisposableTo(disposeBag)

        tableView.rx_itemSelected
            .subscribeNext { [unowned self] indexPath in
                self.showDetailsForUserAtIndexPath(indexPath)
            }
            .addDisposableTo(disposeBag)

        tableView.rx_itemDeleted
            .subscribeNext { [unowned self] indexPath in
                self.removeUser(indexPath)
            }
            .addDisposableTo(disposeBag)

        RandomUserAPI.sharedAPI.getExampleUserResultSet()
            .subscribeNext { [unowned self] array in
                self.users.value = array
            }
            .addDisposableTo(disposeBag)

    }

    override func setEditing(editing: Bool, animated: Bool) {
        super.setEditing(editing, animated: animated)
        tableView.editing = editing
    }

    // MARK: Table view delegate ;)

    func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        return 0
    }

    // MARK: Navigation

    private func showDetailsForUserAtIndexPath(indexPath: NSIndexPath) {
        let sb = UIStoryboard(name: "Main", bundle: NSBundle(identifier: "RxExample-iOS"))
        let vc = sb.instantiateViewControllerWithIdentifier("DetailViewController") as! DetailViewController
        vc.user = getUser(indexPath)
        self.navigationController?.pushViewController(vc, animated: true)
    }

    // MARK: Work over Variable

    func getUser(indexPath: NSIndexPath) -> User {
        var array: [User]
        switch indexPath.section {
        case 0:
            array = users.value
        default:
            fatalError("Section out of range")
        }
        return array[indexPath.row]
    }

    func moveUserFrom(from: NSIndexPath, to: NSIndexPath) {
        var user: User
        var fromArray: [User]
        var toArray: [User]

        fromArray = users.value
        user = fromArray.removeAtIndex(from.row)
        users.value = fromArray

        toArray = users.value
        toArray.insert(user, atIndex: to.row)
        users.value = toArray
    }

    func addUser(user: User) {
        var array = users.value
        array.append(user)
        users.value = array
    }

    func removeUser(indexPath: NSIndexPath) {
        var array: [User]
        switch indexPath.section {
        case 0:
            array = users.value
            array.removeAtIndex(indexPath.row)
            users.value = array
        default:
            fatalError("Section out of range")
        }
    }

}

Я даже не хочу использовать SectionModel, если могу помочь.

Поэтому, возможно, еще один способ спросить: «Что такое версия RxTableViewSectionedReloadDataSource без разделов?»


person finneycanhelp    schedule 05.12.2015    source источник
comment
Ответ может быть связан с использованием RxTableViewReactiveArrayDataSource. Подтвердит.   -  person finneycanhelp    schedule 06.12.2015
comment
Прочтите их более внимательно: github.com/ReactiveX/RxSwift/blob /master/Documentation/ и github.com/ReactiveX/RxSwift/tree/ мастер/RxDataSourceStarterKit   -  person finneycanhelp    schedule 06.12.2015
comment
Я скопировал RxTableViewReactiveArrayDataSource.swift и RxTableViewDataSourceType.swift. Есть две проблемы компиляции: 1) rxAbstractMethod() и 2) bindingErrorToInterface (ошибка). RxCocoa.swift объявляет/определяет их. Что я упускаю или что нужно сделать?   -  person finneycanhelp    schedule 06.12.2015
comment
Вопрос имеет неработающую ссылку сейчас. Я полагаю, что новое расположение расширенной версии находится в RxDataSources github.com/RxSwiftCommunity/RxDataSources.   -  person finneycanhelp    schedule 29.02.2016


Ответы (1)


Примерно 6 декабря 2015 года в RxSwift/RxExample был добавлен новый пример. Контроллер представления, на который следует обратить внимание, — SimpleTableViewExampleViewController.swift в коде RxSwift.

Если вы запускаете примеры, выберите тот, который называется «Самый простой пример табличного представления» введите здесь описание изображения

person finneycanhelp    schedule 08.12.2015