使用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'
答案 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
方法。