swift - 在基于 NSTableView 的 View 中删除和添加行

标签 swift macos nstableview nstablecellview

我做过 IOS 开发,但对 OSX 还不熟悉。我遇到的问题是,我通过单击表行中的按钮成功删除了 NStableView 中的行,但是当我单击添加按钮时,已删除的行再次出现,然后未删除。 这是我的删除功能

   func delIssue(_ sender:NSButton)
{
  let btn = sender
  if btn.tag >= 0
  {
    let issueValue = issueKeys[btn.tag]
    for index in 0..<issueName.count
    {
      if issueValue == issueName[index]
      {
        issueName.remove(at: index)

        rowCount = rowCount - 1
        self.tableView.removeRows(at: NSIndexSet.init(index: index) as IndexSet , withAnimation: .effectFade)
        self.tableView.reloadData()
        break
      }
    }
  }
}

rowCount 基本上是变量,当添加行时我会增加它,当删除行时我会减少它。 我的添加行函数是

    @IBAction func addRow(_ sender: Any)
  {
    rowCount += 1
    DispatchQueue.main.async
    {
      self.tableView.reloadData()
    }
  }

数据源是

  func numberOfRows(in tableView: NSTableView) -> Int
{
  return rowCount
}

最佳答案

不要将标签分配给 NSTableView 中的按钮

NSTableView提供了一种非常方便的获取当前行的方法:方法

func row(for view: NSView) -> Int


action中的代码可以减少到3行

@IBAction func delIssue(_ sender: NSButton)
{
  let row = tableView.row(for: sender)
  issueName.remove(at: row)
  tableView.removeRows(at: IndexSet(integer: row), withAnimation: .effectFade)
}

要添加行,请将值附加到数据源数组,然后调用 insertRows

@IBAction func addRow(_ sender: Any)
{
    let insertionIndex = issueName.count
    issueName.append("New Name")
    tableView.insertRows(at: IndexSet(integer:insertionIndex), withAnimation: .effectGap)
}

注意:

切勿在 insert-/removeRows 之后调用 reloadData。您摆脱了动画,并且插入/删除方法确实更新了 UI。 beginUpdatesendUpdates 方法对于单个插入/移动/删除操作没有用处。

关于swift - 在基于 NSTableView 的 View 中删除和添加行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48061844/

相关文章:

iphone - 重播按钮不起作用。 ( swift ,雪碧)

swift - 如何获取 Pin 图来更改其图像?

协议(protocol)类型 'XXX' 的 Swift 值不能符合 'Identifiable' ;只有结构/枚举/类类型可以符合协议(protocol)

objective-c - NSTableView 响应面板中的第一次单击

macos - 以编程方式对 NSTableView 进行排序

具有复杂类型的 Swift CustomStringConvertible

windows - 有没有办法从 Mac 跟踪远程 Windows 机器上的日志?

macOS 辅助功能检查器不适用于 Slack

macos - 关闭 6 核 Intel Xeon 中的超线程

macos - 插入行时保持相同的 NSTableView 滚动位置