Обновление UITableview для одной ячейки - PullRequest
0 голосов
/ 14 марта 2019

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

Проблема в том, что все остальные изображения кнопок обновляются.

Таким образом, все изображения переходят в режим паузы вместо выбранной кнопки.

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

  override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

  let playerCell = tableView.dequeueReusableCell(withIdentifier: "playerCell", for: indexPath) as! PlayerCell
        let item = subcategory?.items?[indexPath.row]
        // Tap gestures extension for cell button action
        playerCell.playPause.addTapGestureRecognizer {
            AudioController.shared.setupPlayer(item: item)
            if let selectedCell = tableView.cellForRow(at: indexPath) as? PlayerCell {
                selectedCell.playPause.setImage(#imageLiteral(resourceName: "pause"), for: .normal)
                tableView.reloadRows(at: [IndexPath(row: indexPath.row, section: 1)], with: .none)
            }
            print("index \(indexPath)")
        }

Ответы [ 2 ]

1 голос
/ 14 марта 2019

Что вы можете сделать, это добавить тег к кнопке.Таким образом, в методе, в котором вы создаете ячейки override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell, вы добавляете к кнопке внутри этой ячейки тег, который представляет indexPath.Затем из селектора, которому вы назначаете кнопку, вы можете получить ячейку, которую хотите изменить.

Например:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "yourCell", for: indexPath)

    cell.button.tag = indePath.row
    cell.button.addTarget(self, action: #selector(yourSelector(_sender:)), for: .touchUpInside)
} 

func yourSelector(_sender: UIButton){
    let cell = tableView.cellForRow(at: IndexPath(row: sender.tag, section: 0)) as! YourCellType

    // Change the image, play/pause audio for that cell
}
0 голосов
/ 14 марта 2019

Когда вы нажимаете на кнопку в ячейке, tableView(_:didSelectRowAt:) не будет срабатывать, поэтому я предлагаю использовать delegate для определения действия кнопки.

И вам нужно следить за изменением статуса кнопки ячейки.

<Ч />

Например:

PlayCell.swift

protocol PlayCellDelegate: class {
    func playCellPlayButtonDidPress(at indexPath: IndexPath)
}    
class PlayerCell: UITableViewCell {
    let playButton: UIButton = {
        let button = UIButton()
        button.addTarget(self, action: #selector(playButtonPressed(_:)), for: .touchUpInside)
        return button
    }()

    weak var delegate: PlayCellDelegate?
    var item: MyItem? {
        didSet {
            if item?.status == .paused {
                // set pause image for playButton here
            } else if item?.status == .playing {
                // set play image for playButton here
            }
        }
    }
    var indexPath: IndexPath?
    @objc func playButtonPressed(_ sender: UIButton) {
        guard let indexPath = self.indexPath else { return }
        delegate?.playCellPlayButtonDidPress(at: indexPath)
    }
}


Model.swift

struct Subcategory {
    // ...
    var items: [MyItem]?
}
struct MyItem {
    // ...
    var status: Status.stop
    enum Status {
        case playing, paused, stopped // etc..
    }
}


TableViewController.swift

class TableViewController: UITableViewController, PlayCellDelegate {
    private var subcategory: Subcategory?
    private let cellId = "Cell"        
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        if let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as? PlayerCell {
            cell.delegate = self
            cell.item = subcategory?.items?[indexPath.row]
            cell.indexPath = indexPath
            return cell
        }
        return UITableViewCell()
    }

    func playCellPlayButtonDidPress(at indexPath: IndexPath) {
        // you only need to change model here, and reloadRows will update the cell.
        if subcategory?.items?[indexPath.row].status == .play {
            subcategory?.items?[indexPath.row].status = .pause
        } // other logic..
        tableView.reloadRows(at: [indexPath], with: .none)
    }
}

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

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