Cocoa 编程之表格视图实例

来源:互联网 发布:动漫资讯网站知乎 编辑:程序博客网 时间:2024/06/10 17:27

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


原创粉丝点击