我是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
答案 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];
在您的解析例程中,使用您希望在表格视图中显示的各种类(yourDataArray
,produit
等)的项目填充categorie
。