Проблемы с UITableView и повторным использованием ячеек
Так что сейчас я испытываю две проблемы с моим (довольно базовым) видом таблицы. Я вставлю свой код ниже, но вот общая суть: я делаю приложение для словаря, поэтому каждая ячейка содержит две метки для двух языков. если коснуться ячейки, мне бы хотелось: 1. увеличения высоты ячейки, 2. увеличения размера шрифта, 3. центра выравнивания текста, 4. изменения цвета фона ячейки.
я также включил код для "сброса" выбранной ячейки, если она выбрана во второй раз - это, кажется, вызывает мою вторую проблему
проблема в том, когда ячейка выбрана:
эти четыре вещи происходят с клетками, которые в настоящее время находятся за кадром.
программа аварийно завершает работу, когда: я выбираю ячейку 0, ячейка меняется, что хорошо, но когда я щелкаю по любой ячейке, находящейся вне экрана (скажем, ячейка 10), программа завершается сбоем, давая мне эту ошибку:
фатальная ошибка: неожиданно найден ноль при развертывании необязательного значения
код:
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
// reset previous cell but only if selectedRow isn't -1 which is initial value
if selectedRowIndex != -1{
let previousCell = convoTable.cellForRowAtIndexPath(NSIndexPath(forRow: selectedRowIndex, inSection: 0)) as! PhraseTableViewCell
previousCell.backgroundColor = UIColor.whiteColor()
previousCell.lang2Label.font = UIFont(name: (previousCell.lang2Label?.font?.fontName)!, size: (previousCell.lang2Label?.font?.pointSize)! - 5)
previousCell.lang2Label.textAlignment = .Right
}
//make changes to new cell that was pressed upon
if selectedRowIndex != indexPath.row{
print("new cell got selected")
cellSelected = true
// save the selected index
self.selectedRowIndex = indexPath.row
let cell = self.convoTable.cellForRowAtIndexPath(indexPath) as! PhraseTableViewCell
cell.lang2Label.font = UIFont(name: (cell.lang2Label?.font?.fontName)!, size: (cell.lang2Label?.font?.pointSize)! + 5)
cell.backgroundColor = UIColor.cyanColor()
cell.lang2Label.textAlignment = .Center
// update the height for all the cells
self.convoTable.beginUpdates()
self.convoTable.endUpdates()
cell.lang1Label.frame = CGRectMake(3,0, cell.bounds.width, cell.bounds.height/3)
cell.lang2Label.frame = CGRectMake(-3,cell.bounds.height/3, cell.bounds.width, cell.bounds.height/3 * 2)
}
else {
print("same cell pressed")
cellSelected = false
selectedRowIndex = -1
}
self.convoTable.beginUpdates()
self.convoTable.endUpdates()
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! PhraseTableViewCell
cell.lang1Label.text = items![indexPath.row].eng
cell.lang2Label.text = items![indexPath.row].prs
return cell
}
Спасибо всем большое, эта помощь очень ценится.
1 ответ
Поэтому нет реального ответа на поставленные мною вопросы. Лучшим обходным путем является просто наличие другого массива, который поддерживает состояния в ячейках. отстой, я знаю, но действительно лучшее "решение"