如何在TableView中插入行而不使用Cocoa中的reloadData函数

时间:2017-11-26 10:47:31

标签: swift macos cocoa nstableview reloaddata

我一直在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()
     }
   }
  

如何通过添加或删除行来更新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

希望这有助于某人......

0 个答案:

没有答案