2

UITableView にデータを添付しようとしています。ここでプロジェクト フォームをダウンロードし、データが tableView に添付されているコードを使用しています: http://yannickloriot.com/2016/01/make-uitableview-reactive-with-rxswift/ :

まず、次の変数を作成しました。

let currentQuestion: Variable<Taxi?>   = Variable(nil)

次に、次のことを試みます。

 currentQuestion
        .asObservable()
        .bindTo(tableView.rx_itemsWithCellIdentifier("ChoiceCell", cellType: ChoiceCell.self)) { (row, element, cell) in
            cell.choiceModel = element
        }
        .addDisposableTo(disposeBag)

しかし、次の警告が表示されます: 'Extra argument in call' on the line .bindTo. 新しいセルを追加しようとしましたが、同じ結果が得られました。関係あるかわかりませんが、セル登録しました。

引数の型が一致しない場合にこの警告が表示される可能性があることをここで読みました: Swift - Extra Argument in call。ただし、引数はうまく一致しているようです。

私は Rx を初めて使用するので、誰かがここで何がうまくいかないのかを理解するのを手伝ってくれることを願っていました. ありがとう。

======

編集

これが私の新しいコードです。rx_itemsWithCellIdentifier("ChoiceCell")私は一人で試しましたrx_itemsWithCellIdentifier("ChoiceCell", cellType: ChoiceCell.self)

let currentQuestion = Variable<[Taxi]>(taxis)

    currentQuestion.asObservable()
        .bindTo(tableView.rx_itemsWithCellIdentifier("ChoiceCell")) {(row, element, cell) in
        cell.choiceModel = element
        }.addDisposableTo(disposeBag)

私が利用した場所(タクシー)は、タクシーアイテムの配列です。下の図を参照してください。

ここに画像の説明を入力

また、.asObservable() を呼び出すと、次のようになります。

ここに画像の説明を入力

行を削除して、これらを印刷することができました.bindTo。その行を追加すると、以前と同じエラーが発生します。

重要: 以前にリンクした記事のコード ベースをいじってみました。ChoiceCell から削除すると、同じエラーを再現できます。

//  var choiceModel: ChoiceModel? {
//    didSet {
//          layoutCell()
//    }
//  }
4

3 に答える 3

4

経験上、呼び出しメッセージの余分な引数は、予想される間違ったデータ型で変数をバインドしようとしているときに最も頻繁に与えられます。最初の問題は、Taxi の単一のインスタンスを一連のオブザーバブルを期待しているテーブルビューにバインドしようとしていることです。

/**
Binds sequences of elements to table view rows.

- parameter cellIdentifier: Identifier used to dequeue cells.
- parameter source: Observable sequence of items.
- parameter configureCell: Transform between sequence elements and view cells.
- parameter cellType: Type of table view cell.
- returns: Disposable object that can be used to unbind.
*/
public func rx_itemsWithCellIdentifier<S : SequenceType, Cell : UITableViewCell, O : ObservableType where O.E == S>(cellIdentifier: String, cellType: Cell.Type = default) -> (source: O) -> (configureCell: (Int, S.Generator.Element, Cell) -> Void) -> Disposable

オプション オブジェクトが原因で問題が発生しているようには見えませんが、オプション オブジェクトをテーブルビューにバインドする理由がわかりません。そのため、それも避けることをお勧めします。これがうまくいく例です。

let currentQuestion = Variable<[Taxi]>([Taxi()])
currentQuestion.asObservable().bindTo(tableView.rx_itemsWithCellIdentifier("ChoiceCell")) {(row, element, cell) in
  cell.choiceModel = element
}.addDisposableTo(disposeBag)
于 2016-04-10T22:33:11.073 に答える
2

上記の Philip Laine の回答に感謝します: https://stackoverflow.com/a/36536320/2126233

それは、私が観察していたことに関して、私が間違いを犯していたことを理解するのに役立ちました. コードで発生していた問題を確認するのに役立ちました。

通常の tableViewCell にバインドするだけの場合は、次を使用する必要がありますtableView.rx_itemsWithCellFactory

currentQuestion.asObservable()
        .bindTo(tableView.rx_itemsWithCellFactory) {(tableView, row, item) in
            let cell = UITableViewCell()
            cell.textLabel?.text = item.distance

            return cell

        }.addDisposableTo(disposeBag)

カスタムセルを使用している場合は、tableView.rx_itemsWithCellIdentifier("ChoiceCell", cellType: ChoiceCell.self). 次に例を示します。

 currentQuestion
     .asObservable()
     .filter { $0 != nil }
     .map { $0!.choices }
  .bindTo(tableView.rx_itemsWithCellIdentifier("ChoiceCell", cellType: ChoiceCell.self)) { (row, element, cell) in
   cell.choiceModel = element
 }
 .addDisposableTo(disposeBag)

私にとっては、tableViewをバインドしていた配列から出てきた要素と一致するtableViewセル内にプロパティがない限り、この同じエラーが発生していました。

[Taxis] の配列がある場合は、tableViewCell 内に Taxis を格納する変数が必要です。その後、プロジェクトをコンパイルできました。

したがって、ChoiceCell には次のような var があります。

var taxi: Taxi? {
    didSet {
        layoutCell()
    }

}

これが、tableViewCell を配列にバインドする際に問題を抱えている他の人に役立つことを願っています。

于 2016-04-11T08:23:03.870 に答える