多选表tableView

时间:2017-07-06 22:25:15

标签: indexing swift3 tableview ios10 multipleselection

我的应用程序的某个部分我希望用户能够在表格中选择多个位置,如果需要,可以选择多个位置,并将这些位置打印到标签中,以便他们可以清楚地看到他们选择的位置他们。为了做到这一点,我需要在didSelectRowAt indexPath中添加什么?它全部在同一个ViewController上。

当我选择一个表格单元格时,我不想去另一个视图控制器。

@IBOutlet weak var labelGifteeLocationsPreview: UILabel!
@IBOutlet weak var tableLocations: UITableView!
let itemsLocations: [String] = ["Pacific Northwest", "West Coast", "The West", "Midwest", "Great Lakes", "The South", "New England"]

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return itemsLocations.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cellLocations: UITableViewCell = UITableViewCell()
    cellLocations.textLabel?.text = itemsLocations[indexPath.row]
    return cellLocations
}

修改

现在每当我选择距离表格较远的项目时,它会使索引超出范围错误。我不知道为什么只有当我从桌子上选择一个项目时才会发生这种情况。这是代码:

@IBOutlet weak var tableLocations: UITableView!
let itemsLocations: [String] = ["Pacific Northwest", "West Coast", "The West", "Midwest", "Great Lakes", "The South", "New England"]
@IBOutlet weak var labelGifteeLocationsPreview: UILabel!
var locationsPreviewtext = [String]()

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    locationsPreviewtext.append(itemsLocations[indexPath.row])
    labelGifteeLocationsPreview.text = "\(locationsPreviewtext)"
}

func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
    if locationsPreviewtext.isEmpty {
        return
    }
    else {
        let ind = index(ofAccessibilityElement: locationsPreviewtext[indexPath.row])   //this is where I get the index out of range error
        if ind == NSNotFound {
            locationsPreviewtext.remove(at: indexPath.row)
        }
    }
    labelGifteeLocationsPreview.text = "\(locationsPreviewtext)"

2 个答案:

答案 0 :(得分:0)

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: IndexPath){

        let cell = tableLocations.cellForRowAtIndexPath(indexPath)

        if (cell?.accessoryType == UITableViewCellAccessoryType.Checkmark){

            cell!.accessoryType = UITableViewCellAccessoryType.None;

        }else{

            cell!.accessoryType = UITableViewCellAccessoryType.Checkmark;

        }
    }

答案 1 :(得分:0)

Swift 4

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath){

    let cell = tableView.cellForRow(at: indexPath)

    if (cell?.accessoryType == UITableViewCellAccessoryType.checkmark){

        cell!.accessoryType = UITableViewCellAccessoryType.none

    }else{

        cell!.accessoryType = UITableViewCellAccessoryType.checkmark

    }
}

另一种方式,我推荐它

var tags = [["id":1,"name":"html"],["id":2,"name":"php"],["id":3,"name":"javascript"],["id":4,"name":"python"]]
var selectedTags = [Int]()

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return tags.count
    }

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = Bundle.main.loadNibNamed("TagsTableViewCell", owner: self, options: nil)?.first as! TagsTableViewCell

    if(selectedTags.contains(tags[indexPath.row]["id"].intValue)){
        cell.accessoryType = .checkmark
    }
    else{
        cell.accessoryType = .none
    }
    return cell

}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath){

    if(selectedTags.contains(tags[indexPath.row]["id"].intValue)){
        selectedTags = selectedTags.filter { $0 != tags[indexPath.row]["id"].intValue }
    }
    else{
        selectedTags.append(tags[indexPath.row]["id"].intValue)
    }

    tagsTableView.reloadData()

}