UINavigationController+TableView
在iphone程序中,导航器(navigation)和表单(tableview)是很常用的两个控件,而且这两个控件经常是结合在一起
使用。
navigationController 是一个用来表示不同视图之间从属关系的控件,它和tabBarController不同,tabBarController表示的是不同视图之间并列关 系。navigationController 通过维护一个栈,来实现不同具有从属(父子)关系的视图的切换。
下面是官方给出navigationController的使用
其 实navigationController不属于控件,它继承于viewController,它是一个集合了navigation Bar,navigation View等的控制器。至于控制器是什么的?简单来说,控制器就是调控视图与数据之间关系的一个中介。视图就是显示数据给用户看的一个窗口,数据就是要显示 给用户看的东西,而控制器呢,就是怎么把数据绑定到视图。
tableview 是一个表单控件,上图中的那些列表,就是tableview,tableview的每一行是一个tableViewCell.
根据MVC模式,iphone的程序都是有 view-model-controller 组成的。所以,tableview也需要一个controller作为它的delegate和datasource
首先,先新建一个base window的工程,命名为TableViewEx
这个程序主要有两个界面组成,根界面(tableview)和详细信息界面(detailview)
先在 TableViewExAppDelegate 中添加navigationController
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
MyTableViewController *rootViewController = [[MyTableViewController alloc] init];
_navigationController = [[UINavigationController alloc] initWithRootViewController:rootViewController];
[self.window addSubview:_navigationController.view];
[self.window makeKeyAndVisible];
return YES;
}
navigationController自身是不带view的,所以它初始的时候必须有一个rootView.
在iphone程序中,视图是可以无限嵌套的,只要程序不崩溃。而且,视图嵌套的方式一般就是使用addSubivew这个方法。它的作用就是把一个subview添加到superview 上。
然后,新建一个controller,名字为MyTableViewController
MyTableViewController.h 为
@interface MyTableViewController : UIViewController
<UITableViewDelegate, UITableViewDataSource>
{
UITableView *_tableView;
NSArray *_dataArray;
}
@property (nonatomic, retain) NSArray *dataArray;
@property (nonatomic, retain) UITableView *tableView;
@end
MyTableViewController.m 为
@implementation MyTableViewController
@synthesize dataArray=_dataArray;
@synthesize tableView=_tableView;
- (void)viewDidLoad
{
_dataArray = [[NSArray alloc] initWithObjects:@"abc",@"dads",
@"dafdos",@"dajofdiso",@"1232",@"dafdos",@"dajofdiso",@"1232",
@"dafdos",@"dajofdiso",@"1232",@"dafdos",@"dajofdiso",@"1232",nil];
_tableView = [[UITableView alloc] init];
[_tableView setDelegate:self];
[_tableView setDataSource:self];
[_tableView setAutoresizingMask:UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight];
self.view = _tableView;
[super viewDidLoad];
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView
numberOfRowsInSection:(NSInteger)section
{
return [_dataArray count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyTableViewCell"];
if(nil == cell)
{
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"MyTableViewCell"] autorelease];
}
// NSLog(@"cellForRowAtIndexPath %i", indexPath.row);
[cell.textLabel setText:[_dataArray objectAtIndex:indexPath.row]];
return cell;
}
- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
DetailViewController *detailView = [[DetailViewController alloc] init];
[detailView.textLabel setText:[_dataArray objectAtIndex:indexPath.row]];
[self.navigationController pushViewController:detailView animated:YES];
[detailView release];
}
- (void)viewDidUnload
{
self.dataArray = nil;
self.tableView = nil;
[super viewDidUnload];
}
- (void)dealloc
{
[_dataArray release];
[_tableView release];
[super dealloc];
}
@end
MyTableViewController.m 主要是实现几个tableview的delegate和datasource方法
其中
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
是配置tableviewcell数据的方法。
所以,当自定义一个tableview的时候,通常就是修改这个方法中cell的样式,可以改为自定义的cell
然后就是 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
这个方法是tableview的一个tableviewcell被点击后操作的方法。通常也就是在这个方法中,添加视图切换的代码,
DetailViewController *detailView = [[DetailViewController alloc] init];
[detailView.textLabel setText:[_dataArray objectAtIndex:indexPath.row]];
[self.navigationController pushViewController:detailView animated:YES];
[detailView release];
这里使用navigationController把detailView也推进navigationController维护的栈里,navigationController维护的栈中的栈顶视图就是当前看的到的视图。
DetailViewController,也是一个继承viewController的控制器。至于怎么程序数据,大家可以按照大家喜欢的方式呈现