我一直在Cocoa
开展自学项目。试图复制媒体播放器播放列表的工作方式(播放,添加和删除等等)。
到目前为止,我已设法使用NSOpenPanel
从目录填充tableview。我可以使用AVAudioPlayer
将新文件插入到tableview中并播放选定的声音文件。一切都按预期工作。
但是,当我正在播放音频播放器时,我尝试向tableView 插入一个新行。它更新了整个tableView,我遇到了以下问题。
我的部分代码如下:
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。
我做了如下的研究,发现了与上述问题类似的问题。但它并没有帮助我完全解决这个问题。
How to update NSTableView without using -reloadData?
reloadData in NSTableView but keep current selection
Apple Doc - reloadData(forRowIndexes:columnIndexes:)
我是macOS开发的新手。所以,帮助我理解这个问题以及如何解决它。
下面的代码解决了上面提到的部分问题。使用以下代码可以在更新后突出显示所选行。
var items: [URL] = [] {
didSet {
let selectedRowIndexes = self.tableView.selectedRowIndexes
tableView.reloadData()
tableView.selectRowIndexes(selectedRowIndexes, byExtendingSelection: true)
}
}
但是,由于某种原因,在插入新行后,audioPlayer仍然停止。我的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 Peripheral disconnects when navigating to different ViewController之后得到解决。我创建了Singleton类,如下所示
class Shared {
private init(){ }
static let instance = Shared()
var audioPlayer = AVAudioPlayer()
}
并访问下面的相同实例。
Shared.instance.audioPlayer = audioPlayer
希望这有助于某人......