2013-09-20 3 views
6

У меня есть UITableViewCell в UITableViewController. В моей ячейке есть кнопка, которая, когда вы нажимаете, переводит вас в другую view с prepareforsegue. В prepareForSegue я это делаю:UITableViewCell indexPath crash в iOS7

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

Ok! Все всегда хорошо работало. Но теперь, когда я модернизировал Xcode с iOS7, когда я нажимаю на кнопку, расположенную в ячейке, ошибка представляется мне, и я не знаю, как решить эту проблему:

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

ответ

18

В iOS7 UITableViewWrapperView является SuperView из UITableViewCell, что означает еще SuperView для вас:

iOS7:

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

iOS6"

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

Еще одно изменение вы можете найти его here:

кажется ваш код: UITableView таблица = (UITableView) [[[отправитель SuperView] SuperView] SuperView]; возвращает UITableViewCell не UITableView.

Попробуйте ниже:

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

Спасибо! Теперь работать! – Pinturikkio

+0

Same problem thanks Null :) –

+0

@JamieWest мое удовольствие :-) – null

3

Он работает точно, но как супер мы можем получить?

7

Apple, изменить иерархию UITableViewCell в прошивке 7

Использование 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); 
3

I была аналогичная проблема, где я должен был найти значение textFileds от 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]; 
     } 

И Util является

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

Это лучше использовать

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

Thanx .... пользователь366584 – user968597

1

Это самый лучший способ, я думаю:

CGPoint subviewPosition = [отправитель конверсии: CGPointZero toView: self.myTable];

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

Вы можете просто получить указательный путь здесь. Будь то iOS7 или iOS6, он вернет правильный путь указателя