Как вставить строку в tableView без использования функции reloadData в Какао

Я работал над проектом самообучения в Cocoa, Попытка воспроизвести список воспроизведения медиаплеера ("Воспроизвести", "Добавить и удалить" и т. Д.).

До сих пор мне удалось заполнить таблицу из каталога с помощью NSOpenPanel, Я могу вставлять новые файлы в таблицу и воспроизводить выбранные звуковые файлы, используя AVAudioPlayer, Все работает как положено.

Но когда я пытаюсь вставить новую строку в tableView во время воспроизведения audioPlayer. Он обновляет весь tableView, и я получаю следующие проблемы.

  • audioPlayer остановился, как только обновление выполнено.
  • Воспроизведение выбранного медиа-файла оставлено невыбранным.

Мой частичный код ниже:

   var items: [URL] = [] {
   didSet {    
          tableView.beginUpdates()
          tableView.reloadData(forRowIndexes: tableView.selectedRowIndexes, columnIndexes: tableView.selectedColumnIndexes)
          tableView.reloadData()//Trying to avoid this func...
          tableView.selectRowIndexes(tableView.selectedRowIndexes, byExtendingSelection: true)
          tableView.endUpdates()
     }
   }

Как обновить tableView, добавив или удалив строку во время выполнения audioPlayer, а не для перезагрузки всего tableView.

Я провел некоторое исследование, как показано ниже, и нашел вопрос, аналогичный вышеуказанным. Но это не помогло мне полностью решить проблему.

Как обновить NSTableView без использования -reloadData?

reloadData в NSTableView, но сохранить текущий выбор

Apple Doc - reloadData(forRowIndexes:columnIndexes:)

Я новичок в разработке MacOS. Итак, помогите мне разобраться в проблеме и как ее исправить.


Обновить:

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

  var items: [URL] = [] {
  didSet {    
      let selectedRowIndexes = self.tableView.selectedRowIndexes
      tableView.reloadData()
      tableView.selectRowIndexes(selectedRowIndexes, byExtendingSelection: true)
     }
   }

Но все же audioPlayer по какой-то причине остановился после вставки новой строки. мой код аудио-проигрывателя, как показано ниже

В ViewDidLoad: (метод действия)

 tableView.doubleAction = #selector(tableViewClick)

Код селектора:

 func tableViewClick(_ sender: AnyObject) {
    if tableView.selectedRow < 0 { return }
    let selectedItem = items[tableView.selectedRow]
    print(selectedItem)
    do{
        try self.audioPlayer = AVAudioPlayer.init(contentsOf: selectedItem)
        audioPlayer.delegate = self
        audioPlayer.play()
    }
    catch {
        print("Error reading file attributes")
    }
}

Попытка обновить строку / столбец только с использованием reloadData (forRowIndexes: columnIndexes:). Но, похоже, не работает...

  tableView.reloadData(forRowIndexes: NSIndexSet(index: tableView.selectedRowIndexes.count) as IndexSet, columnIndexes: NSIndexSet(index: tableView.selectedColumnIndexes.count) as IndexSet)  

или же

  tableView.reloadData(forRowIndexes: tableView.selectedRowIndexes, columnIndexes: tableView.selectedColumnIndexes)

Обновление: проблема решена:

Проблема решена после @Leo Dabus Предложение и его принятый ответ из этого поста BLE Периферийные соединения отключаются при переходе на другой ViewController. Я создал класс Singleton, как показано ниже

class Shared { 
    private init(){ } 
    static let instance = Shared()
    var audioPlayer = AVAudioPlayer()
}

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

Shared.instance.audioPlayer = audioPlayer

Надеюсь, это поможет кому-то....

0 ответов

Другие вопросы по тегам