События UITouch и представления таблиц - PullRequest
0 голосов
/ 14 мая 2010

Я работаю над навигационным приложением для iPhone, которое служит двум основным целям: во-первых, для представления данных в иерархическом представлении, позволяя пользователям выполнять детализацию и в конечном итоге редактировать эти данные, и во-вторых, для всех пользователей. выполнить действие по умолчанию при нажатии на ячейку табличного представления. Теперь мне нужно предложить небольшой набор опций, привязанных к одним и тем же данным; однако оба метода didSelectRowAtIndexPath: и accessoryButtonTappedForRowAtIndexPath: методы явно используются.

Итак, мои варианты, по-видимому, заключаются в реализации метода двойного нажатия, при котором небольшой список дополнительных параметров будет представлен после (как вы уже догадались) двойного нажатия на строку таблицы; или, предпочтительно, способ постукивания и удерживания. Из того, что я могу сказать, касание и удержание похоже на путь в SDK 4.0 - что мне не очень хорошо в эту горячую минуту. Я решил пойти с опцией двойного нажатия, но у меня возникли небольшие проблемы.

Прежде всего, метод touchesBegan: withEvent: кажется не вызывается вообще; точка останова, помещенная в метод, никогда не вызывается во время работы приложения, и табличное представление реагирует точно так же, как и до того, как я вставил метод (то есть он выполняет действие по умолчанию):

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *aTouch = [touches anyObject];
    if (aTouch.tapCount == 2) {
        [NSObject cancelPreviousPerformRequestsWithTarget:self];
    }
}

Во-вторых, мне не нужно обрабатывать одно нажатие - didSelectRowAtIndexPath: метод может отлично обрабатывать одно нажатие. Двойное прикосновение - вот что я хочу сделать. Я подозреваю, что ответ будет содержать фразу: «Вы не можете, чтобы табличное представление обрабатывало одно касание, а touchesBegan: метод обрабатывает двойное касание. Методы обработки касания должны обрабатывать все из них».

Я был бы очень признателен некоторым советам некоторых из вас, которые занимались этой проблемой. Заранее спасибо.

1 Ответ

2 голосов
/ 22 мая 2010

Хорошо, после недели царапин на голове и бормоча себе под нос, я наконец пришел к следующему выводу: хотя то, что я хочу сделать, теоретически возможно с использованием текущей версии iPhone OS, усилия по эта работа будет очень масштабной. Учитывая, как скоро выйдет iPhone OS 4, я решил использовать функцию 4.0 SDK для реализации нужного мне поведения.

В частности, я сделал следующее:

// in my tableView:cellForRowAtIndexPath: method
static NSString *CellIdentifier = @"CustomCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
[[NSBundle mainBundle] loadNibNamed:@"TableViewCell" owner:self options:nil];
    cell = tvCell;
    self.tvCell = nil;
}
UILabel *label;
label = (UILabel*)[cell viewWithTag:1];
label.text = [NSString stringWithFormat:@"Main Label"];
label = (UILabel*)[cell viewWithTag:2];
label.text = [NSString stringWithFormat:@"Sub Label"];
UILongPressGestureRecognizer *recognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)];
[[cell viewWithTag:0] addGestureRecognizer:recognizer];
[recognizer release];
UIImage *theImage = [UIImage imageNamed:@"silhouette.png"];
UIImageView *pictureView = (UIImageView*)[cell viewWithTag:0];
pictureView.image = theImage;
return cell;

Я создал отдельный файл NIB для пользовательской ячейки; это просто объект tableViewCell с imageView (для фотографии контакта) в дальнем левом углу и двумя метками в центре (основная метка с большим текстом и суб метка с меньшим текстом). CellForRowAtIndexPath: метод загружает эту пользовательскую ячейку по мере необходимости, а затем заполняет ячейку некоторыми статическими данными (это, очевидно, изменится, когда я включу этот код в свое существующее приложение). Мне нужно было реализовать только один новый метод для распознавателя жестов:

- (void)handleLongPress:(UILongPressGestureRecognizer*)sender {
NSLog(@"Long press detected.");
}

Очевидно, что это тоже будет реализовано, когда я на самом деле использую его.

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

Надеюсь, это кому-нибудь поможет.

...