如何将 rightBarButtonItem 传递给 TabBarController 中的所有 ViewController?
Posted
技术标签:
【中文标题】如何将 rightBarButtonItem 传递给 TabBarController 中的所有 ViewController?【英文标题】:How to pass rightBarButtonItem to all ViewControllers in TabBarController? 【发布时间】:2012-11-17 02:19:48 【问题描述】:我已经构建了一个有大约 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 是否适合它?
【问题讨论】:
查看此链接***.com/questions/8388566/… 感谢您的提示!我想知道我是怎么错过的。 【参考方案1】:注意,我在下面的原始答案,这需要让标签栏控制器创建一个标签栏按钮,该按钮由标签栏控制器中包含的所有控制器的所有导航栏使用,只有在您创建时才有效一个简单的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
【讨论】:
我只是看到它不能与我的 TabBar 一起使用。当第二次显示一个 ViewController 时,自定义 rightButtonBarItem 消失。点击所有点击后,只有最后一个会显示 rightButtonBarItem。有什么想法吗? 你知道如何使用这样的自定义按钮:self.sharedRightButton = [[UIBarButtonItem alloc] initWithCustomView:btn]; ? 它似乎比我想象的要复杂得多。我已经删除了 AppDelegate 中的行并将 TabBarController 子类化了。它适用于标准按钮,但不适用于自定义按钮。自定义按钮仅在第一次显示视图控制器时出现。我会按照您的建议更改我的代码。谢谢!以上是关于如何将 rightBarButtonItem 传递给 TabBarController 中的所有 ViewController?的主要内容,如果未能解决你的问题,请参考以下文章
无法将 rightBarButtonItem 添加到 UIViewController
关闭模式视图控制器后如何正确对齐 rightBarButtonItem?