Как я могу обрабатывать пользовательские события в разработке iOS? - PullRequest
2 голосов
/ 15 июля 2010

Мы работаем над проектом с использованием некоторых пользовательских представлений. У нас есть следующая иерархия:

UIViewController -> UIScrollView (пользовательский подкласс) -> UIView (пользовательский подкласс)

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

- (void)handleTapFrom:(UITapGestureRecognizer *)recognizer {
    [[self superview] itemSelected:self];
}

В этом случае суперпредставлением является наш пользовательский подкласс UIScrollView. Отсюда мы используем другой метод:

- (void) itemSelected: (id)selectedItem {
    itemView *item = selectedItem;
    [[self superview] initSliderViewForItemNamed:item.name];
    item = nil;
}

Теперь вот где вещи ломаются. Мы хотим запустить другой метод в UIViewController для загрузки нового представления в верхней части нашей иерархии представлений. Итак, в UIViewController у нас есть этот метод для проверки на успех:

- (void) initSliderViewForItemNamed:(NSString *)selectedItemName {
    NSLog(@"Selected item was found! %@",selectedItemName);
}

Но мы никогда не достигнем этой точки, и приложение вылетает. Это потому, что мы не можем ссылаться на UIViewController здесь. Вместо этого мы ссылаемся на свойство view UIViewController. Итак, наша фактическая иерархия объектов:

UIViewController.view -> UIScrollView (пользовательский подкласс) -> UIView (пользовательский подкласс)

Это приводит меня к двум вопросам.

  1. Как мы ссылаемся на UIViewController из нашего подпредставления, которое принадлежит свойству view контроллера?
  2. Является ли этот метод запутанным. Есть лучший способ сделать это? Должны ли мы назначать UIViewController в качестве делегата нашего пользовательского подкласса UIScrollView?

Ответы [ 5 ]

0 голосов
/ 16 июля 2010

Идиоматический способ сделать то, что вы хотите, это отправить сообщение по цепочке респондента .UIViewController участвует в цепочке респондента, поэтому он получит сообщение.

0 голосов
/ 16 июля 2010

В итоге я решил назначить View Controller делегатом представления прокрутки. Это выглядит так:

    itemScrollView = [[ItemScrollView alloc] initWithFrame:CGRectMake(...)];
    [itemScrollView setDelegate:self];      
    [self.view addSubview: itemScrollView];

Тогда в моей реализации ItemScrollView я мог ссылаться на ViewController с помощью:

    [[self delegate] initSliderViewForItemNamed:selectedItem.name];

Большое спасибо всем, кто ответил. Таким образом, установка View Controller в качестве делегата была правильным ответом, однако никто не вдавался в подробности относительно того, как это сделать. Итак, я рассмотрел это здесь в этом ответе. Дополнительную информацию также можно найти по этому вопросу с участием делегатов:

Как создать делегатов в Objective-C?

0 голосов
/ 15 июля 2010

Джим, вам следует настроить делегата на свой пользовательский подкласс uiview и позволить вам просматривать контроллер, являющийся его делегатом, и соответствовать протоколу, который вы только что создали, и у вас все будет хорошо (то есть: что делает таблица)

0 голосов
/ 16 июля 2010

Да, либо с использованием делегата, либо вы реализуете: -

  • (void) touchesBegan: (NSSet *) касается события EventEvent: (UIEvent *)

или

  • (void) touchesEnded: (NSSet *) касается событияEEvent: (UIEvent *)

в зависимости от того, как вы хотите обработать касание.

0 голосов
/ 15 июля 2010

Не можете точно понять, чего вы хотите достичь - не могли бы вы описать конечную цель? - этот метод звучит довольно сложно и запутанно. Я думаю, что у меня есть решение, но я не знаю, связано ли оно: P

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