iPhone应用程序冻结

时间:2011-04-16 21:10:09

标签: iphone uitableview

使用iPhone模拟器2.2.1

使用表格并希望为选定的单元格添加复选标记。

我从一个应用程序添加了这段代码,该应用程序可以对不同的应用程序起作用,但使用的方法也相同。现在这个新代码编译并启动,并在选定的单元格中放置一个复选标记,几秒钟后程序冻结。

* 此代码部分来自正在运行的应用程序。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [tableView deselectRowAtIndexPath:indexPath animated:YES];

***This snippet was added (from another working app)

    if ([[tableView cellForRowAtIndexPath:indexPath] accessoryType] == UITableViewCellAccessoryCheckmark) 
        [[tableView cellForRowAtIndexPath:indexPath] setAccessoryType:UITableViewCellAccessoryNone];    
        else 
        [[tableView cellForRowAtIndexPath:indexPath] setAccessoryType:UITableViewCellAccessoryCheckmark];
    [self performSelector:@selector(deselect) withObject:nil afterDelay:0.5f];

***End of snippet

}

我为控制台输入了一些printf语句,并通过if语句和最后一行执行。

所以它没有片段就可以工作,如果我包含它编译,启动的片段,并且在选择一个项目并且出现复选标记后,应用程序会冻结。

来自控制台的错误消息如下。

*** -[RootViewController deselect]: unrecognized selector sent to instance 0x526750
2011-04-16 16:15:30.132 lab3[37268:20b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[RootViewController deselect]: unrecognized selector sent to instance 0x526750'

2 个答案:

答案 0 :(得分:1)

答案在错误消息中:对象deselect没有选择器RootViewController,在您的代码(和代码段)中由self表示。方法deselect必须是其他程序中定义的方法,但不是当前应用程序中定义的方法。从其他程序中剪切并粘贴,我打赌它可以解决问题。

另一个提示(与问题无关,但代码在这里):如果在if语句之前声明局部变量然后在if语句中使用该变量,则可以避免对cellForRowAtIndexPath:的所有调用,例如

UITAbleViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
if ([cell accessoryType] == UITableViewCellAccessoryCheckmark)
    ....

一旦解决了其他问题,你的表现就会提高。

答案 1 :(得分:0)

您正在向-deselect发送self消息,该消息显然是RootViewController的一个实例。但是,您的RootViewController类没有-deselect方法,因此会引发异常,从而导致错误。因此,请停止向-deselect发送self,或向RootViewController添加-deselect方法。

BTW,搜索NSInvalidArgumentException会出现许多类似的问题,所以你根本不必等待答案。