我对这个问题的答案不满意,所以我发布了自己的:同时引用源视图控制器和目标视图控制器
我得到的答案解决了我的问题。它也可能对您有用(尽管这个问题已经很老了,但我认为这可能会帮助像我这样阅读这篇文章六次寻找提示的人)。
这就是我所做的。我不知道标记协议是否是惯用的objective-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 的 application:didFinishLaunchingWithOptions: 方法中,我像这样连接代理:
if ([self.window.rootViewController isMemberOfClass:[UINavigationController class]])
((UINavigationController*)self.window.rootViewController).delegate = self;
现在我没有黑匣子,也没有柴郡猫。我的解决方案当然是关于导航栏,但我确信它对工具栏同样适用。这与 Danra 的回答非常相似,只是我得到了没有“动画:动画”的黑匣子。