Cocoa 编程之表格视图
一. 表格视图
1. 所谓表格视图,即以表格的形式显示数据,在表格中不进可以容纳字符串,也可以容纳图片和按钮;
2. 在Mac应用程序中实现表格视图的主要类是NSTableView,此外还需要NSTableColumn类的协调运行;在IOS应用程序中主要使用UITableView;(因为ios应用程序中表格只有一列);两者的继承关系。
NSObjectàUIResponseràUIViewàUIScrollViewàUITableView
NSObjectàNSTableColumn
NSObjectàNSResponseràNSViewàNSControlàNSTableView
3. 表格:横向的称行row,纵向为列column,特定的格子为单元cell;数据的标题部分成为头header;
二. 数据资源
1. NSTableView的关键所在是使用数据资源(Data source)来显示值,
2. 设置NSTableView的数据资源的工作可以在代码中进行,也可以在Interface Builder中进行。
3. 表格的显示并不是一次性显示所有的数据,而是先访问画面能够显示的部分,这样能保证良好的性能;
4. 数据资源如何来提供数据呢?NSTableView对数据资源进行两个查询:一. 表中的行数;二,某行某列的数据;
5. 要让NSTableView能识别数据资源,必须实现上面的两个方法。只要实现了这个方法,任何类的实例都能作为数据资源使用。
- (int)numberOfRowsInTableView:(NSTableView*)tableView;
- (id)tableView:(NSTableView*)tableViewobjectValueForTableColumn:(NSTableColumn*)tableColumn row:(NSInteger)row;
6. NSTableView类中提供了向表格中读入数据的方法:reloadData;
三. 实例,cocoa实现RSS阅读器:
1. 创建Cocoa Application工程。
2. 创建AppController类,作为控制器;
@interfaceBIDAppController : NSObject
{
NSXMLDocument*document;
IBOutlet idlinkTextField;
IBOutlet idtableView;
IBOutlet idtitleTextField;
IBOutlet idurlTextField;
}
- (IBAction)readURL:(id)sender;
3. 在Interface builder中设置用户界面;
属性设定:
1) URL后的文本框,设置attribute的Action标签为SentOn Enter Only,设置回车键响应
2) 表格是一个复合控件,设置TableColumn的title;第一列设为title,第二列设为link;同时设置Editable未选中,不可编辑;
4. 类实例化和插座动作连接
1) 先把library中的Objects拖到xib文件中,然后设置其类为AppController;
2) 按ctrl建分别拖动AppControllder到文本输入框,Title标签,link标签;和tableView标签;
3) 将Read按钮连接到动作ReadURL,
5. 设置数据源
将tableView按ctrl拖到AppController的dataSource连接;
6. 实现最后的三个方法:
@implementation BIDAppController
- (IBAction)readURL:(id)sender{
NSURL* url;
url = [NSURL URLWithString:[urlTextField stringValue]];
//
document = [[NSXMLDocument alloc] initWithContentsOfURL:url options:0 error:NULL];
if(!document) {
return;
}
//取得/rss/channel/title节点
NSArray *nodes;
nodes = [document nodesForXPath:@"/rss/channel/title" error:NULL];
if([nodes count] == 0){
return;
}
if([nodes count] == 1){
NSXMLNode *titleNode;
titleNode = [nodes objectAtIndex:0];
NSString * title;
title = [titleNode stringValue];
[titleTextField setStringValue:title];
}
nodes = [document nodesForXPath:@"/rss/channel/link" error:NULL];
if([nodes count] == 1){
NSXMLNode *linkNode;
linkNode = [nodes objectAtIndex:0];
NSString *link;
link = [linkNode stringValue];
[linkTextField setStringValue:link];
}
[tableView reloadData];
}
- (int)numberOfRowsInTableView:(NSTableView*)tableView{
if(!document){
return 0;
}
NSArray *nodes;
nodes = [document nodesForXPath:@"/rss/channel/item" error:0];
if([nodes count] == 0){
return 0;
}
return [nodes count];
}
- (id)tableView:(NSTableView*)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{
if(!document){
return nil;
}
//
id identifier;
identifier = [tableColumn identifier];
//
NSArray *nodes;
nodes = [document nodesForXPath:@"/rss/channel/item" error:NULL];
if(nodes == 0)
{
return nil;
}
NSXMLNode* node;
node = [nodes objectAtIndex:row];
//
if([identifier isEqual:@"title"]){
nodes = [node nodesForXPath:@"title" error:NULL];
if([nodes count] == 1){
node = [nodes objectAtIndex:0];
return [node stringValue];
}
}
if([identifier isEqual:@"link"]){
nodes = [node nodesForXPath:@"link" error:NULL];
if([nodes count] == 1){
node = [nodes objectAtIndex:0];
return [node stringValue];
}
}
return nil;
}
@end