Я занимался разработкой под 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
}
2
Ahmed Khan 2 Янв 2018 в 16:23

2 ответа

Лучший ответ

Не назначайте теги кнопкам в 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)
}

Заметка:

Никогда не звоните reloadData после insert- / removeRows. Вы избавляетесь от анимации, а методы вставки / удаления обновляют пользовательский интерфейс. Методы beginUpdates и endUpdates бесполезны для одной операции вставки / перемещения / удаления.

4
vadian 4 Янв 2018 в 09:30

Наконец, я обнаружил, что правильно удалить строку, и вот как я это сделал

 self.tableView.beginUpdates()
    self.tableView.removeRows(at: indexSet , withAnimation: .effectFade)
    self.tableView.endUpdates()
0
Ahmed Khan 4 Янв 2018 в 09:01