Уведомление контроллера представления о событиях касания подпредставления - PullRequest
1 голос
/ 16 июня 2010

У меня есть UIViewController, вид которого имеет пользовательское подпредставление.

Это пользовательское подпредставление должно отслеживать сенсорные события и сообщать о жестах смахивания.

В настоящее время я помещаю штрихи Beg, touchesMoved, touchesEnded и touchesCancelled в классе subview. С некоторой дополнительной логикой я могу получить жесты и вызвать мои методы handleRightSwipe и handleLeftSwipe. Так что теперь, когда я пролистываю внутри подпредставления, он вызывает свои локальные методы обработки пролистывания. Это все отлично работает.

Но мне действительно нужно, чтобы методы handleRightSwipe и handleLeftSwipe находились в контроллере представления. Я мог бы оставить их в классе подпредставления, но тогда мне нужно было бы также ввести всю логику и данные, и это нарушает идею MVC.

Итак, мой вопрос: есть ли чистый способ справиться с этим? По сути, я хочу сохранить свои методы событий касания в подпредставлении, чтобы они запускались только для этого конкретного представления. Но я также хочу, чтобы контроллер представления был информирован, когда происходят эти сенсорные события (или в этом случае жесты смахивания).

Есть идеи?

Спасибо.

UPDATE:

Используя предложение Хенрика, вот краткий пример того, что я сделал (чтобы спасти вас от чтения):

Я установил свой контроллер вида в качестве наблюдателя уведомлений (в начале).

// NOTIFICATION_LEFT_SWIPE is defined as some unique string elsewhere.
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];

// Note that imageView is the instance of my subview that is calling the notification.
// You can set this to nil if you don't want it to be specific.
[nc addObserver:self selector:@selector(handleLeftSwipe) name:@NOTIFICATION_LEFT_SWIPE object:imageView];

Затем я реализую метод handleLeftSwipe. Это будет вызвано при получении уведомления.

Теперь в моем подпредставлении я отправляю уведомление, когда получен жест смахивания:

// Note that NOTIFICATION_LEFT_SWIPE is the same one used in the view controller
// I put this in a global header I use.  This is how you keep track of notifications.
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc postNotificationName:@NOTIFICATION_LEFT_SWIPE object:self]; 

И так же для правого пролистывания.

Ответы [ 2 ]

1 голос
/ 17 июня 2010

Вы также можете использовать систему распознавания жестов, которая доступна в OS 3.2 и более поздних версиях;Распознаватели жестов позволяют вам отделить обработку касаний от ваших классов представления и разработаны для почти точно того, что вы здесь делаете.В этом случае вы создадите экземпляр UIPanGestureRecognizer, добавите свой контроллер в качестве цели распознавателя (используя обычный синтаксис -addTarget:action:), а затем добавите распознаватель к вашему виду с помощью -addGestureRecognizer:.Тогда ваш контроллер получит серию сообщений о действиях, вызываемых по нему, когда пользователь проведет пальцем по представлению, и сможет проверить движение, вызвав метод -translationInView: распознавателя.

1 голос
/ 16 июня 2010

Вы можете использовать Центр уведомлений для отправки уведомлений различным (наблюдающим) объектам.

...