Утверждение Foreach на подпредставлениях, кажется, не отфильтровывает то, что нуждается в фильтрации - PullRequest
2 голосов
/ 03 февраля 2012

Мой 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. Есть ли лучший способ для достижения моей цели?(У меня есть таблица с несколькими строками. Каждая строка имеет несколько кнопок, которые находятся в пользовательской ячейке. Когда я нажимаю кнопку, мне нужно воздействовать на все остальные кнопки в этой строке / ячейке.)

(Для меня все это не так просто, но я обязана научиться этому. Спасибо за вашу помощь.)

Ответы [ 4 ]

3 голосов
/ 03 февраля 2012

Ваш код неверен, UITableView содержит некоторые подпредставления, которые не UITableViewCell, поэтому вы получаете сбои SIGABRT.

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

Это должно сработать.

1 голос
/ 03 февраля 2012

Вы пытаетесь применить методы к классу, который не является 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, и если да, применяем ваш код.

0 голосов
/ 03 февраля 2012

Я верю, что SIGABRT возникает потому, что пятого bcc либо нет, либо пятый bcc не обладает свойством rowIDTag. Поэтому попробуйте добавить проверку, если rowIDTag существует или не равен нулю.

Я никогда не делал это так, как вы, но если бы мне пришлось перебирать все ячейки, я нашел бы следующее:

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 поблизости, поэтому может быть ошибка или ошибка при наборе или ...

Надеюсь, это поможет

0 голосов
/ 03 февраля 2012

Судя по вашему описанию, вы можете изменять subviews во время цикла.Это верно?Вы не можете изменить массив во время быстрого перечисления.SIGABRT означает исключение.Если вы заглянете в консольный журнал, я подозреваю, что вы увидите что-то вроде «мутации во время перечисления».

Если вам нужно изменить массив, сначала нужно сделать копию:

NSArray *subviews = [[self.tableView subviews] copy];
for (BookCustomCell *bcc in subviews) {
   ...
}
[subviews release];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...