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 的单个实例绑定到期望一系列可观察对象的 tableview。

/**
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

问题似乎不是由可选对象引起的,但我不明白为什么要将可选对象绑定到 tableview,所以我建议你也避免这种情况。这是一个可行的示例。

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 taxi: Taxi? {
    didSet {
        layoutCell()
    }

}

我希望这可以帮助其他在将 tableViewCell 绑定到数组时遇到问题的人。

于 2016-04-11T08:23:03.870 回答
0

好吧,这是一个迟到的答案,但这是你的问题。如果这可以帮助其他人理解它。

  • 你有一个Taxi元素数组
  • rx_itemsWithCellIdentifier()被调用时,element是一个Taxi(当然是数组的一个元素)

但是在您的代码中,您可以:

cell.choiceModel = element
// Where
var choiceModel: ChoiceModel? {
    didSet {
        layoutCell()
    }
}

因此,您正在尝试将 a 分配Taxi给 a ChoiceModel。这就是您收到此错误的原因。Swift 类型推断确定类型不匹配。您可以尝试注释块内的行,错误应该会消失。

于 2016-12-16T19:24:48.120 回答