4

我很惊讶没有“更多”被问到这个:-)

我的应用程序是具有多个部分的标准选项卡栏控制器。每个部分(选项卡)包含一个导航控制器,该控制器控制几个视图控制器(您的基本表视图 + 详细视图类型的设置)。现在我已经添加了第 6 个选项卡,iOS 创建了默认的“更多”选项卡来控制最后两个选项卡。我需要消除导航栏中间的“更多”文本(注意:不是按钮文本,也不是选项卡本身的标题),并将自定义背景图像应用于导航栏。

注意:这个问题是关于自定义“更多”导航栏的——我已经成功修改了所有非 iOS 创建的导航栏上的背景图片和 titleView 文本。

在我的应用程序委托中,应用程序是这样组合在一起的:

创建视图控制器:

ViewController1 *vc1 = [ViewController1 alloc] initWithNibName@"View1" bundle:nil];
vc1.title = @"VC1";
vc1.tabBarImage.image = [UIImage imageNamed:@"image1.png"];

对视图控制器 vc2 到 vc6 再重复上述例程 5 次。

创建单独的导航控制器:

UINavigationController *nc1 = [UINavigationController alloc] initWithRootViewController:vc1];

对导航控制器 nc2 - nc6 再重复 5 次。

将导航控制器添加到选项卡栏控制器

self.tabBarController.viewControllers = [NSArray arrayWithObjects: vc1, vc2, vc3, vc4, vc5, vc6, nil];

上面的所有代码都能完美运行。没有问题。

然后,我将自定义背景图像添加到更多导航控制器:

    if (self.tabBarController.moreNavigationController){
        if ([self.tabBarController.moreNavigationController.navigationBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)] ) {
            UIImage *image = [UIImage imageNamed:@"navlogo.png"];
            [self.tabBarController.moreNavigationController.navigationBar setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];
        } else {
            UINavigationBar *navbar = self.tabBarController.moreNavigationController.navigationBar;
            UIImage *headerImg = [UIImage imageNamed:@"navlogo.png"];
            [navbar setBackgroundImage:headerImg forBarMetrics:UIBarMetricsDefault];
        }       
    }

这也很好用。没有问题

由于我的自定义背景包含客户端的徽标死点,因此我需要删除默认情况下显示为“更多”的 titleView 的文本。注意,我说的不是导航按钮的文字,而是导航栏中间的标签。

从逻辑上讲,人们会假设这会起作用:

    UILabel *label = [[UILabel alloc] init];
    label.text = @"";
    self.tabBarController.moreNavigationController.navigationItem.titleView = label;

...因为我在所有单独的视图控制器中都这样做,用 self.navigationItem.titleView 代替 self.tabBarController.moreNavigationController 等。

但这不起作用!我可以使用完全相同的代码成功更改所有导航控制器上的背景图像和 titleView 文本(再次,用 self.navigationController.navigationItem 替换 moreNavController 的东西......)。但是,在应用程序委托中,我只能设置背景图像,而不能设置更多导航控制器的标题视图。

任何解决方案将不胜感激。

VB

4

6 回答 6

1

事实证明,我的原始代码是正确的,只是在错误的地方。

UILabel *label = [[UILabel alloc] init];
label.text = @"";
self.tabBarController.moreNavigationController.navigationBar.topItem.titleView = label;

但是,在将 tabBarController 添加为我的 rootViewController之前,我之前执行过此操作

正确的顺序是:

self.window.rootViewController = self.tabBarController;

UILabel *label = [[UILabel alloc] init];
label.text = @"";
self.tabBarController.moreNavigationController.navigationBar.topItem.titleView = label;
于 2012-08-03T18:21:18.760 回答
1

发布 Swift5 版本,因为我花了很长时间才使其正常工作

moreNavigationController.viewControllers[0].tabBarItem = UITabBarItem(title: "My Title", image: UIImage(named: "MoreTab")!, tag: 1111)
moreNavigationController.navigationBar.topItem!.title = "My Title"

请注意,更改 moreNavigationController.tabBarItem 效果不佳。我在扩展 UITabBarController 的类的 viewDidLoad() 中执行此操作

于 2019-06-15T18:21:49.787 回答
0

例如,在标签控制器 iOS 模板的 application:didFinishLaunchingWithOptions: 中

// Override point for customization after application launch.

UITabBarController *tabBarController = (UITabBarController *)(self.window.rootViewController);
UINavigationController *moreNavigationController = tabBarController.moreNavigationController;
moreNavigationController.navigationBar.topItem.title = @"";

这将更改导航栏标题,但将选项卡标签标题保留为“更多”。

于 2012-08-03T02:35:19.993 回答
0

我找到了一个

斯威夫特 2.2

把它放在didFinishLaunchingWithOptions

tabBarCtr.moreNavigationController.delegate = self
tabBarController.moreNavigationController.viewControllers.first?.title = ""

实现这个委托方法

func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool)
    {
        navigationController.navigationBar.topItem?.rightBarButtonItems = nil
        navigationController.viewControllers.first?.title = ""

    }

这也将删除更多导航控制器导航栏顶部的编辑按钮。

于 2016-07-24T12:12:51.403 回答
-1

这可能不适用于线程上的每个人,但对我来说......我有一个超过 5 个项目的 tabBarController......我需要在自动生成的 moreNavigationController 上设置标题......就像指定 self.title 一样简单=@"title" 在目标detailviewcontroller的viewDidLoad方法中。

于 2014-06-30T18:57:01.650 回答
-3

您可以在 viewDidLoad 函数中更改标题

self.title = @""
于 2012-08-03T03:10:45.420 回答