Getting UITableViewCell with superview in iOS 7

本秂侑毒 提交于 2019-11-30 16:53:59

问题


I'm getting the UITableViewCell a UIButton belongs to like this:

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

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

And it works fine in anything before iOS 7. But gives me:

[UITableViewCellScrollView item]: unrecognized selector sent to instance 0x17ae2cf0

if I run the app in iOS 7. BUT if I do:

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

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

Then it works in iOS 7 but not earlier?!?!?!

I'm circumventing the issue by doing this:

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

but WTF is going on!? Does anyone know why this happens?

Thanks!


回答1:


A better solution is to add a category for UIView(SuperView), and calling it by:

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

This way, your code works for all future and past iOS versions

@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



回答2:


The best way to do this is:

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



回答3:


To complete the answer of @thomas-keuleers this is the swift method:

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
    }

}

and you simply call like that:

child.findSuperViewWithClass(TableViewCell)



回答4:


A shorter Version in swift 5

extension UIView {
   var xsuperView = self.superview

   while xsuperView != nil {
        if let superView = xsuperView.self as? T {
            return superView
        } else {
            xsuperView = xsuperView?.superview
        }
    }
}



回答5:


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

}

else //check next :


来源:https://stackoverflow.com/questions/18962771/getting-uitableviewcell-with-superview-in-ios-7

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!