2013-09-23 3 views
9

Я получаю UITableViewCell UIButton принадлежит это нравится:Получение UITableViewCell с надтаблицей в прошивке 7

-(void)buttonHandler:(UIButton *)button { 

    OrderCell *cell = [[button superview] superview]; 
    NSLog(@"cell.item = %@", cell.item.text); 

И это прекрасно работает в чем-нибудь, прежде чем прошивка 7. Но дает мне:

[UITableViewCellScrollView пункт]: непризнанный селектор направлен например 0x17ae2cf0

если я запустить приложение в прошивке 7. НО, если я:

-(void)buttonHandler:(UIButton *)button { 

    OrderCell *cell = [[[button superview] superview] superview]; 
    NSLog(@"cell.item = %@", cell.item.text); 

Затем он работает в iOS 7, но не раньше?!?!?!

я обхожу этот вопрос, как это сделать:

OrderCell *cell; 
if([[[UIDevice currentDevice] systemVersion] isEqualToString:@"7.0"]) 
    cell = [[[button superview] superview] superview]; 
else 
    cell = [[button superview] superview]; 

NSLog(@"cell.item = %@", cell.item.text); 

но WTF происходит !? Кто-нибудь знает, почему это происходит?

Спасибо!

+2

Ваш код был в зависимости от частной подвид структуры 'UITableViewCell '. Очевидно, что структура изменилась в iOS 7. Есть гораздо более безопасные способы делать то, что вы хотите. И ваш новый код будет разбит под iOS 7.1 и iOS 8. – rmaddy

+0

@rmaddy Что такое безопасный способ? – Mundi

+1

Вы можете выполнять итерацию через супервизоры, проверяя, имеют ли они тип класса UITableViewCell и затем возвращают это представление? См. Ответ: – CW0007007

ответ

27

Лучшее решение добавить категорию для UIView (SuperView), и назвав его:

UITableViewCell *cell = [button findSuperViewWithClass:[UITableViewCell class]] 

Таким образом, ваш код работает для всех будущих и прошлых IOS версии

@interface UIView (SuperView) 

- (UIView *)findSuperViewWithClass:(Class)superViewClass; 

@end 


@implementation UIView (SuperView) 

- (UIView *)findSuperViewWithClass:(Class)superViewClass { 

    UIView *superView = self.superview; 
    UIView *foundSuperView = nil; 

    while (nil != superView && nil == foundSuperView) { 
     if ([superView isKindOfClass:superViewClass]) { 
      foundSuperView = superView; 
     } else { 
      superView = superView.superview; 
     } 
    } 
    return foundSuperView; 
} 
@end 
+9

Этот код можно улучшить, добавив 'break', как только вы найдете соответствующий супервизор. Не нужно каждый раз подниматься до окна. – rmaddy

-2
if ([[button superView] isKindOfClass:[UITableViewCell class]]) { 

} 

else //check next : 
13

лучший способ сделать это:

CGPoint buttonPosition = [sender convertPoint:CGPointZero toView:self.tableView]; 
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:buttonPosition]; 
UITableViewCell *cell = (UITableViewCell*)[self.tableView cellForRowAtIndexPath:indexPath]; 
+0

Лучший ответ, очень надежное решение – zest

3

Чтобы завершить ответ @ Томаса- keuleers это быстры способ:

extension UIView { 

    func findSuperViewWithClass<T>(superViewClass : T.Type) -> UIView? { 

     var xsuperView : UIView! = self.superview! 
     var foundSuperView : UIView! 

     while (xsuperView != nil && foundSuperView == nil) { 

      if xsuperView.self is T { 
       foundSuperView = xsuperView 
      } else { 
       xsuperView = xsuperView.superview 
      } 
     } 
     return foundSuperView 
    } 

} 

и вы просто звоните так:

child.findSuperViewWithClass(TableViewCell) 
+0

child.findSuperViewWithClass (TableViewCell.self) – sasquatch