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类,并将启动播放机的责任委托回。谢谢您的建议。我会尝试,我没有任何单独的音频播放器类。但是我在viewDidLoad
tableview.action=#selector(tableViewClick)
中有一个tableview操作方法,新行会自动更新。只需插入或删除该行即可。@Willeke谢谢。插入或删除行没有问题。问题是为什么音频播放器在插入行后停止运行。查看我的更新,并在评论中告知我。您为什么要
重新加载数据
Shared.instance.audioPlayer = audioPlayer