我不确定是否遗漏了一些非常基本的东西,或者这仅仅是我在Swift UITableview
中遇到的另一个问题。我的问题是我在表格视图中引用了一个单元格(在本例中为第4行第0行),由于某种原因,swift给我带来了索引(6)超出范围的错误,该索引永远不会存在,因为该部分只能是4,日志也永远不会显示5(在while循环中打印positionCounter
时)。任何帮助将不胜感激,我不知道为什么在这种情况下我将得到6的值,如果您需要我提供任何额外的代码或澄清任何内容,请让我知道。
错误信息
*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 6 beyond bounds [0 .. 5]'
错误代码
cell = tableView.dequeueReusableCell(withIdentifier: "Item Card", for: indexPath)
var positionCounter = 0
while positionCounter < eventSettingsTableView.numberOfRows(inSection: 4) {
print(positionCounter)
print(String(eventSettingsTableView.numberOfSections) + " NUMBER OF SECTIONS")
print(String(eventSettingsTableView.numberOfRows(inSection: 4)) + " NUMBER OF ROW IN SECTION 4")
if eventSettingsTableView.cellForRow(at: IndexPath(row: 0, section: 4)) != nil {
print("no")
} else {
print("yes")
}
positionCounter = positionCounter + 1
}
positionCounter = 0
我将错误范围缩小到了这一行(将部分从4更改为3可修复该错误,但没有解释为什么
positionCounter
曾经是6)if eventSettingsTableView.cellForRow(at: IndexPath(row: 0, section: 4)) != nil {
编辑-对不起,忘记了此代码位于我的
cellForRowAt
的UITableView
函数中 最佳答案
看来您正在从cellForRowAt:
中调用cellForRowAt:
。这将根据情况导致问题。您可能需要考虑以不同的方式实现以下逻辑:
if eventSettingsTableView.cellForRow(at: IndexPath(row: 0, section: 4)) != nil {
print("no")
} else {
print("yes")
}
更新:
正如@ PaulW11指出的那样,从数据源
cellForRowAt:
中调用表视图的cellForRowAt:
应该不是问题。而且他是对的。但是,我设置了一个演示项目来调查此问题,并删除对
cellForRowAt:
的调用,但保留循环结果不会发生崩溃。此外,我设置了一个静态数据数组,并注意到崩溃不是由于边界条件引起的,因为当数组长9个项目时,我越界问题表明iOS正在查看一个12个项目的数组,访问似乎是对第十三项:)因此,目前,我的怀疑是此问题是由于某种时序/竞赛条件造成的,其中cellForRowAt:在循环内被多次调用,并且有些事情变了。但是,“什么”是什么,我不知道。如果有人有任何想法,我真的很想听听它,因为这是一个有趣的问题...