标签:
这是我人生中的第一篇博客,兴奋,激动,哈哈!!!
UITableView时iOS中非常常用的一个控件,一般情况下那几个必须实现的代理方法就够我们实现一些简单的界面了。但有时候猛然遇到一个关于tableview的问题,也会令像我这种的小白不知所措。
- (NSIndexPath *)GetIndexPath:(id)sender
{
UIButton *btn = ((UIButton *)sender);
UITableViewCell *cell = (UITableViewCell *)[[btn superview] superview];
return [self.tableView indexPathForCell:cell];
}
sender是cell上添加的一个控件,那么为什么要两个superview呢,因为在cell和它的子控件中间其实还有一层contentView。所以准确的说cell的子控件应该是contentView,而contentView的子控件才是sender。这是iOS7之前的情况,iOS7以后,在cell和contentView之间又多了一个scrollView,所以上边那句代码应该改成 UITableViewCell *cell = (UITableViewCell*)[[[btn superview] superview] superview];
这样在iOS7和iOS8.0好像都可以,但后面8.3就又不行了,至于为什么,我现在也没有弄清楚(哪位大神知道的话,记得告诉我一下哈)。但是我在网上发现了另一种获取cell的方法。
- (NSIndexPath *)GetIndexPath:(id)sender
{
UIView *view = sender;
while (view != nil && ![view isKindOfClass:[UITableViewCell class]]) {
view = [view superview];
}
UITableView *cell = (UITableView *)view;
return [self.tableView indexPathForCell:cell];
}
实用于任意层的层级关系,哈哈,确实霸气。
UITableViewCell的superview得到UItableView,这是iOS7以前的,7以后中间也多了一层UITableViewWrapperView。
第一次博客,略显简短、粗糙,欢迎大家指教
UITableView和UITableViewCell在不同iOS版本的层级关系
标签:
原文地址:http://www.cnblogs.com/FrankZwj/p/4531066.html