IndexPathForCell возвращает NULL под IOS 7, отлично работает под IOS 6

Я надеюсь, что приложения для IOS 7 будут приняты Apple, мы можем поговорить об этом?

Я пытаюсь исправить свое приложение, чтобы оно работало на IOS 7 и сегодня очень хорошо продвигалось. У меня две нерешенные проблемы, но я буду размещать их отдельно. Первая проблема - это строка (я добавил строку журнала после ее отладки)...

 NSIndexPath *indexPath = [settingsTableView indexPathForCell:(UITableViewCell *)[sender superview]];
 NSLog(@"Changed %@ <-**-> %@", [sender superview], indexPath );

Журнал показывает....

IOS7

 2013-09-11 22:18:02.985 BusTimes[21013:a0b] Changed <UITableViewCellScrollView: 0xbfc1c80; frame =  (0 0; 320 44); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0xbfc1e70>; layer = <CALayer: 0xbfc1540>; contentOffset: {0, 0}> <-**-> (null)

 2013-09-11 22:18:08.577 BusTimes[21013:a0b] Changed <UITableViewCellScrollView: 0xbfc62d0; frame = (0 0; 320 44); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0xbfc64c0>; layer = <CALayer: 0xbfc5b90>; contentOffset: {0, 0}> <-**-> (null)

IOS 6

2013-09-11 22:25:34.495 BusTimes[2116:907] Changed <UITableViewCell: 0x20862f40; frame = (0 179; 320 44); text = 'Reminder Mins: 5'; autoresize = W; layer = <CALayer: 0x208523d0>> <-**-> <NSIndexPath 0x20861430> 2 indexes [0, 3]
2013-09-11 22:25:47.499 BusTimes[2116:907] Changed <UITableViewCell: 0x20865180; frame = (0 223; 320 44); text = 'AutoRefresh Secs: 60'; autoresize = W; layer = <CALayer: 0x20865340>> <-**-> <NSIndexPath 0x2085c0d0> 2 indexes [0, 4]

Итак, в IOS 7 indexPath всегда (null), а .section и .row всегда равны 0. Но это отлично работает на IOS 6 и возвращает .section 0 и row 3, и .row 4. Может ли кто-нибудь предложить, как я могу заставить IOS 7 вести себя одинаково для меня?

Большое спасибо заранее.

Плазма

* РЕШЕНИЕ - я изменил свой код на это, следуя комментариям *

UIView *view = sender;

while (![view isKindOfClass:[UITableViewCell class]]) {
    view = [view superview];
}

NSIndexPath *indexPath = [settingsTableView indexPathForCell:(UITableViewCell *)view];

Ответы

Ответ 1

Обычно безопаснее не делать никаких предположений о иерархии представлений ячейки. Раньше я использовал категорию с такими методами в UIView, чтобы найти супервизор, который является ячейкой:

- (UIView*)ancestorOrSelfWithClass:(Class)cls {
  if ([self isKindOfClass:cls]) {
    return self;

  } else if (self.superview) {
    return [self.superview ancestorOrSelfWithClass:cls];

  } else {
    return nil;
  }
}

Итак, вы попросите [sender ancestorOrSelfWithClass:[UITableViewCell class]] получить фактическую ячейку, и она будет работать независимо от того, какая иерархия существует внутри ячейки.