У меня есть UIViewController, представление которого имеет пользовательское подпредставление.
Это пользовательское подпредставление должно отследить сенсорные события и жесты сильного удара отчета.
В настоящее время я помещал touchesBegan, touchesMoved, touchesEnded и touchesCancelled в классе подпредставления. С некоторой дополнительной логикой я могу получить жесты сильного удара и назвать мой handleRightSwipe и handleLeftSwipe методы. Таким образом, теперь, когда я сильно ударяю в рамках подпредставления, оно называет свои локальные методы обработки сильного удара. Это все хорошо работает.
Но то, в чем я действительно нуждаюсь, для handleRightSwipe и handleLeftSwipe методов, чтобы быть в контроллере представления. Я мог оставить их в классе подпредставления, но затем я должен буду ввести всю логику и данные также и такие повреждения идея MVC.
Таким образом, мой вопрос существует ли очевидный способ для обработки этого? По существу я хочу сохранить свои сенсорные методы события в подпредставлении так, чтобы они только инициировали для того определенного представления. Но я также хочу, чтобы контроллер представления был информирован, когда эти сенсорные события (или в этом сильном ударе случая жесты) имеют место.
Какие-либо идеи?
Спасибо.
ОБНОВЛЕНИЕ:
Используя предложение Henrik, вот быстрый образец того, что я сделал (для сохранения Вас чтение):
Я установил свой контроллер представления как наблюдатель уведомлений (вначале).
// 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];
И так же для правильного сильного удара.
Вы можете использовать Центр уведомлений для отправки уведомлений различным (наблюдающим) объектам.
Вы могли бы также использовать систему распознавателя жестов, которая доступна в OS 3.2 и более поздних версиях; распознаватели жестов позволяют вам отделить обработку касаний от ваших классов представления, и предназначены для практически точно такой вещи, которую вы делаете здесь. В этом случае вы создадите экземпляр UIPanGestureRecognizer
, добавите ваш контроллер в качестве цели распознавателя (используя обычный синтаксис -addTarget:action:
), затем добавите распознаватель в ваше представление с помощью -addGestureRecognizer:
. Тогда ваш контроллер будет получать серию сообщений о действиях, вызываемых по мере того, как пользователь проводит пальцем по представлению, и сможет проверить движение, вызвав метод распознавателя -translationInView:
.