7

UITableView を作成してセルをレンダリングするデモのを学びました。

私の意見でitemsは、viewModel です。Alamofire または他のライブラリを使用して、ネットワーク経由でデータを要求したいと考えています。応答を受け取ったら、関連するセルのテキストを更新するにはどうすればよいですか?

つまり、viewModel を Cells にバインドしたいのです。モデルのデータが変更されると、セルの内容が自動的に変更される可能性があります。

私は次のような考えを持っています: セルのコンテンツの Observable シーケンスを作成します (セルにバインドします)。サーバーがデータを応答するとき、 function を呼び出しますtableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Top)。しかし、これは恵みや良い方法ではないようです。

だから、誰かが私を助けてくれることを願っています:)

let items = Observable.just([
            "First Item",
            "Second Item",
            "Third Item"
        ])

    items
        .bindTo(tableView.rx_itemsWithCellIdentifier("Cell", cellType: UITableViewCell.self)) { (row, element, cell) in
            cell.textLabel?.text = "\(element) @ row \(row)"
            /* to do some binding or something else ? */
        }
        .addDisposableTo(disposeBag)


    tableView
        .rx_modelSelected(String)
        .subscribeNext { value in
            DefaultWireframe.presentAlert("Tapped `\(value)`")
        }
        .addDisposableTo(disposeBag)
4

3 に答える 3

5

あなたのclient(Alomofire、...)は次のようなものになります:

func searchSomething() -> Observable<[YourModel]>

には、次のプロパティviewModelがあります。items

private(set) lazy var items : Observable<[YourModel]> = 
    self.client.searchSomething()
        .observeOn(MainScheduler.instance)
        .shareReplay(1)

そして、でviewController

tableView.dataSource = nil

// Bind the items to the table view data source
viewModel.items
    .bindTo(tableView.rx.items) { tableView, index, item in
        let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "Cell")
        cell.textLabel?.text = item.title  // if item.title is a String

            return cell
    }
    .addDisposableTo(disposeBag)
于 2017-01-15T20:25:24.203 に答える
0

変数に変更して値を変更する

let items =  Variable([
        "First Item",
        "Second Item",
        "Third Item"
    ])

items
    .bindTo(tableView.rx_itemsWithCellIdentifier("Cell", cellType: UITableViewCell.self)) { (row, element, cell) in
        cell.textLabel?.text = "\(element) @ row \(row)"
        /* to do some binding or something else ? */
    }
    .addDisposableTo(disposeBag)


tableView
    .rx_modelSelected(String)
    .subscribeNext { value in
        DefaultWireframe.presentAlert("Tapped `\(value)`")
        items.value = ["item 1", "item 2"] //your updated array
    }
    .addDisposableTo(disposeBag)
于 2016-01-27T15:06:07.757 に答える