Согласно документации iOS, цепочка ответчиков используется для передачи сенсорных событий "вверх по цепочке" . Он также используется для действий, создаваемых элементами управления. Хорошо.
Я действительно хотел бы отправить пользовательское событие "вверх по цепочке" . Первый ответчик, который заберет событие, справится с этим. Это похоже на довольно распространенный шаблон, но я не могу найти никакого хорошего объяснения, как это сделать "iOS/ Cocoa".
Поскольку цепочка ответчиков именно то, что мне нужно, я придумал такое решение:
// some event happened in my view that
// I want to turn into a custom event and pass it "up":
UIResponder *responder = [self nextResponder];
while (responder) {
if ([responder conformsToProtocol:@protocol(ItemSelectedDelegate)]) {
[responder itemSelected:someItem];
break;
}
responder = [responder nextResponder];
}
Это прекрасно работает, но я чувствую, что должны быть другие способы справиться с этим. Прогулка по цепочке вручную таким образом не кажется очень приятной.
Обратите внимание, что уведомления не являются хорошим решением здесь, потому что я хочу, чтобы объекты в иерархии представлений были задействованы, а уведомления глобальны.
Какой лучший способ справиться с этим в iOS (и Cocoa, если на то пошло)?
ИЗМЕНИТЬ
Что я хочу достичь?
У меня есть контроллер представления, у которого есть представление, у которого есть subviews и т.д.... Несколько подзонов имеют определенный тип, который показывает элемент из базы данных. Когда пользователь отбирает это представление, на контроллер должен быть отправлен сигнал, чтобы перейти к странице подробностей этого элемента.
Вид, управляющий краном, находится на нескольких уровнях ниже основного вида в иерархии представлений. Я должен сказать контроллеру (или, в некоторых случаях, конкретному подзону "вверх по цепочке" ), что элемент был выбран.
Прослушивание уведомлений было бы вариантом, но мне это не нравится, потому что выбор элемента не является глобальным событием. Он строго привязан к текущему контроллеру.