我在UITableViewCell
中有一个UITableViewController
。
在我的单元格中,有一个按钮,当您点击时会带您到另一个view
prepareforsegue
。
在prepareForSegue
我这样做:
if ([[segue identifier] isEqualToString:@"MySegue"])
{
UITableViewCell *cell = (UITableViewCell*) [[sender superview] superview];
UITableView *table = (UITableView*)[[[sender superview] superview] superview];
NSIndexPath *indexPath = [table indexPathForCell:cell];
}
确定!一切都运作良好。但是现在我已经用iOS7升级了xCode,当我点击单元格中的按钮时,一个错误出现在我面前,我不知道如何解决它:
[UITableViewCell indexPathForCell:]: unrecognized selector sent to instance 0x9e160b0
2013-09-20 16:30:44.427 MyApp[8212:a0b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UITableViewCell indexPathForCell:]: unrecognized selector sent to instance 0x9e160b0'
*** First throw call stack:
(
0 CoreFoundation 0x024475e4 __exceptionPreprocess + 180
1 libobjc.A.dylib 0x01a5d8b6 objc_exception_throw + 44
2 CoreFoundation 0x024e4903 -[NSObject(NSObject) doesNotRecognizeSelector:] + 275
3 CoreFoundation 0x0243790b ___forwarding___ + 1019
4 CoreFoundation 0x024374ee _CF_forwarding_prep_0 + 14
5 MyApp 0x0004bc01 -[NewsTableViewController prepareForSegue:sender:] + 3441
6 UIKit 0x00af69cc -[UIStoryboardSegueTemplate _perform:] + 156
7 UIKit 0x00af6a59 -[UIStoryboardSegueTemplate perform:] + 115
8 libobjc.A.dylib 0x01a6f874 -[NSObject performSelector:withObject:withObject:] + 77
9 UIKit 0x005c4c8c -[UIApplication sendAction:to:from:forEvent:] + 108
10 UIKit 0x005c4c18 -[UIApplication sendAction:toTarget:fromSender:forEvent:] + 61
11 UIKit 0x006bc6d9 -[UIControl sendAction:to:forEvent:] + 66
12 UIKit 0x006bca9c -[UIControl _sendActionsForEvents:withEvent:] + 577
13 UIKit 0x006bbd4b -[UIControl touchesEnded:withEvent:] + 641
14 UIKit 0x00936d7f _UIGestureRecognizerUpdate + 7166
15 UIKit 0x00601d4a -[UIWindow _sendGesturesForEvent:] + 1291
16 UIKit 0x00602c6a -[UIWindow sendEvent:] + 1030
17 UIKit 0x005d6a36 -[UIApplication sendEvent:] + 242
18 UIKit 0x005c0d9f _UIApplicationHandleEventQueue + 11421
19 CoreFoundation 0x023d08af __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15
20 CoreFoundation 0x023d023b __CFRunLoopDoSources0 + 235
21 CoreFoundation 0x023ed30e __CFRunLoopRun + 910
22 CoreFoundation 0x023ecb33 CFRunLoopRunSpecific + 467
23 CoreFoundation 0x023ec94b CFRunLoopRunInMode + 123
24 GraphicsServices 0x032c89d7 GSEventRunModal + 192
25 GraphicsServices 0x032c87fe GSEventRun + 104
26 UIKit 0x005c394b UIApplicationMain + 1225
27 MyApp 0x00002cfb main + 235
28 libdyld.dylib 0x01f42725 start + 0
29 ??? 0x00000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
应用崩溃的行是:
NSIndexPath *indexPath = [table indexPathForCell:cell]; }
答案 0 :(得分:18)
在iOS7中UITableViewWrapperView
是UITableViewCell
的超级视图,这意味着另一个超级视图:
<强> iOS7:强>
UITableView *tableView = (UITableView *)cell.superview.superview;
<强> iOS6" 的强>
UITableView *tableView = (UITableView *)cell.superview;
您可以找到另一项更改here:
似乎是你的代码:UITableView table =(UITableView )[[[sender superview] superview] superview];返回UITableViewCell
而不是UITableView
。
尝试以下方法:
UITableView *table = (UITableView*)[[[[[sender superview] superview] superview] superview] superview];
答案 1 :(得分:7)
Apple更改了iOS 7中的UITableViewCell层次结构
使用iOS 6.1 SDK
<UITableViewCell>
| <UITableViewCellContentView>
| | <UILabel>
使用iOS 7 SDK
<UITableViewCell>
| <UITableViewCellScrollView>
| | <UITableViewCellContentView>
| | | <UILabel>
因此,如果您想在按钮索引处获取indexpath,请使用以下代码使用iOS 6或更高版本的SDK
UITableViewCell *clickedCell = (UITableViewCell *)[[sender superview] superview];
NSIndexPath *clickedButtonPath = [book_table indexPathForCell:clickedCell];
NSLog(@"index=%@",clickedButtonPath);
使用iOS 7或7+ SDK
UITableViewCell *clickedCell = (UITableViewCell *)[[[sender superview] superview]superview];
NSIndexPath *clickedButtonPath = [book_table indexPathForCell:clickedCell];
NSLog(@"index=%ld",(long)clickedButtonPath.item);
答案 2 :(得分:3)
它确实有效,但我们有多超级?
答案 3 :(得分:3)
我有类似的问题,我必须从TableView
中找到textFileds值if ([Util isiOSVerGreaterThen7]) { // iOS 7
UIView *contentView = (UIView *)[textField superview];
UITableViewCell *cell = (UITableViewCell *)[contentView superview];
UITableView *tableView = (UITableView *)cell.superview.superview;
NSIndexPath *indexPath = [tableView indexPathForCell:cell];
NSInteger sectionOfTheCell = [indexPath section];
NSInteger rowOfTheCell = [indexPath row];
}
else { // iOS 6
UITableViewCell *cell = (UITableViewCell *)[textField superview];
UITableView *table = (UITableView *)[cell superview];
NSIndexPath *pathOfTheCell = [table indexPathForCell:cell];
NSInteger sectionOfTheCell = [pathOfTheCell section];
NSInteger rowOfTheCell = [pathOfTheCell row];
}
和Util是
+ (BOOL)isiOSVerGreaterThen7 {
if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1) {
return NO;
} else {
return YES;
}
}
答案 4 :(得分:1)
最好使用
NSIndexPath *indexPath = [self.callTable indexPathForCell:(UITableViewCell *)[[[sender superview] superview] superview]];
NSLog(@"%d",indexPath.row);
答案 5 :(得分:1)
这是我认为最好的方式:
CGPoint subviewPosition = [sender convertPoint:CGPointZero toView:self.myTable];
NSIndexPath * indexPath = [self.myTable indexPathForRowAtPoint:subviewPosition];
您可以在此处获取索引路径。无论是iOS7还是iOS6,它都将返回正确的索引路径