UITableViewCell index drop in iOS7

I have a UITableViewCell in a UITableViewController . There is a button in my cell that, when you click, takes you to another view using prepareforsegue . In prepareforsegue I do this:

 if ([[segue identifier] isEqualToString:@"MySegue"]) { UITableViewCell *cell = (UITableViewCell*) [[sender superview] superview]; UITableView *table = (UITableView*)[[[sender superview] superview] superview]; NSIndexPath *indexPath = [table indexPathForCell:cell]; } 

Ok! Everything always worked well. But now, when I updated xCode using iOS7, when I click the button located in the cell, I get an error, and I don’t know how to solve it:

 [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 

The line where the application crashes:

  NSIndexPath *indexPath = [table indexPathForCell:cell]; } 
+6
source share
6 answers

In iOS7, the UITableViewWrapperView houses the UITableViewWrapperView add-in , which means another observation for you:

iOS7:

 UITableView *tableView = (UITableView *)cell.superview.superview; 

iOS6 "

 UITableView *tableView = (UITableView *)cell.superview; 

Another change can be found here :

Your code seems to be: UITableView table = (UITableView) [[[sender superiew] superiew] superview]; returns a UITableViewCell not a UITableView .

Try the following:

 UITableView *table = (UITableView*)[[[[[sender superview] superview] superview] superview] superview]; 
+18
source

Apple will change UITableViewCell hierarchy in iOS 7

Using iOS 6.1 SDK

 <UITableViewCell> | <UITableViewCellContentView> | | <UILabel> 

Using iOS 7 SDK

 <UITableViewCell> | <UITableViewCellScrollView> | | <UITableViewCellContentView> | | | <UILabel> 

So, if you want to get the index in the button pointer, use the following code. Using iOS 6 or later SDK

 UITableViewCell *clickedCell = (UITableViewCell *)[[sender superview] superview]; NSIndexPath *clickedButtonPath = [book_table indexPathForCell:clickedCell]; NSLog(@"index=%@",clickedButtonPath); 

Using iOS 7 or 7+ SDK

 UITableViewCell *clickedCell = (UITableViewCell *)[[[sender superview] superview]superview]; NSIndexPath *clickedButtonPath = [book_table indexPathForCell:clickedCell]; NSLog(@"index=%ld",(long)clickedButtonPath.item); 
+7
source

It works for sure, but how super can we get?

+3
source

I had a similar problem when I had to find the textFileds value from the TableView

 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]; } 

And util

 + (BOOL)isiOSVerGreaterThen7 { if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1) { return NO; } else { return YES; } } 
+3
source

Better to use

 NSIndexPath *indexPath = [self.callTable indexPathForCell:(UITableViewCell *)[[[sender superview] superview] superview]]; NSLog(@"%d",indexPath.row); 
+1
source

This is the best way, I think:

CGPoint subviewPosition = [sender convertPoint: CGPointZero toView: self.myTable];

NSIndexPath * indexPath = [self.myTable indexPathForRowAtPoint: subviewPosition];

You can just get the index path here. Whether iOS7 or iOS6, it will return the correct pointer path

+1
source

Source: https://habr.com/ru/post/954265/


All Articles