在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 :