25

在我的应用程序(基于 Tab bar 应用程序 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;
}

现在不会出现了。需要考虑的关键是 Edit 按钮不是在控制器创建之后出现,而是在显示视图之前出现,我们应该静坐直到那一刻,然后,当控制器要显示屏幕时,我们会敲掉按钮,这样它没有机会再次创建它。:)

于 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

我能够使用以下代码来完成这项工作。我在 Interface Builder 中创建了一个CustomTabViewController然后修改了我的选项卡栏控制器的类标识以使用这个自定义类。这是它使用的代码(.h 和 .m 文件内容)。关键是将属性设置为 nil,这会导致 Edit 按钮不显示。有关详细信息,请参阅: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

@m4rkk 和 @lan terrell 代码不起作用。

我无法得到它,所以我完全禁用了导航栏。

tabBarController.moreNavigationController.navigationBar.hidden = YES;
于 2009-08-12T06:25:12.553 回答
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

只需在生命周期方法中添加一行代码,即应用程序确实完成了启动:

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

}
于 2012-03-21T06:11:39.910 回答
2

如果您使用 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;
}

您需要添加此“if 语句”以避免在第一次单击第 5 个 ViewController 及以上时显示编辑按钮。

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

在使用大于 4.0 的 Xcode 的那些(我正在为 Snow Leopard 开发 Xcode 4.2):

首先检查最后一次更改视图数组的位置。我认为您将可定制的View-Array 设置为nil 的方法并不重要。苹果描述说:

重要提示:在标签栏界面中添加或删除视图控制器也会将可自定义的视图控制器数组重置为默认值,从而允许再次自定义所有视图控制器。因此,如果您对 viewControllers 属性进行了修改(直接或通过调用 setViewControllers:animated: 方法)并且仍想限制可自定义的视图控制器,则还必须更新可自定义的ViewControllers 属性中的对象数组。

它对我有用,所以请尝试一下。我在这里找到了这个描述:链接到 developer.apple.com上“防止标签的自定义”一章的描述。

于 2012-08-16T06:10:37.480 回答
1

这是一个较晚的添加,但我认为这是一个有用的贡献。Aleks N 的回答可能会造成一种情况,即为“更多选项卡”下的每个视图控制器删除rightBarButtonItem (正如鲍磊所说)。我想推荐使用Bao Lei的代码,但不同的是实现它的didShowViewController委托方法。

由于他的代码现在存在,用户点击“更多”选项卡返回到基本UIMoreViewController表可能会导致rightBarButtonItem属于其他 viewControllers 设置为零。

- (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

iPhone 6 Plus 在横向模式下允许标签栏上的按钮多于纵向模式。不幸的是,这意味着每当设备旋转时它都会重置可定制的ViewControllers 数组,并且这里的答案都没有对我有用。

我已经有了自己的 UITabBarController 子类,重写可定制视图控制器的 setter 和 getter 方法是从“更多”屏幕中删除“编辑”按钮的唯一可靠方法:

- (NSArray *)customizableViewControllers
{
    return nil;
}

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

唯一对我有用的解决方案

self.moreNavigationController.navigationBar.topItem?.rightBarButtonItem?.title = ""
self.moreNavigationController.navigationBar.topItem?.rightBarButtonItem?.isEnabled = false
于 2017-10-20T18:02:04.857 回答
0

我尝试了大多数这些解决方案,但遇到了旋转设备时编辑按钮会返回的问题。旋转将重置回第一个视图控制器,然后当我返回更多视图控制器时,编辑按钮就在那里。最好的解决方案是UITabBarControllerDelegate当更多的视图控制器成为选定的视图控制器时,将右栏按钮设置为 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
        }
    }
}
于 2018-10-01T04:03:19.997 回答