Разверните и соедините таблицу tableview, когда она постукивается, быстро

Я пытаюсь расширить ячейку tableview при нажатии. Затем, когда он снова постучал, я хочу, чтобы он вернулся в исходное состояние.

Если cellA расширяется и cellB используется, я хочу, чтобы cellA сжимался, а cellB расширялся одновременно. Так что только одна ячейка может находиться в расширенном состоянии в любой данный момент.

Мой текущий код:

class MasterViewController: UITableViewController {
   var isCellTapped = false
   var currentRow = -1


   override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        selectedRowIndex = indexPath
        tableView.beginUpdates()
        tableView.endUpdates()
    }


   override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {

    if indexPath.row == selectedRowIndex.row {
        if isCellTapped == false {
            isCellTapped = true
            return 140
        } else if isCellTapped == true {
            isCellTapped = false
            return 70
        }

    }

    return 70
}

Текущий код работает хорошо, когда:

  • Вы нажимаете строку (она расширяется)
  • Вы снова нажмете его (он сжимается)

Не выполняется, когда:

  • Вы нажимаете строку (она расширяется)
  • Вы нажимаете другую строку (она сжимается, но другая строка не расширяется)

Как я могу это решить?

Ответ 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 так, как вы хотите.

Любое сомнение в репозитории вы можете разместить здесь.

Надеюсь, это поможет вам.

Ответ 2

Простой подход для расширения только одной ячейки за раз:

Swift 3

class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource {  

var selectedRowIndex = -1  
@IBOutlet weak var tableView: UITableView!

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        if indexPath.row == selectedRowIndex {
            return 90 //Expanded
        }
        return 40 //Not expanded
    }

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if selectedRowIndex == indexPath.row {
            selectedRowIndex = -1
        } else {
            selectedRowIndex = indexPath.row
        }
        tableView.reloadRows(at: [indexPath], with: .automatic)
    }
}  

Этот код будет расширять ячейку с щелчком и закрывать ранее открытую ячейку анимацией.