我正在编写一个基于导航的iPhone应用程序,我希望UIToolBar停靠在屏幕底部,UITableView在工具栏和导航栏之间滚动。
我见过几个论坛,其中有人建议处理此视图的View Controller应该是标准的UIViewController而不是UITableViewController。除了所有标准的UIViewController覆盖之外,视图控制器还必须实现UITableView委托和数据源方法。除了前面提到的协议之外,我需要在这个视图控制器子类中重新创建什么(如果有的话)内置功能才能让它像UITableViewController一样工作?走这条路是否有什么损失?
或者将UITableViewController嵌套在标准的UIViewController中会更好吗?
答案 0 :(得分:49)
从OS 3.0开始,导航控制器内置了一个工具栏。要显示它:
[self.navigationController setToolbarHidden:NO];
通过实施:
- (void)setToolbarItems:(NSArray *)toolbarItems animated:(BOOL)animated
在视图控制器中,您可以配置工具栏的项目。
因此,您不必再担心工具栏在层次结构中的位置。
(更正错字)
答案 1 :(得分:9)
Corey Floyd大部分都是正确的,除了
[self.navigationController setToolBarHidden:NO];
应该是
[self.navigationController setToolbarHidden:NO];
也就是说,“setToolbarHidden”中的“b”必须是小写的。此外,iPhone OS Reference中列出的方法名称实际上是
- (void)setToolbarHidden:(BOOL)hidden animated:(BOOL)animated
虽然省略animated
参数似乎也有效。
答案 2 :(得分: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];
答案 3 :(得分:2)
您需要做的就是实现所需的表视图功能级别所需的UITableViewDelegate和UITableViewDatasource方法。这些方法可以在任何类中,尽管所述类应该符合相关协议。应该在UITableView实例上设置委托和数据源 - 以编程方式或使用Interface Builder。根据文档,您将失去一些功能 - 请参阅overview section。
我个人发现许多开发人员似乎都沉迷于在单个单片视图控制器类中提供所有这些功能,并且因为他们在视图中有一个表视图,所以必须使用UITableViewController的子类。但是,我喜欢考虑Single Responsibility Principle,并且当复杂性不是简单的时候,它经常会破坏数据源并委托给单独的类。然后代码也不依赖于特定的UIViewController实现。
在我有单独的数据源/委托类的情况下,我经常使用Interface Builder构建并连接到表视图,而不是代码。这种方法(至少对我而言)符合Dependency Injection的精神,节省了编写一些样板代码,并提供了一定级别的decoupling。
这些选择当然受到您尝试实现的功能的复杂性的影响 - 对于简单的实现,我可能会发现自己使用的是UITableViewController。
答案 4 :(得分:0)
试试这个:
self.navigationController.toolbarHidden = NO;
希望它对你有所帮助。