如何在UITableView中正确添加工具栏?

24
我正在编写一个基于导航的 iPhone 应用程序,我想在屏幕底部设置一个 UIToolBar,并使一个 UITableView 在工具栏和导航栏之间滚动。
我已经看到一些论坛上建议处理这个视图的视图控制器应该是一个标准的 UIViewController 而不是 UITableViewController。除了实现所有标准的 UIViewController 方法之外,视图控制器还必须实现 UITableView 的委托和数据源方法。除了前面提到的协议之外,在这个视图控制器子类中需要重新创建哪些内置功能才能使其像 UITableViewController 一样运行?如果按照这种方式进行,是否会失去什么?
还是将UITableViewController嵌套在标准的UIViewController中更好一些呢?
5个回答

48

从OS 3.0开始,导航控制器内置了一个工具栏。要使其出现:

[self.navigationController setToolbarHidden:NO];

通过实现:

- (void)setToolbarItems:(NSArray *)toolbarItems animated:(BOOL)animated
在你的视图控制器中,你可以配置工具栏中的项。
因此,您不再需要担心工具栏在层次结构中的位置。
(更正了打字错误)

8
Corey Floyd大部分是正确的,但是...
[self.navigationController setToolBarHidden:NO];

应该是

[self.navigationController setToolbarHidden:NO];

换句话说,“setToolbarHidden”中的“b”必须小写。此外,在iPhone OS参考文献中列出的方法名称实际上是
- (void)setToolbarHidden:(BOOL)hidden animated:(BOOL)animated

虽然似乎不加 animated 参数也可以正常工作。

7
//Tool bar
[self.navigationController setToolbarHidden:NO];

UIBarButtonItem *buttonItem = [[ UIBarButtonItem alloc ] initWithTitle: @"Select All"
                                                style: UIBarButtonItemStyleBordered
                                               target: self
                                               action: @selector(selectAll:) ];
UIBarButtonItem *buttonNext = [[UIBarButtonItem alloc]initWithTitle:@"Next" style:UIBarButtonItemStyleBordered target:self action:@selector(goNext:)];
self.toolbarItems = [ NSArray arrayWithObjects: buttonItem, buttonNext, nil ];

[ buttonItem release ];
[buttonNext release];

2
你所需做的就是实现所需表格视图功能所需的UITableViewDelegate和UITableViewDatasource方法。这些方法可以在任何类中,但是这些类应符合相关协议。委托和数据源应设置在UITableView实例上 - 可以通过编程或使用Interface Builder进行设置。根据文档,您失去一些功能 - 请参阅概述部分
个人认为,许多开发者似乎痴迷于在单个大型视图控制器类中提供所有这些功能,并且因为它们的视图中有一个表格视图,所以必须使用UITableViewController的子类。然而,我喜欢考虑单一职责原则,并且在复杂性超过简单的情况下,通常会将数据源和委托拆分成单独的类。代码也不会绑定到特定的UIViewController实现中。
在我有单独的数据源/委托类的情况下,我经常使用Interface Builder构建和连接它们到表格视图,而不是在代码中进行设置。这种方法(至少对我来说)符合依赖注入的精神,节省了编写一些样板代码,并提供了一定程度的解耦
当然,这些选择受到您尝试实现的功能复杂性的影响 - 对于简单的实现,我可能会使用UITableViewController。

0

试试这个:

self.navigationController.toolbarHidden = NO;

希望它能对你有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接