我对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开发的东西。谢谢!
答案 0 :(得分:1)
“无法识别的选择器发送到实例...”的原因 - 错误是您正在向未实现该功能的实例调用函数。
您在cellForRowAtIndexPath:
usedLocalVariableName:Class
categories:NSArray
包含许多category:NSMutableDictionary
,其中包含@"CategoryName"
- 值为NSString
的密钥。
你的Parse-Code导致了不同的结果:
categories:NSArray
包含许多currentElement:NSString
(我认为currentElement
是NSString
,因为您使用isEqualToString:
- currentElement
上的方法
因此,如果您运行该代码,代码段:[categories objectAtIndex: categoryIndex]
将返回NSString
而不一个NSDictionary
而NSString
则不会实施objectForKey:
- 方法。
我不确定(我没有测试过)但我认为
[categories addObject:[[category copy] autorelease]];
应该有效。自动释放是针对内存泄漏的
另一件事:你使用
int categoryIndex = [indexPath indexAtPosition: [indexPath length] -1];
为什么不使用int categoryIndex = indexPath.row
编辑:您正在使用NSXMLParser。我正在使用TBXML - Parser parses faster than NSXML并且使用起来更舒服。