如何在TableView中显示存储在NSMutableArray中的数据?

时间:2011-08-29 08:46:46

标签: iphone xcode uitableview nsmutablearray xml-parsing

我是iphone编程的新手。 我使用XML Parser接收存储在NSMutableArray中的数据并将其显示在TableView中。 当我正在编译时,我可以使用NSLog在控制台中看到数据,但它不会出现在模拟器上的tableView中。我需要你的帮助来解决这个问题。

    //  XMLParser.m
#import "XMLParser.h"

@implementation XMLParser

- (NSDictionary *)catalogue{
    return catalogue;
}
- (id)parseXMLAtURL:(NSURL *)url
         parseError:(NSError **)error
{
    catalogue = [NSMutableDictionary new];

    NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url];
    [parser setDelegate:self];
    [parser parse];
    if([parser parserError] && error) {
        *error = [parser parserError];
    }
    [parser release];
    return self;
}
- (void) parser:(NSXMLParser *)parser
didStartElement:(NSString *)elementName
   namespaceURI:(NSString *)namespaceURI
  qualifiedName:(NSString *)qName
     attributes:(NSDictionary *)attributeDict
{
    if([elementName isEqualToString:@"Catalogue"]) { 
        categories = [NSMutableArray new];
    }else if([elementName isEqualToString:@"Categorie"]) {
        categorie = [NSMutableDictionary new];
        [categorie setValue:[attributeDict valueForKey:@"id"] forKey:@"id"];
        typesProduit = [NSMutableArray new];
    }else if([elementName isEqualToString:@"typeproduit"]) { 
        typeProduit = [NSMutableDictionary new];
        [typeProduit setValue:[attributeDict valueForKey:@"id"] forKey:@"id"];
        produits = [NSMutableArray new];
    }else if([elementName isEqualToString:@"produit"]) { 
        produit = [NSMutableDictionary new];
        [produit setValue:[attributeDict valueForKey:@"id"] forKey:@"id"];
    }else {
        currentNodeName = [elementName copy];
        currentNodeContent = [[NSMutableString alloc] init];
    }
}
- (void)parser:(NSXMLParser *)parser 
 didEndElement:(NSString *)elementName
  namespaceURI:(NSString *)namespaceURI
 qualifiedName:(NSString *)qName
{
    //NSLog(@"Close tag: %@", elementName); 

    if([elementName isEqualToString:@"Catalogue"]) {
        [catalogue setValue:categories forKey:@"categories"];
        [categories release];
        categories = nil;
    }else if([elementName isEqualToString:@"Categorie"]) {
        [categorie setValue:typesProduit forKey:@"typesProduit"];
        [typesProduit release];typesProduit=nil;
        [categories addObject:categorie];
        [categorie release];categorie = nil;
        [typesProduit release];typesProduit=nil;
    }else if([elementName isEqualToString:@"typeproduit"]) {
        [typeProduit setValue:produits forKey:@"produits"];
        [typesProduit addObject:typeProduit];
        [typeProduit release];typeProduit=nil;
        [produits release];produits=nil;
    }else if([elementName isEqualToString:@"produit"]) {
        [produits addObject:produit];
        [produit release];produit=nil;
    }else if([elementName isEqualToString:@"nom"]) {
        [categorie setValue:currentNodeContent forKey:@"nom"];
    }else if([elementName isEqualToString:@"libelle"]) {
        [typeProduit setValue:currentNodeContent forKey:@"libelle"];
    }else {
        [produit setValue:currentNodeContent forKey:elementName];
        [currentNodeContent release];currentNodeContent=nil;
    }
}

- (void)parser:(NSXMLParser *)parser
foundCharacters:(NSString *)string
{   
    [currentNodeContent appendString:string];
}
- (void)dealloc{
    [catalogue release];
    [super dealloc];
}
@end

3 个答案:

答案 0 :(得分:1)

参见UITableViewController Class Reference.还有很多关于创建表视图的教程。

您需要一个符合UITableViewDataSource协议的类。它可以是您自己编写的任何类,但UITableViewController符合协议,因此您可以将其子类化,然后使用您的子类作为委托。

在您的委托中,您需要定义以下方法:

`- (UITableViewCell  *)tableView:(UITableView  *)tableView cellForRowAtIndexPath:(NSIndexPath  *)indexPath`

表视图控制器实例化表视图本身然后交给你,所以你不需要自己分配它。

NSIndexPath只是一对整数,一个是表格部分的索引,另一个是该部分中单元格的索引。一个简单的表只有一个部分,所以第一个索引总是为零,但你可以拥有任意数量的部分。

您创建UITableViewCell,然后将单元格的textLabel属性的文本设置为您从其中一个数组元素获取的字符串。还有一个detailTextLabel,可以在同一个单元格中显示其他信息。

根据我所告诉你的,Table View Programming Guide for iOS应该可以让你到达你想去的地方。

请注意,表视图存在各种问题。当然要学习如何实现一个并让它工作,但是如果你发现它没有做你想要的,并且你没有太多单元格,那么考虑使用UIScrollView。

UITableViewController的优点是它适用于基本上无限大小的表。当它们从顶部或底部滚动时删除单元格,将它们放入缓存中,然后使它们可供cellForRowAtIndexPath重用。这意味着您的表可能看起来有数百万行,同时保持响应并且只消耗少量内存。但很少有应用程序确实需要强大的功能。

答案 1 :(得分:0)

试试这个,

    - (void)parser:(NSXMLParser *)parser
    foundCharacters:(NSString *)string
    {   
    if(currentNodeContent  == null){
    currentNodeContent = [[NSMutableString alloc] init];
    }
else
        [currentNodeContent appendString:string];
    }

删除currentNodeContent = [[NSMutableString alloc] init]; 从这个方法

- (void) parser:(NSXMLParser *)parser
didStartElement:(NSString *)elementName
   namespaceURI:(NSString *)namespaceURI
  qualifiedName:(NSString *)qName
     attributes:(NSDictionary *)attributeDict 

我怀疑currentNodeContent在上面的方法

中是否会被初始化

答案 2 :(得分:0)

如果您的数据被正确读取(由NSLog检查),则问题必须出在UITableView datasource

检查您的cellForRowAtIndexPath:方法。您应该将单元格标签设置为适当的名称:

cell.textLabel.text = [yourDataArray objectAtIndex:indexPath.row];

在您的解析例程中,使用您希望在表格视图中显示的各种类(yourDataArrayproduit等)的项目填充categorie