自定义tableview(单元格)带有复选标记

时间:2016-01-02 15:26:50

标签: ios swift uitableview tableviewcell

我想做一个像桌面视图的待办事项应用程序。当我点击添加按钮(由self.navigationItem.rightBarButtonItem = addButton提供的系统)时,会出现一个新的表视图和一个包含给定项目的列表(由coreData实体提供)。 现在我想通过单元格中的触摸设置复选标记,最后我想按“保存”按钮。用于在第一个表视图中选择所有选中(选中的项目)。

我想在didSelectRowAtIndexPath中这样做。 但是当我向上和向下滚动时,即使在我没有检查过的单元格中,也会得到复选标记。然后我尝试了以下代码:

cellForRowAtIndexPath

cell.detailObejct = (dataOfEntity[indexPath.row])
if checked[indexPath.row] == false {

    cell.accessoryType = .None
}
else if checked[indexPath.row] == true {

    cell.accessoryType = .Checkmark
}

并在

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    if let cell = tableView.cellForRowAtIndexPath(indexPath) {
        if cell.accessoryType == .Checkmark
        {
            cell.accessoryType = .None
            checked[indexPath.row] = false
        }
        else
        {
            cell.accessoryType = .Checkmark
            checked[indexPath.row] = true
        }
}

但是当我运行该代码时,我得到一个错误,表明数组索引超出范围。该数组声明为

var checked = [Bool]()

3 个答案:

答案 0 :(得分:2)

您好像没有考虑原始数据源的大小。

您需要为已检查变量实例化字典

var checked = Dictionary<Int, Bool>()

跟踪原始dataSource中的索引。

或实例化具有默认大小和值的数组

var checked : Array<Bool>!

override func viewDidLoad() {
    // You need the size of your data at this point
    checked = [Bool](count: dataSource.count, repeatedValue: false)
}

如果还有什么我可以提供的帮助,请告诉我。

答案 1 :(得分:1)

你没有在你的已检查数组中添加任何元素我的意思是它有0个元素,但你试图在数据源方法中取出一个项目,所以用所有错误的值初始化checked数组,因为最初没有选择任何行,

for _ in 0...tableItems.count{ //tableItems should be your data source count
  checked.append(false)
}

我尝试了同样的一切,对我来说一切正常,在viewDidLoad()中添加上述语句

答案 2 :(得分:0)

谢谢@dsieczko我在代码中更改了一些细节:

cell.detailObejct = (dataOfEntity[indexPath.row])
cell.accessoryType = .None // THIS IS MANDATORY
if checked[indexPath.row] == false {

    cell.accessoryType = .None
}
else if checked[indexPath.row] == true {

    cell.accessoryType = .Checkmark
}

和did选择看起来像:

 override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    if let cell = tableView.cellForRowAtIndexPath(indexPath) {
        if cell.accessoryType == .Checkmark
        {
            cell.accessoryType = .None
            //checked[indexPath.row] = false // this line removes now the entry instead of setting it only to false
checked[indexPath.row] = nil
        }
        else
        {
            cell.accessoryType = .Checkmark
            checked[indexPath.row] = true
        }
}

因为dict:

var checked = Dictionary<Int, Bool>()