在iOS 7中使用superview获取UITableViewCell

我得到一个UIButton属于这样的UITableViewCell:

-(void)buttonHandler:(UIButton *)button { OrderCell *cell = [[button superview] superview]; NSLog(@"cell.item = %@", cell.item.text); 

它在iOS 7之前的任何工作都可以正常工作。但是,给我:

[UITableViewCellScrollView项目]:无法识别的select器发送到实例0x17ae2cf0

如果我在iOS 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); 

但跆拳道正在进行!? 有谁知道为什么发生这种情况?

谢谢!

更好的解决scheme是为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 

最好的办法是:

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

为了完成@ thomas-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) 
 if ([[button superView] isKindOfClass:[UITableViewCell class]]) { } else //check next :