当前位置:  开发笔记 > 编程语言 > 正文

自定义选项卡栏上的"更多"菜单

如何解决《自定义选项卡栏上的"更多"菜单》经验,为你挑选了2个好方法。

我在我的应用程序上使用标签栏(UITabBarController),我希望自定义单击更多按钮时出现的表格的外观.我已经设定了如何通过设置更改更多屏幕上的导航栏的外观

self.moreNavigationController.navigationBar.barStyle

在UITabBarController的子类中,我已经设法通过修改来更改表的背景颜色

self.moreNavigationController.topViewController.view.backgroundColor

,但我无法弄清楚如何更改表格中出现的单元格中的字体颜色.我希望我能用

self.moreNavigationController.topViewController.view.visibleCells 

但这似乎总是空洞的.我试过在viewDidLoad,viewWillAppear和viewDidAppear中做这个没有成功.对象self.moreNavigationController.topViewController的类型为UIMoreListController,它似乎没有文档,我在界面中看不到任何可以帮助我的东西.

有任何想法吗?



1> Ian1971..:

继Stephan的建议替换moreNavigationController的dataSource之后,这里是我实现的代码的快速视图.

我创建了一个名为MoreTableViewDataSource的新类,它实现了UITableViewDataSource协议.更多页面实际用于构建表的控制器称为UIMoreListControllerModern,它实现了UITableViewDataSource协议的必需部分.我的实现看起来像这样.

-(MoreTableViewDataSource *) initWithDataSource:(id) dataSource
{
    self = [super init];
    if (self)
    {
            self.originalDataSource = dataSource;
    }

    return self;
}

- (void)dealloc
{
    self.originalDataSource = nil;
    [super dealloc];
}

- (NSInteger)tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section
{
    return [originalDataSource tableView:table numberOfRowsInSection:section];
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [originalDataSource tableView:tableView cellForRowAtIndexPath:indexPath];
    cell.textColor = [UIColor whiteColor];
    return cell;
}

然后在我的CustomTabBarController类中,我重写viewDidLoad,如下所示:

- (void)viewDidLoad {

    [super viewDidLoad];

    UINavigationController *moreController = self.moreNavigationController;
    moreController.navigationBar.barStyle = UIBarStyleBlackOpaque;

    if ([moreController.topViewController.view isKindOfClass:[UITableView class]])
    {

        UITableView *view = (UITableView *)moreController.topViewController.view;
        view.backgroundColor = [UIColor blackColor];
        moreTableViewDataSource = [[MoreTableViewDataSource alloc] initWithDataSource:view.dataSource];
        view.dataSource = moreTableViewDataSource;

    }
}

这里要求的是头文件

@interface MoreTableViewDataSource : NSObject 
{
    id originalDataSource;
}

@property (retain) id originalDataSource;

-(MoreTableViewDataSource *) initWithDataSource:(id) dataSource;

@end

#import "MoreTableViewDataSource.h"

@interface CustomTabBarController : UITabBarController 
{
    MoreTableViewDataSource *moreTableViewDataSource;
}


这看起来是一个很好的解决方案,但似乎滚动你自己的更多选项卡可能也是如此,并给你更多的直接控制.创建一个MoreViewController,使其成为最后一个选项卡(最多5个),将TableView拖放到nib中,创建一个映射到ViewControllers的数组并处理didSelectRowAtIndexPath.这为您提供了自己的MoreViewController,您可以像任何其他ViewController一样自定义.

2> Stephan Burl..:

只有在显示moreNavigationController后才会填充visibleCells.

并且单元格是在运行时创建的,因此即使您更改单元格的内容,它们也会在显示时被替换.

要尝试的一件事是替换moreNavigationController tableView的数据源,调用原始数据源的cellForRowAtIndexPath并在返回之前更改其内容.

使用下面的代码,在显示一次moreNavigationController来初始化之后,你会看到当你返回到moreNavigationController时,单元格是红色的,但是立即返回到白色背景.

UITableView *view = (UITableView *)self.tabBarController.moreNavigationController.topViewController.view;
if ([[view subviews] count]) {
  for (UITableViewCell *cell in [view visibleCells]) {
    cell.backgroundColor = [UIColor redColor];
  }
}

推荐阅读
手机用户2502852037
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有