导航控制器(UINavigationController)是iOS界面中重要的组成部分。一般来说导航控制器要结合TableView来使用,因此我在摸导航控制器前先写了简单的TableView(编写简单的TableView),下面的例子也是在这个例子基础上写的。
本文是参考《iPhone开发基础教程》写的,但是这部分教程太啰嗦了。我做了精简,并拆分成几个渐进的小例子。第一个例子截图:
首先,要创建Navigation-based Application:
这样,xcode会帮你生成一个导航项目的框架。xcode生成的RootViewController实际上是一个UITableViewController,这和编写简单的TableView是很类似的。
可以在IB中找到MainWindow.xib,为导航首页增加标题:
然后,和TableView类似,编写dataSource,不过不需要通过IB做关联到file’s owner了。只需要在RootViewController中“填空”即可,头文件中:
@interface RootViewController : UITableViewController <UITableViewDelegate,UITableViewDataSource>{
NSArray *dataItems;
在m文件:
@synthesize dataItems;
…
- (void)viewDidLoad {
[super viewDidLoad];dataItems= [[NSArray alloc] initWithObjects:@"张三",@"李四",nil];
[super viewDidLoad];
}…
// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [dataItems count];
}
另外,为了做出这个如下的效果:
需要再增加一个函数:
-(UITableViewCellAccessoryType)tableView:(UITableView *)tableView accessoryTypeForRowWithIndexPath:(NSIndexPath *)indexPath{
return UITableViewCellAccessoryDetailDisclosureButton;
}
这时还没有牵扯到导航控制器的主要内容,只是做了个TableView而已。
创建详细内容的控制器,DetailViewController以及对应的xib文件。需要注意的是要在IB中做控制器到视图之间的关联工作。
然后,将DetailViewController设置为RootViewController的成员:
@interface RootViewController : UITableViewController <UITableViewDelegate,UITableViewDataSource>{
NSArray *dataItems;
DetailViewController *detailViewController;
}
之后,回到RootViewController.m文件中,增加用于处理列表按钮的函数:
-(void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath{
if (detailViewController==nil) {
detailViewController=[[DetailViewController alloc] initWithNibName:@"DetailView" bundle:nil];
}
detailViewController.title=@"Detail";
NavTestAppDelegate *delegate=[[UIApplication sharedApplication] delegate];
[delegate.navigationController pushViewController:detailViewController animated:YES];
}
在该函数中初始化了DetailViewController,并且将这个控制器压栈到控制器栈中。运行程序,就是上面的效果。
这里要注意,本例中选中条目并不会到详细页面,而必须点击图标按钮才行。