UITabBarControllerの詳細セクションに表示される編集ボタンを無効にする方法は?
-
05-07-2019 - |
質問
(Tab barアプリケーションのXCodeテンプレートに基づく)アプリケーションでは、UITabBarControllerを使用して、ユーザーがアクセスできるアプリケーションのさまざまなセクションのリストを表示します。
デフォルトでは、UITabBarControllerは、5つを超えるアイテムがある場合、タブバーに「その他」ボタンを表示します。また、ユーザーはタブバーに表示するアイテムを選択できます。
現在、Tab Bar Controllerの状態の保存とロードを実装できないため、「編集」ボタンを無効にします。
UITabBarControllerの「その他」ナビゲーションコントローラーに表示される「編集」バーボタンを無効/非表示にする方法はありますか?
試しました:
tabBarController.moreNavigationController.navigationBar.topItem.rightBarButtonItem = nil;
and
tabBarController.moreNavigationController.navigationBar.topItem.rightBarButtonItem.enabled = NO;
しかし、機能していないようです。
解決
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;
}
今は表示されません。重要なことは、コントローラーの作成後ではなく、ビューを表示する前に[編集]ボタンが表示されることです。その瞬間まで静かに座ってから、コントローラーが画面を表示するときにボタンをノックアウトします。再び作成する機会はありません。 :)
他のヒント
customizableViewControllers
は配列です。すべての編集を無効にするには、空の配列に設定します。
tabBarController.customizableViewControllers = [NSArray arrayWithObjects:nil];
tabBarController .customizableViewControllers = nil;
私は試しましたが、ここに例があります。
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>
間違っている場合は修正してください。
次のコードでこれを機能させることができました。 CustomTabViewController
を作成し、Interface BuilderでTab Bar ControllerのClass Identityを変更して、このカスタムクラスを使用しました。使用するコードは次のとおりです(.hおよび.mファイルの内容)。重要なのは、プロパティをnilに設定することです。これにより、[編集]ボタンが表示されなくなります。詳細については、 http://developer.apple.com/library/ios/documentation/uikit/reference/UITabBarController_Class/Reference/Reference.html#//apple_ref/occ/instp/UITabBarController/customizableViewControllers
&quot;配列が空の場合、またはこのプロパティの値がnilの場合、タブバーはアイテムの再配置を許可しません。
#import <UIKit/UIKit.h>
@interface CustomTabBarController : UITabBarController {
}
@end
#import "CustomTabBarController.h"
@implementation CustomTabBarController
- (void)viewDidLoad
{
self.customizableViewControllers = nil;
[super viewDidLoad];
}
@end
これは次のように実現できます。最もエレガントなソリューションではありませんが、機能します&#8482;。
// 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;
}
ライフサイクルメソッドにコードを1行追加するだけです。つまり、アプリケーションの起動が完了しました。
- (void)applicationDidFinishLaunching:(UIApplication *)application
{
tabBarController.customizableViewControllers=nil;
}
@ m4rkk&amp; @lan terrellそのコードは動作しません。
取得できなかったため、ナビゲーションバーを完全に無効にしました。
tabBarController.moreNavigationController.navigationBar.hidden = YES;
iOS4については知りませんが、 viewDidLoad
と viewWillAppear
にコードを配置するかどうかは重要です。
つまり、これは機能します。
- (void)viewWillAppear:(BOOL)animated
{
self.customizableViewControllers = nil;
}
NavigationControllerを最初のViewControllerとして使用し、いずれかのボタンを押して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;
}
この&quot; ifステートメント&quot;を追加する必要があります5番目以上のViewControllersを最初にクリックしたときに編集ボタンが表示されないようにします。
if (self.selectedIndex >= 4)
{
self.customizableViewControllers = nil;
}
4.0を超えるXcodeを使用している場合(Snow LeopardのXcode 4.2を使用しています):
最初に、最後にビューの配列をどこで変更するかを確認します。どのメソッドでcustomizableView-Arrayをnilに設定してもかまいません。リンゴの説明によると:
重要:Tab BarインターフェイスでView Controllerを追加または削除すると、カスタマイズ可能なView Controllerの配列がデフォルト値にリセットされ、すべてのView Controllerを再度カスタマイズできるようになります。したがって、viewControllersプロパティを(直接またはsetViewControllers:animated:メソッドを呼び出して)変更し、さらにカスタマイズ可能なView Controllerを制限する場合は、customizableViewControllersプロパティのオブジェクトの配列も更新する必要があります。
それは私のために働いたので、試してみてください。 ここでこの説明を見つけました:説明へのリンクdeveloper.apple.com の「タブのカスタマイズの防止」の章で。
iPhone 6 Plusでは、ポートレートよりもランドスケープモードでより多くのボタンをタブバーに使用できます。残念ながら、これはデバイスが回転するたびにcustomizableViewControllers配列をリセットすることを意味し、ここでの答えはどれも私にとってはうまくいきませんでした。
すでに独自のUITabBarControllerサブクラスがあり、customizableViewControllersのsetterおよびgetterメソッドをオーバーライドすることが、[その他]画面から[編集]ボタンを削除する唯一の信頼できる方法でした:
- (NSArray *)customizableViewControllers
{
return nil;
}
- (void)setCustomizableViewControllers:(NSArray*)controllers
{
//do nothing
}
これは遅れて追加されますが、有益な貢献だと思います。 Aleks Nの答えは、「More Tab」の下にあるすべてのView Controllerで rightBarButtonItem が削除される状況を作成できます。 (バオレイが述べたように)。 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;
}
}
違いは小さいですが、このバグを見つけるのにかなりの時間がかかりました。
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;
}
}
このデリゲートメソッドは、View ControllerがこのView Stackでプッシュまたはポップされるたびに呼び出されるためです。この「その他」に他のビューをプッシュしているときView Controller、これを行いたくない。
私のために働いた唯一のソリューション
self.moreNavigationController.navigationBar.topItem?.rightBarButtonItem?.title = ""
self.moreNavigationController.navigationBar.topItem?.rightBarButtonItem?.isEnabled = false
これらのソリューションのほとんどを試してみましたが、デバイスを回転させると編集ボタンが戻るという問題が発生していました。回転がリセットされて最初のView Controllerに戻り、さらにView Controllerに戻ると、編集ボタンがそこにありました。最良の解決策は、 UITabBarControllerDelegate
になり、より多くのView Controllerが選択されたView Controllerになったときはいつでも右バーボタンをnilに設定することでした。これはiOS 11-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
}
}
}