天天看點

UITableView和UITableViewCell在iOS不同版本中的結構差異

原創文章,轉載請注明出處:http://blog.csdn.net/jasonchen2009/article/details/44307329

UITableView是iOS開發中最為常見的視圖控件了,現在大多數App可能都是支援iOS7以上版本,相信大家也曾經或将要遇到UITableView或UITableViewCell在不同版本中的相容性問題,這裡做了一點簡單總結。

在iOS7中:

UITableView

~~~~UITableViewWrapperView

~~~~~~~~UITableViewCell

~~~~~~~~~~~~UITableViewCellScrollView

~~~~~~~~~~~~~~~~UITableViewCellContentView

~~~~~~~~~~~~~~~~~~~~UILabel

(UITableViewCellScrollView是什麼?http://www.curiousfind.com/blog/646)

在iOS6之前和在iOS8之後:

UITableView

~~~~UITableViewCell

~~~~~~~~UITableViewCellContentView

~~~~~~~~~~~~UILabel 

場景1:通過UILabel擷取到UITableViewCell

方案:

UIView *upperView = cell.label.superview;
    while(upperView && ![upperView isKindOfClass:[UITableViewCell class]])
    {
        upperView = upperView.superview;
    }
    return upperView;
           

場景2:擷取到UITableViewCellScrollView

方案:

if(![cell.contentView.superview isKindOfClass:[UITableViewCell class]])
    {
        UIView *cellScrollView = cell.contentView.superview;
        // Action on UITableViewScrollView
        // ...
    }
           

場景3:由UITableViewCell擷取到UITableView

方案A:

id view = [tableViewCellInstance superview];
while (view && ![view isKindOfClass:[UITableView class]])
{
    view = [view superview];
}
UITableView *tableView = (UITableView *)view;
           

方案B:自建一個 UITableViewCell的 Category

@implementation UITableViewCell(RelatedTableView)

- (UITableView *)relatedTableView
{
    if ([self.superview isKindOfClass:[UITableView class]])
    {    
        // For iOS6 and iOS8
        return (UITableView *)self.superview;
    }
    else if([self.superview.superview isKindOfClass:[UITableView class]])
    {
        // For iOS7

        return (UITableView *)self.superview.superview;

    }  
    else
    {
        NSAssert(NO, @"UITableView shall always be found.");
        return nil;
    }
}

@end
           

方案C:多數情況下我們的 cell 是自定義的 UITableViewCell的子類,是以可以在我們的cell中添加一條屬性,

@interface MyUITableViewCell

@property (weak, nonatomic) UITableView *relatedTableView;

@end
           

(為什麼是weak?循環引用帶來記憶體洩露。)

在cellForRowAtIndexPath方法中順便把自定義cell對應的UITableView賦給cell.relatedTableView。

參考:

http://stackoverflow.com/questions/15711645/how-to-get-uitableview-from-uitableviewcell

http://stackoverflow.com/questions/19162725/access-ios-7-hidden-uitableviewcellscrollview