изменить текст метки для определенной ячейки uitableView, используя swift - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть метка «Сейчас исполняется» и «Изображение», которые должны отображаться в выбранной ячейке, а затем, когда я выбираю другую ячейку, предварительно выбранная ячейка должна быть очищена.

Код, который я написал:

func didSelectedRow(indexPath: IndexPath) {
    guard let cell = tblMusicPro.cellForRow(at: indexPath) as? musicTableViewCell else {
        return
    }
    if indexPath == currentIndex {
        cell.lblTagsPro.text = "Now Playing"
        cell.imgPlaying.alpha = 1
    } else {
        cell.lblTagsPro.text = ""
        cell.imgPlaying.alpha = 0
    }
}

'Now Playing' and 'Image' should be display on selected cell, then as i select other cell the prev selected should be clear now.

Ответы [ 3 ]

0 голосов
/ 21 февраля 2019

Для этого есть несколько решений.

  1. Реализация метода делегирования TableView didDeselectRowAt

    func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath)

  2. Еслиу вас есть собственный класс ячейки, укажите логику выделения / отмены выбора в методе setSelected в классе ячейки.

    override func setSelected(_ selected: Bool, animated: Bool)

  3. Установите свойство метки, если у вас естьранее выбранныйIndexPath.Вызовите этот метод из didSelectRowAt метода делегата.

    func removeNowPlayingText() {
         if let cell = tableView.cellForRow(at: previouslySelectedIndexPath) as? MusicTableViewCell {
              cell.lblTagsPro.text = ""
              cell.imgPlaying.alpha = 0
         }
    }
    
0 голосов
/ 21 февраля 2019

Для этого возьмите один массив для хранения IndexPath , затем отметьте его на cellForRowAt, как следует этому коду, добавьте IndexPath в массив, когда выберите ячейку, и удалите, если уже существует в массиве, затем перезагрузитеячейка таблицы для обновления значения.

var selectedCells:[IndexPath] = []

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        guard let cell = tblMusicPro.cellForRow(at: indexPath) as? musicTableViewCell else {
            return
        }
        if selectedCells.contains(indexPath) {
            cell.lblTagsPro.text = "Now Playing"
            cell.imgPlaying.alpha = 1
        } else {
            cell.lblTagsPro.text = ""
            cell.imgPlaying.alpha = 0
        }
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        if selectedCells.contains(indexPath) {
            let getIndex = selectedCells.index(of: indexPath)
            selectedCells.remove(at: getIndex)
        }else{
            selectedCells.append(indexPath)
        }

        tableView.reloadRows(at: [indexPath], with: true)

    }
0 голосов
/ 21 февраля 2019

Вы изменили состояние объекта ячейки таблицы, но оно не будет отражено до перезагрузки ячейки таблицы.Вы можете либо перезагрузить весь tableView, либо перезагрузить только 2 ячейки, которые отменяют выбор и выбирают.

Для этого

Сохраните переменную в своем классе для хранения выбранного индекса ячейки

var selectedCell: IndexPath?

Когда вы щелкаете ячейку, сохраняете indexpath в этой переменной и перезагружаете ячейку.скажем,

func selectCell(indexPath: IndexPath) {
    selectedCell = indexPath
    self.tblMusicPro.reloadData()
}

В вашем cellForRowAtIndexPath проверьте, выбрана ли ячейка или нет?

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: <cell_identifier>, for: indexPath) as! musicTableViewCell
    if indexPath == selectedCell {
        cell.lblTagsPro.text = "Now Playing"
        cell.imgPlaying.alpha = 1
    } else {
        cell.lblTagsPro.text = ""
        cell.imgPlaying.alpha = 0
    }

    //
    // Rest of your implementation
    //

    return cell
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...