UINavigationController+TableView

在iphone程序中,导航器(navigation)和表单(tableview)是很常用的两个控件,而且这两个控件经常是结合在一起

使用。

navigationController  是一个用来表示不同视图之间从属关系的控件,它和tabBarController不同,tabBarController表示的是不同视图之间并列关 系。navigationController 通过维护一个栈,来实现不同具有从属(父子)关系的视图的切换。

下面是官方给出navigationController的使用

A sample navigation interface

其 实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的控制器。至于怎么程序数据,大家可以按照大家喜欢的方式呈现

posted @ 2011-08-11 19:00  mew7wo  阅读(4123)  评论(0编辑  收藏  举报