2013-09-23 37 views
9

我得到的UITableViewCell一个UIButton属于这样的:获取的UITableViewCell与上海华在iOS的7

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

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

而且它在任何iOS的7前工作正常,但给我:

[UITableViewCellScrollView项目]:如果我在的iOS 7上运行应用程序,但如果我这样做发送到实例0x17ae2cf0

无法识别的选择:

-(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); 

但跆拳道是怎么回事!? 有谁知道为什么会发生这种情况?

谢谢!

+2

你的代码是根据的UITableViewCell的'私有子视图结构'。很明显,iOS 7中的结构已经发生了变化。有很多更安全的方法来执行您想要的操作。并且你的新代码将在iOS 7.1和iOS 8下破解。 – rmaddy

+0

@rmaddy什么是更安全的方式? – Mundi

+1

你可以遍历superviews,检查它们是否是类类型的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