当我在aepub阅读器中运行搜索功能时,我的应用程序崩溃了。它以index方式进入cellfor行,当它执行NSLOg(@"%@",hit.neighbourText)
时,它显示异常。
(UITableViewCell *)tableView:(UITableView *)tableView1 cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView1 dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
}
cell.textLabel.adjustsFontSizeToFitWidth = YES;
NSLog(@"indexpath%d",indexPath.row);
NSLog(@"%@",[results objectAtIndex:[indexPath row]]);
hit = (SearchResult*)[results objectAtIndex:[indexPath row]];
if([results count]>0) {
NSLog(@"%@",hit.neighboringText);
cell.textLabel.text = [NSString stringWithFormat:@"...%@...", hit.neighboringText];
cell.detailTextLabel.text = [NSString stringWithFormat:@"Chapter %d - page %d", hit.chapterIndex, hit.pageIndex+1];
return cell;
}
}
我为hit.neighboringText
获得了一些价值,但在那之后,我重新加载我的tableview然后会引发以下异常,为什么?
由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:' - [__ NSCFConstantString adjacentText]:无法识别的选择器发送到实例0x1481c4' ***首先抛出调用堆栈:
答案 0 :(得分:5)
这是因为hit
实际上是NSString
对象,而不是您期望的SearchResult
对象:
hit = (SearchResult*)[results objectAtIndex:[indexPath row]];
线索在异常文本中:
-[__NSCFConstantString neighboringText]: unrecognized selector sent to instance ...
^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^
SearchResult
的任何投射量都不会改变它。
编辑:实际上,只要你看到演员阵容,就应该怀疑你正在处理的实际对象。如果您不确定,请使用isKindOfClass:
进行检查。
答案 1 :(得分:0)
您的问题的答案在于错误消息:
无法识别的选择器发送到实例0x1481c4。
接下来需要做的是通过po 0x1481c4打印该地址的值。看起来它实际上不是一个字符串,但你没有显示该代码。
答案 2 :(得分:0)
这意味着hit = (SearchResult*)[results objectAtIndex:[indexPath row]];
返回ConstantString而不是SearchResult
对象
在从hit
获取值之前,最好检查neighboringText
是否与SearchResult属于同一类类型
你可以尝试这样的事情:
if([hit isKindOfClass:[SearchResult Class]]){
// do something with hit
}
else{
// different class
}
答案 3 :(得分:0)
我猜有两种可能性:
hit
不是SearchResult
对象,而是String对象hit
或results
数组不再拥有/已发布但未设置为nil
并指向垃圾,我相信是这种情况因为我之前已经经历过我认为你需要确保数组在那时没有自动释放/释放(例如,如果你使用[NSArray arrayWith...]
创建它,它是自动释放的,你可能不会在cellForRowAtIndexPath中拥有它)和命中在将对象提供给results
数组之前,对象已正确初始化。