indexPath 的索引超出范围 swift
Index out of range for indexPath swift
我正在制作一个应用程序,要求用户点击多个单元格才能 select 它们。当他们点击一个单元格时,将出现一个 .Checkmark 配件。出于某种原因,尽管每当我尝试到达 VC 应用程序崩溃时,我都会在第 8 行收到以下错误消息(if !checked[indexPath.row]):
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
let cell: InstrumentTableCell! = tableView.dequeueReusableCellWithIdentifier(identifier) as? InstrumentTableCell
cell.configurateTheCell(recipies[indexPath.row])
if !checked[indexPath.row] {
cell.accessoryType = .None
} else if checked[indexPath.row] {
cell.accessoryType = .Checkmark
}
return cell
}
这是我的工作检查方法:
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
{
tableView.deselectRowAtIndexPath(indexPath, animated: true)
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
}
}
}
您的问题是当调用 tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
时,您仅 store 项在 checked
数组中。但是,只有当您实际 select 一行时才会调用该方法。
另一方面,tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath)
每次需要渲染新的 table 单元格时都会被调用。
所以当你在 cellForRowAtIndexPath
中问:
if !checked[indexPath.row]
那么你不能确定 checked
是否真的包含任何东西。例如,当您第一次开始渲染您的单元格时,您的 checked
数组不包含任何值,因此当您在它没有值的位置上请求它的值时它会崩溃。
一个解决方案可能是初始化您的 checked
数组以包含所有 false
值。我猜你有一些名为 recipies
的模型数组,所以你可以这样做:
for (index, _) in recipies.enumerate() {
checked.append(false)
}
或者正如@AaronBrager 在下面的评论中所建议的那样(更漂亮:))
checked = Array(count:recipies.count, repeatedValue:false)
这样你就可以确定你检查的数组被正确初始化了,元素数量与你接收到的元素数量相同。
另一种选择是让 recipies
中的各个元素知道它们是否被选中。
希望这对您有所帮助。
我正在制作一个应用程序,要求用户点击多个单元格才能 select 它们。当他们点击一个单元格时,将出现一个 .Checkmark 配件。出于某种原因,尽管每当我尝试到达 VC 应用程序崩溃时,我都会在第 8 行收到以下错误消息(if !checked[indexPath.row]):
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
let cell: InstrumentTableCell! = tableView.dequeueReusableCellWithIdentifier(identifier) as? InstrumentTableCell
cell.configurateTheCell(recipies[indexPath.row])
if !checked[indexPath.row] {
cell.accessoryType = .None
} else if checked[indexPath.row] {
cell.accessoryType = .Checkmark
}
return cell
}
这是我的工作检查方法:
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
{
tableView.deselectRowAtIndexPath(indexPath, animated: true)
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
}
}
}
您的问题是当调用 tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
时,您仅 store 项在 checked
数组中。但是,只有当您实际 select 一行时才会调用该方法。
tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath)
每次需要渲染新的 table 单元格时都会被调用。
所以当你在 cellForRowAtIndexPath
中问:
if !checked[indexPath.row]
那么你不能确定 checked
是否真的包含任何东西。例如,当您第一次开始渲染您的单元格时,您的 checked
数组不包含任何值,因此当您在它没有值的位置上请求它的值时它会崩溃。
一个解决方案可能是初始化您的 checked
数组以包含所有 false
值。我猜你有一些名为 recipies
的模型数组,所以你可以这样做:
for (index, _) in recipies.enumerate() {
checked.append(false)
}
或者正如@AaronBrager 在下面的评论中所建议的那样(更漂亮:))
checked = Array(count:recipies.count, repeatedValue:false)
这样你就可以确定你检查的数组被正确初始化了,元素数量与你接收到的元素数量相同。
另一种选择是让 recipies
中的各个元素知道它们是否被选中。
希望这对您有所帮助。