Swift 如何在tableView中插入行而不使用Cocoa中的重载数据函数
我一直在Swift 如何在tableView中插入行而不使用Cocoa中的重载数据函数,swift,macos,cocoa,nstableview,reloaddata,Swift,Macos,Cocoa,Nstableview,Reloaddata,我一直在Cocoa上做一个自学项目。尝试复制媒体播放器播放列表的工作方式(播放、添加和删除等) 到目前为止,我已经使用NSOpenPanel从目录中填充了tableview。我可以使用AVAudioPlayer将新文件插入tableview并播放选定的声音文件。一切正常 但是,当音频播放器播放时,我尝试在tableView中插入新行。它更新了整个tableView,我发现了以下问题 audioPlayer在执行更新后立即停止 播放未选中的选定媒体文件 下面是我的部分代码: var it
Cocoa
上做一个自学项目。尝试复制媒体播放器播放列表的工作方式(播放、添加和删除等)
到目前为止,我已经使用NSOpenPanel
从目录中填充了tableview。我可以使用AVAudioPlayer
将新文件插入tableview并播放选定的声音文件。一切正常
但是,当音频播放器播放时,我尝试在tableView中插入新行。它更新了整个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()
}
}
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")
}
}
如何通过添加或删除行来更新tableView,而
audioPlayer正在执行而不是重新加载整个tableview
我做了如下研究,发现了与上述问题类似的问题。但这并没有帮助我完全解决这个问题
我是macOS开发的新手。所以,请帮助我了解这个问题以及如何解决它
更新: 下面的代码解决了上述问题的一部分。使用下面的代码在更新后使选定行高亮显示
var items: [URL] = [] {
didSet {
let selectedRowIndexes = self.tableView.selectedRowIndexes
tableView.reloadData()
tableView.selectRowIndexes(selectedRowIndexes, byExtendingSelection: true)
}
}
但是,由于某种原因,audioPlayer在插入新行后仍然停止。我的音频播放器代码如下
在ViewDidLoad中:(操作方法)
选择器代码:
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()
}
}
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")
}
}
或
更新:问题已解决: 在
@Leo Dabus
的建议和他从这篇文章中接受的答案后,问题得到了解决。我创建了Singleton类,如下所示
class Shared {
private init(){ }
static let instance = Shared()
var audioPlayer = AVAudioPlayer()
}
并访问与下面相同的实例
Shared.instance.audioPlayer = audioPlayer
希望这对某人有所帮助……为什么AVAudioPlayer会停止?它属于tableViewCell吗?如果是这样,可以将其移动到视图控制器或AudioPlayerPool类,并将启动播放机的责任委托回。谢谢您的建议。我会尝试,我没有任何单独的音频播放器类。但是我在viewDidLoad
tableview.action=#selector(tableViewClick)
中有一个tableview操作方法,新行会自动更新。只需插入或删除该行即可。@Willeke谢谢。插入或删除行没有问题。问题是为什么音频播放器在插入行后停止运行。查看我的更新,并在评论中告知我。你为什么要重新加载数据
?为什么AVAudioPlayer会停止?它属于tableViewCell吗?如果是这样,可以将其移动到视图控制器或AudioPlayerPool类,并将启动播放机的责任委托回。谢谢您的建议。我会尝试,我没有任何单独的音频播放器类。但是我在viewDidLoadtableview.action=#selector(tableViewClick)
中有一个tableview操作方法,新行会自动更新。只需插入或删除该行即可。@Willeke谢谢。插入或删除行没有问题。问题是为什么音频播放器在插入行后停止运行。查看我的更新,并在评论中告知我。您为什么要重新加载数据
?
Shared.instance.audioPlayer = audioPlayer