RxCocoa 调用中的额外参数
RxCocoa extra argument in call
我正在尝试将数据附加到 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' 行 .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)
我用过(taxis)的地方,是taxi项目的array。见下图:
此外,一旦我调用了 .asObservable(),我就会得到以下信息:
我通过删除行 .bindTo
设法将这些打印出来。如果我把那行加回去,我会得到和以前一样的错误。
重要提示:我使用了我之前链接的文章中的代码库。如果我从 ChoiceCell 中删除,我可以复制相同的错误:
// var choiceModel: ChoiceModel? {
// didSet {
// layoutCell()
// }
// }
根据经验,当您尝试使用错误的预期数据类型绑定变量时,调用消息中的额外参数最常出现。第一个问题是您试图将 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)
感谢 Philip Laine 上面的回答:
这帮助我认识到我在观察方面犯了错误。它帮助我看到了我在代码中遇到的问题。
如果你只想绑定到一个普通的 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 { [=11=] != nil }
.map { [=11=]!.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 绑定到数组的问题的其他人有所帮助。
好吧,这是一个迟到的答案,但这是您的问题。如果这可以帮助其他人理解它。
- 您有一个包含
Taxi
个元素的数组
- 调用
rx_itemsWithCellIdentifier()
时,element
是一个Taxi
(当然是数组的一个元素)
但是在你的代码中你这样做:
cell.choiceModel = element
// Where
var choiceModel: ChoiceModel? {
didSet {
layoutCell()
}
}
因此,您正在尝试将 Taxi
分配给 ChoiceModel
。这就是您收到此错误的原因。 Swift 类型推断确定类型不匹配。您可以尝试注释块内的行,错误应该会消失。
我正在尝试将数据附加到 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' 行 .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)
我用过(taxis)的地方,是taxi项目的array。见下图:
此外,一旦我调用了 .asObservable(),我就会得到以下信息:
我通过删除行 .bindTo
设法将这些打印出来。如果我把那行加回去,我会得到和以前一样的错误。
重要提示:我使用了我之前链接的文章中的代码库。如果我从 ChoiceCell 中删除,我可以复制相同的错误:
// var choiceModel: ChoiceModel? {
// didSet {
// layoutCell()
// }
// }
根据经验,当您尝试使用错误的预期数据类型绑定变量时,调用消息中的额外参数最常出现。第一个问题是您试图将 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)
感谢 Philip Laine 上面的回答:
这帮助我认识到我在观察方面犯了错误。它帮助我看到了我在代码中遇到的问题。
如果你只想绑定到一个普通的 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 { [=11=] != nil }
.map { [=11=]!.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 绑定到数组的问题的其他人有所帮助。
好吧,这是一个迟到的答案,但这是您的问题。如果这可以帮助其他人理解它。
- 您有一个包含
Taxi
个元素的数组 - 调用
rx_itemsWithCellIdentifier()
时,element
是一个Taxi
(当然是数组的一个元素)
但是在你的代码中你这样做:
cell.choiceModel = element
// Where
var choiceModel: ChoiceModel? {
didSet {
layoutCell()
}
}
因此,您正在尝试将 Taxi
分配给 ChoiceModel
。这就是您收到此错误的原因。 Swift 类型推断确定类型不匹配。您可以尝试注释块内的行,错误应该会消失。