更新到iOS8并使用XCode6编译我的应用程序后,点击按钮时会出现一个非常奇怪的异常。
我的按钮定义如下:
UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button addTarget:self
action:@selector(cellButtonPressed:)
forControlEvents:UIControlEventTouchDown];
在“@selector”中我定义了按下按钮时调用的方法:
-(void) cellButtonPressed:(id)sender {
NSLog(@"Hello again");
}
我还将此方法添加到我的头文件.h
中此按钮作为子视图放在UITableViewCell
中:
button.frame = CGRectMake(cell.frame.size.width - 54, cell.frame.origin.y+20, 36, 36);
[cell addSubview:button];
这在iOS7上非常好用。但现在,在iOS8上,点击按钮后出现异常:
2014-09-25 08:33:47.461 ****[12442:1669165] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UITableViewWrapperView type]: unrecognized selector sent to instance 0x12ce35560'
*** First throw call stack:
(0x185dae084 0x1963940e4 0x185db5094 0x185db1e48 0x185cb708c 0x10005a928 0x18a5652f4 0x18a54e44c 0x18a56dff8 0x18a524724 0x18a55e7b8 0x18a55de58 0x18a531660 0x18a7cfd6c 0x18a52fbc8 0x185d66324 0x185d655c8 0x185d63678 0x185c91664 0x18edd35a4 0x18a596984 0x10004b324 0x196a02a08)
libc++abi.dylib: terminating with uncaught exception of type NSException
有人知道为什么吗?
谢谢你的帮助!
答案 0 :(得分:1)
好的,我找到答案是因为评论中的建议:
正确调用选择器中的方法。从superview获取单元格存在问题。
在iOS7上,我使用以下代码获取单元格内的单击按钮:
UserTableViewCell *cell = (UserTableViewCell *)[[sender superview] superview];
现在,在iOS8上,我必须通过此调用获取单元格:
UserTableViewCell *cell = (UserTableViewCell *)[sender superview];
所以,这对我来说是一个解决方案:
-(void)cellButtonPressed:(id)sender {
NSArray *vComp = [[UIDevice currentDevice].systemVersion componentsSeparatedByString:@"."];
UserTableViewCell *cell = nil;
if ([[vComp objectAtIndex:0] intValue] >= 8) {
cell = (UserTableViewCell *)[sender superview];
} else {
cell = (UserTableViewCell *)[[sender superview] superview];
}
// do your stuff
}
因此,TableViewCell的视图堆栈似乎是另一个。很高兴知道:)
谢谢你们!