如何从swift中的多部分删除UITableView中的单元格

时间:2015-04-01 09:42:04

标签: ios iphone swift

我试图在swift中删除UITableView中的单元格,我按照本教程进行操作:http://www.ioscreator.com/tutorials/delete-rows-table-view-ios8-swift  问题是我的UITableView有很多部分,所以我不能像教程一样删除单元格。 任何人都知道如何删除多个部分的单元格表格? 感谢。

4 个答案:

答案 0 :(得分:1)

您无法使用本教程中描述的方法一次删除多个单元格。这只适用于单细胞。例如,如果选择多个单元格并使用按钮来触发删除操作,则代码可能如下所示:

if let indexPaths = tableView.indexPathsForSelectedRows() as? [NSIndexPath] {
    for indexPath in indexPaths {
        // one by one remove items from your datasource
    }

    tableView.deleteRowsAtIndexPaths(indexPaths, withRowAnimation: .Automatic)
} 

答案 1 :(得分:1)

您可以使用数字[section] [row]代替在示例中使用数字[row]。所以代码看起来像:

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return numbers[section].count
  }

override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
    if editingStyle == UITableViewCellEditingStyle.Delete {
      numbers[indexPath.section].removeAtIndex(indexPath.row)    
      tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic)
    }
  }

答案 2 :(得分:1)

这两个答案都不适合我。 Swift数组索引在删除时更新,因此来自.indexPathsForSelectedRows()的索引的for-in循环提供了意外的结果,即删除了错误的数据/表,并最终在数组边界错误之外的索引崩溃。发现好(但真的过时)Objective-C iOS Developer Library example。但是它使用了NSMutableArray removeObjectsAtIndexes方法,而不是Swift数组。无论如何,那里有很多有用的技巧,值得一看。 对我有用的方法是该示例的一部分,但是使用removeObjectsAtIndexes do-while代替逐个删除行,直到删除所有选定的行。以下方法由UIAlertAction调用,类似于Apple示例。

  func deleteSelectedRows() {

    // Unwrap indexPaths to check if rows are selected
    if let _ = tableView.indexPathsForSelectedRows() {
      // Do while all selected rows are deleted
      do {

      if let indexPath = tableView.indexPathForSelectedRow(){
        //remove from table view data source and table view
        self.dataSource.removeAtIndex(indexPath.row)
        tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic)
        }

      } while tableView.indexPathsForSelectedRows() != nil

    }else{
      // Delete everything, delete the objects from data model.
      self.dataSource.removeAll(keepCapacity: false)

      // Tell the tableView that we deleted the objects.
      // Because we are deleting all the rows, just reload the current table section
      self.tableView.reloadSections(NSIndexSet(index: 0), withRowAnimation: .Automatic)
    }
    // Exit editing mode after the deletion.
    self.tableView.setEditing(false, animated: true)
  }

编辑:尽管我做过一些小例子,但我一直在努力(jus从swift开始),但这并不高效。扩展Array或使数据源Equatable并使用find()或.filter是可取的。但我确信应该有一个更简单的方法。我现在使用的那个在下面的链接中描述:

http://www.rockhoppertech.com/blog/swift-remove-array-item/

func == (lhs: myDataSource, rhs: myDataSource) -> Bool {
  if lhs.data == rhs.data &&
    lhs.otherData == rhs.otherData {
      return true
  }
  return false
}

struct myDataSource: Equatable {
 let data: String
 let otherData: String
}

然后:

if let selectedRows = tableView.indexPathsForSelectedRows(){
  var objectsToDelete = [myDataSource]()
  for selectedRow in selectedRows {
    objectsToDelete.append(myDataSource[selectedRow.row])
  }
  for object in objectsToDelete {
    if let index = find(myDataSource, object){
      myDataSource.removeAtIndex(index)
    }
  }
}
tableView.deleteRowsAtIndexPaths([selectedRows], withRowAnimation: .Automatic)

答案 3 :(得分:0)

尝试这个。这很好用。 但不要忘记这一点。 func tableView(tableView:UITableView,canEditRowAtIndexPath indexPath:NSIndexPath) - >布尔     {         返回true     }

func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath)
{
    if editingStyle == .Delete
    {
        arrayOfnames.removeAtIndex(indexPath.row)
        self.tableViewww.reloadData()
    }
}