如何将rightBarButtonItem传递给TabBarController中的所有ViewControllers?

时间:2012-11-17 02:19:49

标签: ios uinavigationcontroller uitabbarcontroller appdelegate rightbarbuttonitem

我构建了一个大约有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是否适合它?

1 个答案:

答案 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