UITableViewCell не всегда выбирается? - PullRequest
5 голосов
/ 13 января 2011

Я пытаюсь отладить проблему с новым приложением, но что-то не так.В приложении я настраиваю пользовательские UITableViewCells, добавляя 2 UILabels и 1 UIImageView непосредственно в cell.contentView

В моем приложении определенные ячейки табличного представления не выбираются (они не реагируют на события касания).2-я ячейка на экране всегда была недоступна для выбора, а затем случайные другие ячейки также не выбирались.

В своих попытках отладки я разобрал все нижеприведенные основные элементы кода:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  static NSString *CellIdentifier = @"ReviewCell";
  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
  if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
  }
  cell.textLabel.text = @"foo";
  return cell;
}

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

Ответы [ 6 ]

4 голосов
/ 19 января 2011

Было упомянуто много вещей, которые я не буду повторять.

Но убедитесь, что для элементов, добавляемых в UITableViewCell, userInteractionEnabled установлено на NO. Особенно, когда не используется IB, никогда не делайте слишком много предположений о значениях по умолчанию.

2 голосов
/ 19 января 2011

Несколько недель назад я столкнулся с похожей ошибкой.У меня были кнопки в виде прокрутки, которые не реагировали на прикосновения.Это оказалось невидимым UILabel, который я оставил в своем IB-файле, никогда не заполняя текстом и забывая о нем.Он сидел над кнопками и перехватывал их прикосновения.

То, как я нашел это, состояло в том, чтобы пройтись по всем подпредставлениям вида прокрутки, поворачивая цвет фона каждого вида к желтому.Могли бы вы иметь случайный вид, который мешает прикосновениям?

Вы также можете попробовать изменить размеры меток и изображений в вашей ячейке на что-нибудь крошечное (10x10), чтобы увидеть, не мешают ли они.В крайнем случае, вы можете начать с нового кода и добавить его по частям, чтобы увидеть, где он ломается.

И последнее замечание: вы говорите, что используете пользовательский UITableViewCell, но инициализируете ячейку.с типом по умолчанию:

cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                               reuseIdentifier:CellIdentifier] autorelease];

Разве вы не должны использовать здесь свою ячейку?Это просто для упрощения примера?

1 голос
/ 19 января 2011

Как выглядит ваша иерархия представлений? На ум приходят две вещи: либо есть другие представления помимо табличного представления, которые могут перехватывать события касания, либо само табличное представление находится за пределами своего кадра суперпредставлений (и отсечение отключено).

Короче говоря - множество предложений, направленных на реализацию самого табличного представления, я бы посмотрел на все вокруг.

1 голос
/ 19 января 2011

Что происходит, когда вы извлекаете dequeueReusableCellWithIdentifier: codepath и всегда используете новую ячейку - тогда все ли они выбираются?

Есть ли родительское представление для UITableViewController, кадр которого можно установить меньше граництабличного просмотра?Если это так, прикосновения за пределами этого родителя не будут регистрироваться в tableView.Вы все равно увидите полный tableView, если родительский clipSubviews имеет значение NO.

Кроме того, убедитесь, что в окне вашего приложения установлено «хочет получить полный экран при запуске» в nib.Если нет, то окно может иметь неправильный размер, и сенсорные события могут не достигать вашего табличного представления.

1 голос
/ 19 января 2011

Если решение Невана не помогает, попробуйте удалить метод tableView: didSelectRowAtIndexPath (или закомментировать его) и посмотреть, светятся ли кнопки синим световым индикатором при нажатии Если они это сделают, то я подозреваю, что

ReviewWebViewController *rvc = [[ReviewWebViewController alloc] initWithReview:[self.reviews objectAtIndex:indexPath.row]];

Не всегда возвращает объект. Чтобы подтвердить это, установите точку останова в следующей строке и убедитесь, что rvc не равен нулю. Если это так, то это проблема.

1 голос
/ 19 января 2011

Я попробовал с примером приложения, которое полностью имитировало ваш подход.Все работало абсолютно нормально.Интересно, почему ваш код не работает, когда каждый бит, упомянутый выше, корректен.При необходимости я могу поделиться своим кодом с вами.Я использую следующий код

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    NSLog(@"Row Tapped At %d",indexPath.row);
    NextViewController *rvc = [[NextViewController alloc] initWithReview:[self.reviews objectAtIndex:indexPath.row]];
    [self.navigationController pushViewController:rvc animated:YES];
    [rvc release], rvc=nil;

}

, где Review * first = [[[alloc alloc] initWithReviewId: 1 andTitle: @ "First"] autorelease];и так далее ... self.reviews = [[NSArray alloc] initWithObjects: первый, второй, третий, четвертый, пятый, шестой, семь, восемь, девять, десять, одиннадцать, двенадцать, тринадцать, четырнадцать, пятнадцать, sizteen, nil];

Я использую iPhone SDK 4.2. Пожалуйста, дайте мне знать, если это имитирует ваш подход, и исправьте меня, если я допустил ошибку.Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...