您的位置:首页 > 编程语言

Cocoa 编程之表格视图实例

2012-11-17 18:05 369 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: