Я не был удовлетворен ответами на этот вопрос, поэтому я разместил свой собственный: Ссылка на контроллер представления источника и контроллер представления назначения одновременно
В ответе я исправил свою проблему. Это может сработать и у вас (хотя этот вопрос довольно старый, я подумал, что это может помочь кому-то вроде меня, который полдюжины раз читал этот пост в поисках подсказки).
Вот что я сделал. Я не знаю, являются ли протоколы маркеров идиоматическими объектами-c или нет, но я сравниваю их с атрибутами, которые я использовал бы в c #, поэтому у меня есть этот протокол маркеров:
@protocol HidesNavigationItem
@end
Я добавил UINavigationControllerDelegate в свой AppDelegate. Я еще не уверен, хорошо это или нет. Я думал о том, чтобы сохранить эту реализацию в другом объекте, но сейчас это то, где я ее поместил. Вот реализация:
#pragma mark Navigation Controller Delegate
-(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
[navigationController setNavigationBarHidden:[viewController conformsToProtocol:@protocol(HidesNavigationItem)] animated:animated];
}
Таким образом, я могу просто установить свой маркерный протокол в моей реализации UIViewController следующим образом:
@interface MyViewController : UIViewController <HidesNavigationItem>
Если у меня нет этого интерфейса, он возвращает его обратно.
Наконец, в приложении appDelegate: didFinishLaunchingWithOptions: метод, я подключаю делегат так:
if ([self.window.rootViewController isMemberOfClass:[UINavigationController class]])
((UINavigationController*)self.window.rootViewController).delegate = self;
Теперь у меня нет черных ящиков и Чеширского кота. Мое решение, конечно, касалось панели навигации, но я уверен, что она работает так же и для панели инструментов. Это очень похоже на ответ Данры, за исключением того, что я получаю черный ящик без «animated: animated».