2

我做过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
}
4

2 回答 2

4

不要将标签分配给按钮NSTableView

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

func row(for view: NSView) -> Int


动作中的代码可以减少到 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)
}

笔记:

永远不要打电话reloadDatainsert- / removeRows。你摆脱了动画,插入/删除方法确实更新了 UI。这些方法对于单个插入/移动/删除操作是无用的beginUpdatesendUpdates

于 2018-01-04T09:12:43.363 回答
0

最后我发现正确删除行,这就是我做的

 self.tableView.beginUpdates()
    self.tableView.removeRows(at: indexSet , withAnimation: .effectFade)
    self.tableView.endUpdates()
于 2018-01-04T09:01:32.737 回答