UITableView选中标记附件

时间:2016-01-05 05:43:15

标签: ios swift uitableview

我有一个UITableView,我想在选定的单元格或单元格中添加cell.textLabel.text的单元格中添加复选标记。如果数组计数为0,则第一个单元格应该有一个复选标记(有效,但随机选择其他单元格),否则为包含textlabel.text数组的单元格添加复选标记,也可以选择滚动随机单元格。 (我已经为我的UITableView添加了多个选择)。我该如何解决这个问题?

的cellForRowAtIndexPath

func tableView(tableView: UITableView,
        cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{
            let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath)
            cell.textLabel!.text = settings_categories[indexPath.row]
            if (userData[0].settings_categories.count == 0 && indexPath.row == 0){
                cell.accessoryType = UITableViewCellAccessoryType.Checkmark
            }
            else{
                if (userData[0].settings_categories.contains(settings_categories[indexPath.row])){
                    cell.accessoryType = UITableViewCellAccessoryType.Checkmark
                }
            }
            if (cell.selected){
                cell.selected = false
                if (cell.accessoryType == UITableViewCellAccessoryType.None){
                    cell.accessoryType = UITableViewCellAccessoryType.Checkmark
                }
                else
                {
                    cell.accessoryType = UITableViewCellAccessoryType.None
                }
            }
           return cell;
    }

didSelectRowAtIndexPath方法

 func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        NSLog("You selected cell number: \(indexPath.row)!")
        let cell = tableView.cellForRowAtIndexPath(indexPath)
        if cell!.selected
        {
            cell!.selected = false
            if cell!.accessoryType == UITableViewCellAccessoryType.None
            {
                //Add to array
                userData[0].settings_categories.append((cell?.textLabel?.text)!)
                cell!.accessoryType = UITableViewCellAccessoryType.Checkmark
                print(userData[0].settings_categories)
            }
            else
            {
                var counter = 0;
                for index in userData[0].settings_categories {
                    if index == cell?.textLabel?.text {
                        userData[0].settings_categories.removeAtIndex(counter)
                        print(userData[0].settings_categories)
                    }
                    counter++
                }
                cell!.accessoryType = UITableViewCellAccessoryType.None
            }
        }

    }

4 个答案:

答案 0 :(得分:3)

在单元初始化之后再添加一个cell.accessoryType = UITableViewCellAccessoryType.None因为在tableview中它重用了私有单元,所以如果单元格已经检查过(因为它重用了已检查的单元格),那么默认情况下它会被检查,所以在更新后你的代码将会是

func tableView(tableView: UITableView,
        cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{
            let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath)
            cell.textLabel!.text = settings_categories[indexPath.row]
            cell.accessoryType = UITableViewCellAccessoryType.None// new added line
            if (userData[0].settings_categories.count == 0 && indexPath.row == 0){
                cell.accessoryType = UITableViewCellAccessoryType.Checkmark
               // cell.selected = true
            }
            else{
                if (userData[0].settings_categories.contains(settings_categories[indexPath.row])){
                    cell.accessoryType = UITableViewCellAccessoryType.Checkmark
                 //   cell.selected = true
                }
            }
            if (cell.selected){
                cell.selected = false
                if (cell.accessoryType == UITableViewCellAccessoryType.None){
                    cell.accessoryType = UITableViewCellAccessoryType.Checkmark
                }
                else
                {
                    cell.accessoryType = UITableViewCellAccessoryType.None
                }
            }
           return cell;
    }

答案 1 :(得分:1)

您无法将选定状态存储在单元格内部,因为它们可以重复使用。您必须维护单独的数组或索引集以维护选定的索引。

答案 2 :(得分:0)

也发生在我身上。然后,我维护了一个数组来保存选定的indexPath.row&使用该数组重新加载表数据,例如保存在该数组中的行,每次滚动后都会有Checkmark附件。这只是一个解决方案,而不是最好的解决方案。

答案 3 :(得分:0)

在单元类实现中设置附件

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
    [super setSelected:selected animated:animated];

    // Configure the view for the selected state
    self.accessoryType = selected ? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone;
}