Cocoa 编程之表格视图实例

这篇博客详细介绍了Cocoa编程中的表格视图,包括在Mac和iOS应用中的实现,核心类NSTableView和UITableView的关系,以及数据资源的使用。通过数据源提供行数和单元格数据,实现表格动态加载以优化性能。文中还给出了一个Cocoa RSS阅读器的实例,演示了如何创建控制器、用户界面以及设置数据源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值