В зависимости от подпредставлений, механизм цели / действия может быть хорош для этого. Если вы можете получить свои подпредставления из UIControl, то особенно легко, чтобы ваши подпредставления отправляли свое сообщение действия своей цели, которая обычно является вашим контроллером представления. Вы сможете разместить свои представления в Интерфейсном Разработчике и указать их цель и действие, подключив их к контроллеру представления. Если по какой-то причине вы не можете извлечь их из UIControl, вам придется реализовать эквивалент target / action, и у вас не будет такой же поддержки в IB, но это все еще довольно просто.
Другая возможность состоит в том, чтобы позволить контроллеру представления обрабатывать прикосновения для всех подпредставлений. Это в основном использует преимущества цепочки респондента, как вы предложили, но на уровне сенсорного управления. Это может быть не идеально, если нужно отслеживать множество подпредставлений, но это выполнимо.
Третий способ сделать так, чтобы ваши подпредставления опубликовали уведомление, когда они выбраны.
Как таковой, UIResponder не предоставляет механизм для передачи произвольных сообщений по цепочке респондента. Я не уверен, что добавление этой возможности является наиболее элегантным способом отправки сообщения конкретно из подпредставления в контроллер представления. Потенциально существует много промежуточных объектов между контроллером представления и подпредставлениями, и задействование всей цепочки, когда вы уже знаете, куда вы хотите, чтобы сообщение отправлялось, кажется неправильным. Однако интересно подумать о расширении UIResponder, чтобы сделать цепочку респондента проводником не только для событий. Вы можете добавить категорию в UIResponder:
@interface UIResponder (Messages)
- (void)sendMessage:(SEL)message withObject:(id)object;
@end;
@implementation UIResponder (Messages)
- (void)sendMessage:(SEL)message withObject:(id)object
{
if ([self respondsToSelector:message]) {
[self performSelector:message withObject:object];
}
else {
[[self nextResponder] sendMessage:message withObject:object];
}
}
@end
ПРЕДУПРЕЖДЕНИЕ Приведенный выше код полностью не проверен и может быть паршивой идеей по причинам, о которых я еще не думал. Действовать с осторожностью. Ожидайте ошибки компиляции. Скрестить пальцы. Пожалуйста, дайте мне знать, если это хорошо, и оставьте меня в покое, если это не так.