25

私のアプリケーション(タブバーアプリケーションのXCodeテンプレートに基づく)では、UITabBarControllerを使用して、ユーザーがアクセスできるアプリケーションのさまざまなセクションのリストを表示します。

デフォルトでは、5つを超えるアイテムがある場合、UITabBarControllerはタブバーに[その他]ボタンを表示します。また、ユーザーはタブバーに表示したいアイテムを選択できます。

現在、タブバーコントローラーの状態の保存と読み込みを実装できないため、[編集]ボタンを無効にします。

UITabBarControllerの[その他]ナビゲーションコントローラーに表示される[編集]バーボタンを無効/非表示にする方法はありますか?

私は試した:

tabBarController.moreNavigationController.navigationBar.topItem.rightBarButtonItem = nil;

tabBarController.moreNavigationController.navigationBar.topItem.rightBarButtonItem.enabled = NO;

しかし、それらは機能していないようです。

4

16 に答える 16

59

moreNavigationController(これは UINavigationController です)のデリゲートになり、これを追加します。

- (void)navigationController:(UINavigationController *)navigationController
        willShowViewController:(UIViewController *)viewController
        animated:(BOOL)animated {

    UINavigationBar *morenavbar = navigationController.navigationBar;
    UINavigationItem *morenavitem = morenavbar.topItem;
    /* We don't need Edit button in More screen. */
    morenavitem.rightBarButtonItem = nil;
}

これで表示されなくなりました。考慮すべき重要な点は、コントローラーの作成後ではなく、ビューを表示する前に [編集] ボタンが表示されることです。その瞬間まで黙って座って、コントローラーが画面を表示しようとしているときにボタンをノックアウトして、再び作成する機会はありません。:)

于 2009-09-30T17:34:33.850 に答える
55

customizableViewControllers配列です。すべての編集を無効にするには、空の配列に設定します。

tabBarController.customizableViewControllers = [NSArray arrayWithObjects:nil];
于 2009-07-29T02:27:30.117 に答える
12
tabBarController .customizableViewControllers = nil;
于 2009-05-05T14:22:43.953 に答える
6

私は試しましたが、ここに例があります。

AppDelegate.m 内

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    // Override point for customization after application launch.

    // Add the tab bar controller's view to the window and display.
    [self.window addSubview:tabBarController.view];
    [self.window makeKeyAndVisible];

    //setting delegate to disable edit button in more.
    tabBarController.moreNavigationController.delegate = self;

    return YES;
}

「編集」ボタンを削除するには

    - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
        UINavigationBar *morenavbar = navigationController.navigationBar;
        UINavigationItem *morenavitem = morenavbar.topItem;
        /* We don't need Edit button in More screen. */
morenavitem.rightBarButtonItem = nil;
}

AppDelegate.h で

@interface TestAppDelegate : NSObject <UIApplicationDelegate, UITabBarControllerDelegate, UINavigationControllerDelegate>

私が間違っている場合は修正してください。

于 2011-03-28T09:20:49.157 に答える
4

次のコードでこれを機能させることができました。CustomTabViewControllerこのカスタムクラスを使用するために、InterfaceBuilderでTabBarControllerのクラスIDを作成してから変更しました。使用するコードは次のとおりです(.hおよび.mファイルの内容)。重要なのは、プロパティをnilに設定することです。これにより、[編集]ボタンが表示されなくなります。詳細については 、 http: //developer.apple.com/library/ios/documentation/uikit/reference/UITabBarController_Class/Reference/Reference.html#//apple_ref/occ/instp/UITabBarController/customizableViewControllersを参照してください。このプロパティの値はnilであり、タブバーではアイテムを再配置できません。」

#import <UIKit/UIKit.h>

@interface CustomTabBarController : UITabBarController {

}
@end

#import "CustomTabBarController.h"


@implementation CustomTabBarController

- (void)viewDidLoad
{
    self.customizableViewControllers = nil;
    [super viewDidLoad];
}   

@end
于 2010-10-03T23:31:34.843 に答える
3

ライフ サイクル メソッドにコード行を追加するだけです。つまり、アプリケーションの起動が完了しました。

- (void)applicationDidFinishLaunching:(UIApplication *)application
{ 
    tabBarController.customizableViewControllers=nil;

}
于 2012-03-21T06:11:39.910 に答える
3

これはこのように達成できます。これは最も洗練されたソリューションではありませんが、It Works™ です。

// Optional UITabBarControllerDelegate method
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
    [self performSelector:@selector(removeEdit) withObject:nil afterDelay:.0001];
}
- (void)removeEdit
{
    tabBarController.moreNavigationController.navigationBar.topItem.rightBarButtonItem = nil;   
}
于 2009-11-09T01:07:19.543 に答える
3

iOS4についてはわかりませんが、コードをviewDidLoadvsに入れるかどうかは重要ですviewWillAppear

つまり、これは機能します。

- (void)viewWillAppear:(BOOL)animated
{
self.customizableViewControllers = nil;
}
于 2010-07-22T16:32:45.050 に答える
3

コードが機能しない @m4rkk & @lan terrell。

入手できなかったので、ナビゲーションバーを完全に無効にしました。

tabBarController.moreNavigationController.navigationBar.hidden = YES;
于 2009-08-12T06:25:12.553 に答える
2

NavigationController を最初の ViewController として使用し、ボタンの 1 つを押して UITabBarController に入るとします。次に、以下のコードを追加する以外に、

- (void)navigationController:(UINavigationController *)navigationController
        willShowViewController:(UIViewController *)viewController
        animated:(BOOL)animated 
{
    UINavigationBar *morenavbar = navigationController.navigationBar;
    UINavigationItem *morenavitem = morenavbar.topItem;
    /* We don't need Edit button in More screen. */
    morenavitem.rightBarButtonItem = nil;
}

5番目以降のViewControllerを最初にクリックしたときに編集ボタンが表示されないようにするには、この「ifステートメント」を追加する必要があります。

if (self.selectedIndex >= 4) 
{
    self.customizableViewControllers = nil;
}
于 2013-03-21T07:02:12.653 に答える
1

Aleks Nの答えはうまくいきますが、少し修正したいと思います

- (void)navigationController:(UINavigationController *)navigationController
      willShowViewController:(UIViewController *)viewController
                    animated:(BOOL)animated
{
    if (navigationController.viewControllers.count == 1)
    {
        UINavigationBar *morenavbar = navigationController.navigationBar;
        UINavigationItem *morenavitem = morenavbar.topItem;
        /* We don't need Edit button in More screen. */
        morenavitem.rightBarButtonItem = nil;
    }
}

このデリゲートメソッドは、ビューコントローラがこのビュースタックでプッシュまたはポップされるたびに呼び出されるためです。この「その他」のビューコントローラに他のビューをプッシュする場合、これは実行したくありません。

于 2012-07-07T00:49:24.253 に答える
1

これは遅い追加ですが、役立つ貢献だと思います。Aleks Nの答えは、「More Tab」の下のすべてのView ControllerでrightBarButtonItemが削除される状況を作り出す可能性があります(Bao Leiが述べたように)。Bao Lei のコードを使用することをお勧めしますが、didShowViewControllerデリゲート メソッドを実装するという違いがあります。

彼のコードが現在存在しているため、ユーザーが [その他] タブをタップしてベースのUIMoreViewControllerテーブルに戻ると、他の viewController に属する rightBarButtonItem が nil に設定される可能性があります。

- (void)navigationController:(UINavigationController *)navigationController
       didShowViewController:(UIViewController *)viewController
                    animated:(BOOL)animated
{
    if (navigationController.viewControllers.count == 1)
    {
        UINavigationBar *morenavbar = navigationController.navigationBar;
        UINavigationItem *morenavitem = morenavbar.topItem;
        /* We don't need Edit button in More screen. */
        morenavitem.rightBarButtonItem = nil;
    }
}

違いは小さいですが、このバグを見つけるのにかなりの時間がかかりました。

于 2015-09-21T17:30:19.277 に答える
1

4.0 以上の Xcode を使用している場合 (私は Snow Leopard 用の Xcode 4.2 に取り組んでいます):

最初に、最後にビューの配列をどこで変更したかを確認してください。customizableView-Array を nil に設定する方法は問題ではないと思います。りんごの説明は次のとおりです。

重要: タブ バー インターフェイスでビュー コントローラーを追加または削除すると、カスタマイズ可能なビュー コントローラーの配列も既定値にリセットされ、すべてのビュー コントローラーを再度カスタマイズできるようになります。したがって、viewControllers プロパティを (直接または setViewControllers:animated: メソッドを呼び出して) 変更し、カスタマイズ可能なビュー コントローラーを制限したい場合は、customizableViewControllers プロパティのオブジェクトの配列も更新する必要があります。

うまくいきましたので、ぜひお試しください。ここでこの説明を見つけました:「タブのカスタマイズの防止」の章のdeveloper.apple.comの説明へのリンク。

于 2012-08-16T06:10:37.480 に答える
1

iPhone 6 Plus では、ポートレート モードよりもランドスケープ モードの方が、タブ バーでより多くのボタンを使用できます。残念ながら、これは、デバイスが回転するたびに customizableViewControllers 配列がリセットされることを意味し、ここでの回答はどれもうまくいきませんでした。

私はすでに独自の UITabBarController サブクラスを持っており、customizableViewControllers のセッター メソッドとゲッター メソッドをオーバーライドすることが、[詳細] 画面から [編集] ボタンを削除する唯一の確実な方法でした。

- (NSArray *)customizableViewControllers
{
    return nil;
}

- (void)setCustomizableViewControllers:(NSArray*)controllers
{
    //do nothing
}
于 2015-11-19T21:21:00.860 に答える