Ответ 1
Вам нужно принять во внимание, что вам нужно обновить выбранную строку, когда другой подключен, см. следующий код:
override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
if indexPath.row == selectedRowIndex {
return 140
}
return 44
}
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
if selectedRowIndex != indexPath.row {
// paint the last cell tapped to white again
self.tableView.cellForRowAtIndexPath(NSIndexPath(forRow: self.selectedRowIndex, inSection: 0))?.backgroundColor = UIColor.whiteColor()
// save the selected index
self.selectedRowIndex = indexPath.row
// paint the selected cell to gray
self.tableView.cellForRowAtIndexPath(indexPath)?.backgroundColor = UIColor.grayColor()
// update the height for all the cells
self.tableView.beginUpdates()
self.tableView.endUpdates()
}
}
EDIT:
Чтобы обработать, что ячейка, в которой выбрана и снова нажата, возвращается в исходное состояние, вам необходимо проверить некоторые условия, такие как:
var thereIsCellTapped = false
var selectedRowIndex = -1
override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
if indexPath.row == selectedRowIndex && thereIsCellTapped {
return 140
}
return 44
}
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
self.tableView.cellForRowAtIndexPath(indexPath)?.backgroundColor = UIColor.grayColor()
// avoid paint the cell is the index is outside the bounds
if self.selectedRowIndex != -1 {
self.tableView.cellForRowAtIndexPath(NSIndexPath(forRow: self.selectedRowIndex, inSection: 0))?.backgroundColor = UIColor.whiteColor()
}
if selectedRowIndex != indexPath.row {
self.thereIsCellTapped = true
self.selectedRowIndex = indexPath.row
}
else {
// there is no cell selected anymore
self.thereIsCellTapped = false
self.selectedRowIndex = -1
}
self.tableView.beginUpdates()
self.tableView.endUpdates()
}
С приведенными выше изменениями в функциях didSelectRowAtIndexPath
и heightForRowAtIndexPath
вы можете видеть, когда ячейка набрала свой фоновый цвет, она будет изменена на серый, когда высота будет расти, а когда другая ячейка будет постучана, ячейка будет окрашена в белый цвет и постукивает до серого и снова и снова, позволяя только коснуться одной ячейки во время.
Хотя вы можете извлечь выгоду и узнать, как сделать Аккордеонное меню в этом репо, которое я создал, и я планирую обновить его очень скоро для обработки лучших результатов, он обрабатывает с помощью UITableView
так, как вы хотите.
Любое сомнение в репозитории вы можете разместить здесь.
Надеюсь, это поможет вам.