2

私は約12ビューのアプリを構築しました。NavigationBar の右上には、アプリ全体でまったく同じ機能を持つ UIBarButton が必要です。バッジが付いたカスタム ボタンが表示されます。

私はrightBarButtonItemをTableViewControllersに渡し、それはうまく機能します。しかし、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) は、必要な動作を持つ新しいバー ボタン項目サブクラスを作成し、それをすべてのコントローラーのナビゲーション バーに追加することです。実装例のカスタム 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 に答える