2011-08-29 83 views
0

我是iphone新手。 我正在使用XML解析器接收存儲在NSMutableArray中的數據並將其顯示在TableView中。 當我編譯時,我可以使用NSLog在控制檯中看到數據,但它不會顯示在模擬器的tableView中。我需要你的幫助來解決這個問題。如何在TableView中顯示存儲在NSMutableArray中的數據?

// 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 
+0

你可以顯示代碼在哪裏填充你的表格視圖嗎? –

回答

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 

我懷疑,當它是在上述方法中

0

如果currentNodeContent是越來越initailised您數據被正確讀取(通過檢查)問題必須出現在您的UITableView datasource中。

檢查您的cellForRowAtIndexPath:方法。在那裏,你應該將電池標籤設置相應名稱:

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

在你的分析例程,填補yourDataArray與您要顯示在表格視圖中的各個類(produitcategorie等)的項目。

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重用。這意味着您的表格可能會顯示爲數百萬行,同時保持響應並只消耗一點內存。但很少有應用程序確實需要強大的功能。

+0

非常感謝這些信息,我會檢查你剛纔給我發送的鏈接,看看我可以如何處理該問題。 –

+0

嗨,我已經放置了一個tableview查詢。你可以在下面的鏈接上檢查並回答這個問題。 http://stackoverflow.com/questions/8239543/tableview-is-not-showing-data –

相關問題