我的for
语句似乎返回的数量超过应有的数量,并导致错误。这是代码......
for (BookCustomCell *bcc in [self.tableView subviews])
{
if (bcc.rowIDTag == [bookID intValue])
{
//Do something here.
}
}
当我逐步完成这一切似乎都很好。它遍历For语句四次,每次bcc.rowIDTag
存在且具有值。然后它第五次通过它。 bcc.rowIDTag
不存在,因此崩溃(SIGABRT)。
(这些编程内容对我来说都不容易,但我受到约束并决定学习它。感谢您的帮助。)
答案 0 :(得分:3)
您的代码错误,UITableView
包含一些非UITableViewCell
的子视图,这就是您遇到SIGABRT崩溃的原因。
for (BookCustomCell *bcc in [self.tableView visibleCells])
{
if (bcc.rowIDTag == [bookID intValue])
{
//Do something here.
}
}
这应该可以解决问题。
答案 1 :(得分:1)
您尝试将方法应用于非BookCustomCell的类,这应该更适合您。
for (UIView*tmp in [self.tableView subviews])
{
if ([tmp isKindOfClass:BookCustomCell])
{
BookCustomCell *bcc = (BookCustomCell*) tmp;
if (bcc.rowIDTag == [bookID intValue])
{
//Do something here.
}
}
}
在这里我们获取所有视图,检查它是否是BookCustomCell,如果是,请应用您的代码。
答案 2 :(得分:0)
根据您的描述,您可能会在循环过程中修改subviews
。那是对的吗?在快速枚举期间无法修改数组。 SIGABRT表示抛出异常。如果您查看控制台日志,我怀疑您会看到类似“枚举期间的突变”的内容。
如果您需要修改数组,则需要先复制一份:
NSArray *subviews = [[self.tableView subviews] copy];
for (BookCustomCell *bcc in subviews) {
...
}
[subviews release];
答案 3 :(得分:0)
我相信SIGABRT的出现是因为没有第五个bcc
,第五个bcc
没有rowIDTag
属性。因此,如果rowIDTag
存在或不等于nil,请尝试添加检查。
我从来没有像你那样做过,但是如果我必须遍历所有细胞,我会做以下事情:
for (int i = 0; i < [self.tableView numberOfRowsInSection:yourSectionHere]; i++) {
BookCustomCell *bcc = (BookCustomCell *)[self.tableView cellForRowAtIndexPath:yourIndexPathHere];
if (bcc.rowIDTag && bcc.rowIDTag == [bookID intValue] {
//do your stuff here
}
}
我附近没有Mac,因此可能会出现错误或输入错误或...
希望有所帮助