Как вставить строку в 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
Надеюсь, это поможет кому-то....