我构建了一个大约有12个视图的应用。在NavigationBar的右上角应该有UIBarButton,它具有与整个应用程序完全相同的功能。它显示一个带有徽章的自定义按钮。
我通过TableViewControllers传递rightBarButtonItem并且它运行良好。但是当我点击TabBar时,自定义按钮有时会消失。可能我的解决方案很糟糕。我试图从AppDelegate设置自定义按钮,但我无法弄清楚如何在与TabBar相关的每个ViewController上达到rightBarButtonItem。
我尝试过类似的东西,但它在日志中总是显示为nil。
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
{
NSLog(@"item %@", self.tabController.selectedViewController.navigationItem.rightBarButtonItem);
NSLog(@"item %@", self.tabController.selectedViewController.navigationItem.rightBarButtonItems);
NSLog(@"item %@", self.tabController.selectedViewController.navigationController.navigationItem.rightBarButtonItems);
//self.tabController.selectedViewController.navigationItem.rightBarButtonItem =
[self switchTabBarImage:self.tabController.selectedIndex];
}
实现类似“全局”rightBarButtonItem的最佳方法是什么? AppDelegate是否适合它?
答案 0 :(得分:3)
请注意,我在下面的原始答案中,需要让标签栏控制器创建一个标签栏按钮,所有导航栏用于标签栏控制器中包含的所有控制器,只有在您创建时才有效一个简单的UIBarButtonItem
。更好(并且如果您使用带有图像等的自定义UIBarButtonItem
,则是关键的)是创建一个具有所需行为的新的条形按钮项子类,然后将其添加到所有控制器的导航中酒吧。我在Custom rightBarButtonItem disappearing处回答您的后续问题,以获得示例实施。
为了历史目的,我会在下面保留原来的答案。
就个人而言,我不认为应用代表是正确的地方(虽然在实践中,它可能无关紧要)。我个人会将UITabBarController
子类化并放在那里,然后让子视图从那里抓取它。例如,子类UITabBarController
的接口可能如下所示:
// MyTabBarController.h
@interface MyTabBarController : UITabBarController
@property (nonatomic, strong) UIBarButtonItem *sharedRightButton;
@end
使用创建按钮的实现(并且具有在按下该按钮时调用的方法):
// MyTabBarController.m
@implementation MyTabBarController
- (void)viewDidLoad
{
[super viewDidLoad];
// you'll do your own, fancy button instead of this simple bordered button
self.sharedRightButton = [[UIBarButtonItem alloc] initWithTitle:@"Test"
style:UIBarButtonItemStyleBordered
target:self
action:@selector(clickedTest:)];
}
// you'll have your own action method here
- (void)clickedTest:(id)sender
{
NSLog(@"%s", __FUNCTION__);
}
@end
最后,标签栏控制器显示的每个视图控制器都可以执行以下操作:
@implementation FirstTabViewController
- (void)viewDidLoad
{
[super viewDidLoad];
MyTabBarController *tabBarController = (MyTabBarController *)self.tabBarController;
self.navigationItem.rightBarButtonItem = tabBarController.sharedRightButton;
}
@end