我想做一个像桌面视图的待办事项应用程序。当我点击添加按钮(由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]()
答案 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>()