2011-01-13 4 views
5

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

В моем приложении некоторые ячейки таблицы просмотра были выбраны (они не ответили на события нажатия). 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; 
} 

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

не все ячейки могут быть выбраны.

Что мне не хватает?

обновление

, как обновленные здесь мой код выбора строки, если заинтересованные

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    ReviewWebViewController *rvc = [[ReviewWebViewController alloc] initWithReview:[self.reviews objectAtIndex:indexPath.row]]; 
    [self.navigationController pushViewController:rvc animated:YES]; 
    [rvc release], rvc=nil; 
} 
+0

и, предположительно, вы не возвращаете нуль из таблицыView: willSelectRowAtIndexPath: метод или что-нибудь еще? – Brynjar

+0

Что вы делаете в * didSelectRowAtIndexPath: * метод? – EmptyStack

+0

вот мой метод didSelectRowAtIndexPath: \t ReviewWebViewController * РВК = [[ReviewWebViewController Alloc] initWithReview: [self.reviews objectAtIndex: indexPath.row]]; \t [self.navigationController pushViewController: rvc animated: YES]; \t [rvc release], rvc = nil; – cpjolicoeur

ответ

1

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

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

+0

Это всего лишь базовый UITableViewController. Ничего особенного в представлении нет. Я создаю UIView и добавляю в него некоторые элементы, которые затем я устанавливаю как tableHeaderView через «self.tableView.tableHeaderView = myHeaderView» – cpjolicoeur

+0

и как добавляется UITableViewController в иерархию? –

+1

В конце концов, у меня был загрузочный HUD, который перехватывал события click. Вместо того, чтобы удалять HUD из супервизора, когда это было сделано, я просто останавливал анимацию, но оставил HUD на месте – cpjolicoeur

2

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

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

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

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

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

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

+0

извините, немного больше объяснение. Я вообще не использую IB, поэтому я не думаю, что у меня будут какие-то UILabels, которые я не вижу, но я попробую ваше предложение покрасить их все и посмотреть, пропустил ли я что-то. by «custom» UITableViewCell Я имею в виду, что я добавляю свои элементы непосредственно в cell.contentView напрямую, а не используя предопределенные элементы cell.textView.text и cell.detailedTextView.text, которые присутствуют по умолчанию. Я вручную добавляю два UILabels и один UIImageView в элемент cell.contentView вручную. – cpjolicoeur

+0

, чтобы проверить, я удалил весь свой код и использовал то, что я вставил выше, и только установил cell.textLabel.text = @ "foo", и я все еще не могу получить согласованные клики – cpjolicoeur

+0

neven, как обновление, я пошел вперед и сделал a "для (UIView * v в cell.subviews)" и установите для них все, чтобы в качестве цвета фона был [UIColor yellowColor]. Я также вручную установил 3 поля, которые я добавляю с красными, зелеными и синими цветами фона. Вот ссылка на скринкап, чтобы проиллюстрировать, что происходит. Первые две ячейки не принимают краны вообще, кроме как непосредственно на индикаторе раскрытия (в белом). Третья ячейка я могу щелкнуть по любой ячейке, а кран - в порядке. http://cl.ly/3q1c453t1D1r3h3B1D11 – cpjolicoeur

1

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

- (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; 

} 

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

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

+0

Rahul Спасибо, что нашли время, чтобы сделать все это. Я также создал совершенно новые проекты в xcode с нуля, пытаясь отладить это, и я не вижу одинаковых проблем в пустых проектах, только этот. Я хотел бы выяснить, почему этот не работает, даже с минимальным количеством кода (что явно верно) не работает. – cpjolicoeur

1

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

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

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

+0

Я уже прокомментировал метод как тест. Проблема не в том, что rvc не устанавливается. Метод didSelectRowAtIndexPath даже не вызывается вообще для кранов для некоторых ячеек, поэтому в этом методе нечего отлаживать. Когда обнаружены краны, все работает так, как ожидалось, и rvc настроен отлично, однако этот метод обычно не запускается даже на кранах (если я не коснусь индикатора раскрытия напрямую) – cpjolicoeur

4

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

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

1

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

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

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

Смежные вопросы