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