2016-01-13 4 views
0

У меня есть один tableview с двумя разделами: ингредиенты для покупки и ингредиенты, которые пользователь уже имеет. Таким образом, в основном, когда использование делает покупки, он передает один ингредиент из одного списка в другой.reloadData после moveRowAtIndexPath

Вот tableView:cellForRowAtIndexPath

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("IngredientCell", forIndexPath: indexPath) as! IngredientCell 
    cell.checkbox.checkboxDelegate = self 
    cell.checkbox.checkboxIndex = indexPath 
    ... 
} 

Я буду называть это один: (я включил stateOfCheckbox - каждый tableviewcell включает в себя пользовательскую кнопку с ролью checkbox - в основном это одна дает мне направление из/I сделают ход).

func doChange(stateOfCheckbox: Bool, row: Int){ 
    let fromSection = stateOfCheckbox ? 0 : 1 
    let toSection = stateOfCheckbox ? 1 : 0 

    let fromIndexPath = NSIndexPath(forRow: row, inSection: fromSection) 
    let toIndexPath = NSIndexPath(forRow: 0, inSection: toSection) 

    let dataPiece = ingredients[fromIndexPath.section][fromIndexPath.row] 
    ingredients[toIndexPath.section].insert(dataPiece, atIndex: toIndexPath.row) 
    ingredients[fromIndexPath.section].removeAtIndex(fromIndexPath.row) 

    ingredientsTableView.moveRowAtIndexPath(fromIndexPath, toIndexPath: toIndexPath) 
    ingredientsTableView.reloadData() 
} 

Я не хотел бы называть reloadData, но когда не вызываются каким-то образом индексы таблиц смешались. Это необходимо? Или есть другой способ?

Вот как ведет себя, если reloadData нет. Я не хочу перезагружать все и снова перекрашивать. Что было бы лучше?

behaviour

+0

Что значит точно «индексы запутались»? Что происходит, вы получаете сообщение об ошибке? –

+0

Сначала, когда установлен флажок, строка будет отправлена ​​во второй раздел. Во второй раз, если я выберу третью строку, он может отправить четвертый компонент в раздел «Got'em». И флажок остается выбранным для третьего. (У меня нет элементов в первом разделе). Кажется, что картина выполнена неправильно. –

+0

Ваша «строка» кажется отключенной. Не могли бы вы опубликовать код, из которого вызывается 'doChange()'? –

ответ

1

Я уверен, что проблема не в коде, отправленный в ваш вопрос. Из того, что я вижу в Gif, должно быть следующее:

Если вы отметите его, а затем проверьте его ниже, индекс сдвинется на один. Что на самом деле происходит: он по-прежнему использует старый индекс до того, как был проверен первый. Эти индексы будут либо нуждаться в обновлении, либо - что бы я предпочли - определяли, когда вы на самом деле нажимаете на него.

+0

О, я думаю, я понял. Я делаю это (в 'tableView: cellForRowAtIndexPath')' cell.checkbox.checkboxIndex = indexPath ', и я использую его позже в методе doChange. Когда вы не вызываете 'reloadData', новые индексы не вычисляются. Я попробую. Спасибо за просвещение! –

0

Вы можете использовать метод UITableView в: tableview.beginUpdates() и tableview.endUpdates()

func doChange(stateOfCheckbox: Bool, row: Int){ 
    let fromSection = stateOfCheckbox ? 0 : 1 
    let toSection = stateOfCheckbox ? 1 : 0 

    let fromIndexPath = NSIndexPath(forRow: row, inSection: fromSection) 
    let toIndexPath = NSIndexPath(forRow: 0, inSection: toSection) 

    let dataPiece = ingredients[fromIndexPath.section][fromIndexPath.row] 
    ingredients[toIndexPath.section].insert(dataPiece, atIndex: toIndexPath.row) 
    ingredients[fromIndexPath.section].removeAtIndex(fromIndexPath.row) 

    tableview.beginUpdates() 
    ingredientsTableView.moveRowAtIndexPath(fromIndexPath, toIndexPath: toIndexPath) 
    tableview.endUpdates() 

} 
+0

Я опробовал ваше решение без успеха. Поведение все еще присутствует. Я сделал gif, чтобы проиллюстрировать это. Когда я 'reloadData', все в порядке, хотя я вижу flickr. –