2016-12-21 3 views
2

При выборе нескольких ячеек в моем табеле также выбираются ячейки вне поля зрения. Я понимаю, что это потому, что я повторно использую ячейку и сохраняю ее выбор, когда я прокручиваю вниз. Я нашел несколько человек с подобными проблемами, но не смог перевести их решения для решения моей проблемы. Я пытался не dequeing клетку и просто использовать:Множественный выбор UITableView без dequeueReusableCellWithIdentifier

let cell = NewBillSplitterItemCell() 

но получить:

unexpectedly found nil while unwrapping an Optional value 

на линии:

cell.currentSplitters.text = splitterList 

в следующем коде:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

     fetchBillItems() 

     let cell: NewBillSplitterItemCell = tableView.dequeueReusableCellWithIdentifier("NewBillSplitterItemCell") as! NewBillSplitterItemCell 
     let item = allItems[indexPath.row] 
     let numberOfSplitters = item.billSplitters?.count 

     if numberOfSplitters == 0 { 
      cell.currentSplitters.text = "No one is paying for this item yet." 
     } else { 

      var splitterList = "Split this item with " 
      let itemSplitters = item.billSplitters?.allObjects as! [BillSplitter] 
      for i in 0...Int((numberOfSplitters)!-1) { 
       if numberOfSplitters == 1 { 
        splitterList += "\(itemSplitters[i].name!)" 
       } else { 
        splitterList += ", \(itemSplitters[i].name!)" 
       } 
      } 
      cell.currentSplitters.text = splitterList 
     } 

     cell.name.text = item.name 
     cell.price.text = "£\(item.price!)" 

     return cell 
    } 

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
     if let cell = tableView.cellForRowAtIndexPath(indexPath) { 
      if cell.accessoryType == .Checkmark 
      { 
       cell.accessoryType = .None 
       selectedItems.removeAtIndex(selectedItems.indexOf(allItems[indexPath.row])!) 
      } else { 
       cell.accessoryType = .Checkmark 
       selectedItems.append(allItems[indexPath.row]) 
      } 
     } 
    } 

Я не совсем понимаю, что делать, и любой hel p будет здорово. Благодаря

+0

Все, что находится в ячейке, равно нулю, поэтому оно начинается с cell.currentSplitters, а затем cell.name будет получать ту же ошибку, если она дошла до этого и т. Д. – Wazza

+0

что такое 'currentSplitters' в' cell.currentSpliiters.text'? Это UILabel? –

+0

Да, так есть .name и .price – Wazza

ответ

1

В дополнение к тому, что сказал @Mike, внутри cellForRowAtIndexPath вам нужна дополнительная проверка, потому что ячейки повторно используются.

Что-то вдоль линии

let isSelected = selectedItems[indexPath.row].selected 
if isSelected{ 
    cell.accessoryType = .Checkmark 
} else { 
    cell.accessoryType = .None 
} 

То же самое внутри didSelectRowAtIndexPath вы должны обновить источник данных вместо того, чтобы полагаться на UI вашей ячейки для этого условия.

+0

thankyou, я получаю это сейчас – Wazza

1

Если предположить, что клетки является ноль, вы должны использовать

let cell = tableView.dequeueReusableCellWithIdentifier("..." forIndexPath:indexPath) as! NewBillSplitterItemCell 

вместо

let cell= tableView.dequeueReusableCellWithIdentifier("...") as! NewBillSplitterItemCell 

Это гарантирует, что клетка никогда не будет равна нулю.

Кроме того, я бы проверил, правильно ли установлен идентификатор во всех ваших файлах .xib .storyboard.

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