2016-04-10 2 views
2

Я пытаюсь подключить данные к UITableView. У меня есть скачать форму проекта здесь, и я с помощью кода, где данные прикрепленную к Tableview: http://yannickloriot.com/2016/01/make-uitableview-reactive-with-rxswift/:RxCocoa дополнительный аргумент при вызове

Во-первых, я создал следующую переменную:

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) 

Но я получаю следующее предупреждение: «Дополнительный аргумент в вызове» на линии .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) 

Где я использовал (такси), это массив элементов такси. Смотрите рисунок ниже:

enter image description here

Кроме того, как только я назвал .asObservable(), я следующее:

enter image description here

мне удалось напечатать это путем удаления линии .bindTo. Если я добавлю эту строку назад, я получаю ту же ошибку, что и раньше.

ВАЖНО: Я играл с базой кода из статьи I, связанной с ранее. Если удалить из ChoiceCell я могу повторить ту же ошибку:

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

ответ

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 к.

Так что если у вас есть массив [Таксис], так что внутри tableViewCell мне нужна переменная, которая хранит Такси. Затем я смог скомпилировать свой проект.

Так в ChoiceCell у меня есть вар, как так:

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

}

Я надеюсь, что это помогает кому-либо еще возникают проблемы связывания с tableViewCell в массив.

+0

Хорошо, пожалуйста, пометьте ответ как правильный, если это возможно –

+0

Я правильно пометил свой ответ, поскольку это было исправление отображаемой ошибки. Ваш ответ был большой помощью в том, чтобы попасть в такое положение, где я мог бы найти покупку, поэтому я проголосовал за нее. Надеюсь, это имеет смысл и еще раз спасибо :-). – pls

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 

Это не похоже, как проблема вызвана дополнительным объектом, но я не понимаю, почему вы хотите, чтобы связать дополнительные объекты к Tableview, так что я бы посоветовал вам, чтобы избежать этого тоже. Вот пример, который будет работать.

let currentQuestion = Variable<[Taxi]>([Taxi()]) 
currentQuestion.asObservable().bindTo(tableView.rx_itemsWithCellIdentifier("ChoiceCell")) {(row, element, cell) in 
    cell.choiceModel = element 
}.addDisposableTo(disposeBag) 
+0

Спасибо за ответ и совет. Я понял, что в другом коде это массив, который имеет больше смысла :-). Я обновил свой код до вашего предложения, но у меня все еще такая же проблема. Я отредактировал мой вопрос, чтобы дать более подробную информацию. – pls

0

Ну, это поздний ответ, но вот ваша проблема. Если это поможет другим понять это.

  • У вас есть массив Taxi элементов
  • когда rx_itemsWithCellIdentifier() называется, element является Taxi (конечно, это элемент массива)

Но в вашем коде вы делаете:

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

Итак, вы пытаетесь присвоить Taxi к ChoiceModel. Вот почему вы получаете эту ошибку. Вывод типа Swift определяет несоответствие типов. Вы можете попытаться прокомментировать строку внутри блока, и ошибка должна исчезнуть.

Смежные вопросы