2

我已经构建了一个具有大约 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 是适合它的地方吗?

4

1 回答 1

3

请注意,我在下面的原始答案需要让标签栏控制器创建一个标签栏按钮,该按钮由标签栏控制器中包含的所有控制器的所有导航栏使用,仅当您创建一个简单的UIBarButtonItem. 更好的(如果您使用UIBarButtonItem带有图像等的自定义项,则至关重要)是创建一个具有您想要的行为的新栏按钮项子类,然后将其添加到所有控制器的导航栏。我对您在 Custom rightBarButtonItem 的后续问题的回答 消失了一个示例实现。

出于历史目的,我将在下面保留我的原始答案。


就个人而言,我不认为应用程序委托是正确的地方(尽管在实践中,这可能无关紧要)。我个人会将其子类化并将其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
于 2012-11-17T06:53:09.723 回答