关于子视图的Foreach语句似乎没有过滤掉需要过滤的内容

时间:2012-02-03 14:59:09

标签: iphone objective-c for-loop

我的for语句似乎返回的数量超过应有的数量,并导致错误。这是代码......

for (BookCustomCell *bcc in [self.tableView subviews])
{
    if (bcc.rowIDTag == [bookID intValue])
    {
        //Do something here.
    }
}

当我逐步完成这一切似乎都很好。它遍历For语句四次,每次bcc.rowIDTag存在且具有值。然后它第五次通过它。 bcc.rowIDTag不存在,因此崩溃(SIGABRT)。

  1. 为什么要经历第五次?
  2. 从概念上讲,我错过了什么? (我理解它找到的所有东西的方式 BookCustomCells在tableView子视图中,然后遍历每个子视图。这是正确的吗?)
  3. 有没有更好的方法来实现我的目标? (我有一个包含多行的tableview。每个 row有多个自定义单元格中的按钮。当我单击一个按钮时,我需要对该行/单元格中的所有其他按钮进行操作。)
  4. (这些编程内容对我来说都不容易,但我受到约束并决定学习它。感谢您的帮助。)

4 个答案:

答案 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,因此可能会出现错误或输入错误或...

希望有所帮助