【问题标题】:How to display data stored in NSMutableArray in a TableView?如何在 TableView 中显示存储在 NSMutableArray 中的数据?
【发布时间】:2023-03-20 12:44:01
【问题描述】:

我是 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

【问题讨论】:

  • 您能在填充表格视图的位置显示代码吗?

标签: iphone xcode uitableview nsmutablearray xml-parsing


【解决方案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 重用。这意味着您的表可能看起来有数百万行,同时保持响应速度并仅消耗少量内存。但很少有应用程序真正需要如此强大的功能。

【讨论】:

  • 非常感谢您提供的这些信息,我会先查看您刚刚发送给我的链接,看看我该如何处理
  • 您好,我已经放置了一个 tableview 查询。您是否也可以在以下链接上检查并回答这个问题。 stackoverflow.com/questions/8239543/…
【解决方案2】:

这样试试,

    - (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 在上述方法中是否正在初始化

【讨论】:

    【解决方案3】:

    如果您的数据被正确读取(由NSLog 检查),那么问题一定出在您的UITableView datasource 中。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-28
      • 2017-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多