Мы работаем над проектом с использованием некоторых пользовательских представлений. У нас есть следующая иерархия:
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 (пользовательский подкласс)
Это приводит меня к двум вопросам.
- Как мы ссылаемся на UIViewController из нашего подпредставления, которое принадлежит свойству view контроллера?
- Является ли этот метод запутанным. Есть лучший способ сделать это? Должны ли мы назначать UIViewController в качестве делегата нашего пользовательского подкласса UIScrollView?