iphone - Web服务返回XML

时间:2011-06-05 08:34:32

标签: iphone objective-c

我对iPhone开发很新,所以请温柔地对待我。 我已经建立了一个返回XML数据的Web服务。样本数据:

<categories>
    <category>
        <CategoryId>1</CategoryId>
        <CategoryName>cat1</CategoryName>
    </category>
    <category>
        <CategoryId>2</CategoryId>
        <CategoryName>cat2</CategoryName>
    </category>
</categories>

我正在处理此处提供的代码:http://gigaom.com/apple/tutorial-build-a-simple-rss-reader-for-iphone/ 而且我收到了一个错误。 这是设置数组的函数:

    -(void)parser: (NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    NSLog(@"ended element: %@", elementName);
    if([elementName isEqualToString:@"category"])
    {
        [category setObject:currentID forKey:@"CategoryId"];
        [category setObject:currentName forKey:@"CategoryName"];
        [categories addObject:[currentElement copy]];
    }
}`-(void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    NSLog(@"Found characters: %@", string);
    if([currentElement isEqualToString:@"CategoryName"])
    {
        [currentName appendString:string];
    }
    else if([currentElement isEqualToString:@"CategoryId"])
    {
        [currentID appendString:string];
    }
}

当我尝试从数组中读取时出现错误:

 (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *MyIdentifier = @"MyIdentifier";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
    if(cell == nil)
    {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:MyIdentifier] autorelease];
    }
    int categoryIndex = [indexPath indexAtPosition: [indexPath length] -1];
    [cell.textLabel.text = [categories objectAtIndex: categoryIndex] objectForKey: @"CategoryName"];
    return cell;


}

我收到此错误:

2011-06-05 11:33:35.436 FirstTry[2419:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSCFString objectForKey:]: unrecognized selector sent to instance 0x4c26b40'

我有点迷失iOS开发的东西。谢谢!

1 个答案:

答案 0 :(得分:1)

“无法识别的选择器发送到实例...”的原因 - 错误是您正在向未实现该功能的实例调用函数。

您在cellForRowAtIndexPath: usedLocalVariableName:Class

中假设了以下数据结构

categories:NSArray包含许多category:NSMutableDictionary,其中包含@"CategoryName" - 值为NSString的密钥。

你的Parse-Code导致了不同的结果:

categories:NSArray包含许多currentElement:NSString(我认为currentElementNSString,因为您使用isEqualToString: - currentElement上的方法

因此,如果您运行该代码,代码段:[categories objectAtIndex: categoryIndex]将返回NSString一个NSDictionaryNSString则不会实施objectForKey: - 方法。

我不确定(我没有测试过)但我认为

[categories addObject:[[category copy] autorelease]];

应该有效。自动释放是针对内存泄漏的

另一件事:你使用

int categoryIndex = [indexPath indexAtPosition: [indexPath length] -1];

为什么不使用int categoryIndex = indexPath.row

编辑:您正在使用NSXMLParser。我正在使用TBXML - Parser parses faster than NSXML并且使用起来更舒服。