web-dev-qa-db-ja.com

UITabBarControllerのmoreセクションに表示される編集ボタンを無効にするにはどうすればよいですか?

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

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

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

UITabBarControllerの「More」ナビゲーションコントローラーに表示される「Edit」バーボタンを無効/非表示にする方法はありますか?

私は試した:

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

そして

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

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

25

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;
}

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

59
Aleks N.

customizableViewControllersは配列です。空の配列に設定すると、すべての編集が無効になります。

tabBarController.customizableViewControllers = [NSArray arrayWithObjects:nil];
53
Ian Terrell
tabBarController .customizableViewControllers = nil;
12
m4rkk

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

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>

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

6
Jian Yu

私はこれを次のコードで動作させることができました。 CustomTabViewControllerを作成し、InterfaceBuilderでタブバーコントローラーのクラス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
4
Andre Oporto

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

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

}
3

IOS4についてはわかりませんが、コードをviewDidLoadviewWillAppearのどちらに配置するかは重要です。

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

- (void)viewWillAppear:(BOOL)animated
{
self.customizableViewControllers = nil;
}
3
Rob

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

// 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;   
}
3
Logan Cautrell

@ m4rkk&@ lanterrellそのコードは機能しません。

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

tabBarController.moreNavigationController.navigationBar.hidden = YES;
3
odyth

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;
}
2
Lee

4.0より大きいXcodeで作業しているもの(私はSnowLeopard用のXcode4.2で作業しています):

最初に、最後にビューの配列をどこで変更するかを確認します。 customizableView-Arrayをどのメソッドでnilに設定してもかまいません。リンゴの説明によると:

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

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

1
rubybeginner

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

私はすでに独自のUITabBarControllerサブクラスを持っていて、customizableViewControllersのsetterメソッドとgetterメソッドをオーバーライドすることが、[その他]画面から[編集]ボタンを削除する唯一の信頼できる方法でした。

- (NSArray *)customizableViewControllers
{
    return nil;
}

- (void)setCustomizableViewControllers:(NSArray*)controllers
{
    //do nothing
}
1
Anthony F

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

彼のコードは現在存在しているため、ユーザーが[その他]タブをタップしてベースに戻るIMoreViewControllerテーブルを使用すると、他のviewControllerに属するrightBarButtonItem'sが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;
    }
}

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

1
Cornell Skyers

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;
    }
}

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

1
Bao Lei

私のために働いた唯一の解決策

self.moreNavigationController.navigationBar.topItem?.rightBarButtonItem?.title = ""
self.moreNavigationController.navigationBar.topItem?.rightBarButtonItem?.isEnabled = false
0

私はこれらの解決策のほとんどを試しましたが、デバイスを回転させたときに編集ボタンが戻るという問題が発生していました。回転は最初のViewControllerにリセットされ、さらにView Controllerに戻ると、編集ボタンがありました。最善の解決策は、UITabBarControllerDelegateになり、より多くのビューコントローラーが選択されたビューコントローラーになるたびに、右のバーボタンをnilに設定することでした。これはiOS11-12で機能します。

final class DashboardController: UITabBarController {

    override func viewDidLoad() {
        super.viewDidLoad()

        delegate = self
    }
}

extension DashboardController: UITabBarControllerDelegate {
    func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
        if viewController == moreNavigationController {
            moreNavigationController.navigationBar.topItem?.rightBarButtonItem = nil
        }
    }
}
0
Chris