UItableview indexPathForCell - iOS6 'v' iOS7

Posted

技术标签:

【中文标题】UItableview indexPathForCell - iOS6 \'v\' iOS7【英文标题】:UItableview indexPathForCell - iOS6 'v' iOS7UItableview indexPathForCell - iOS6 'v' iOS7 【发布时间】:2013-10-09 20:44:14 【问题描述】:

我创建了一个带有嵌入式分段控件的自定义 UItableviewcell,当单击分段控件时,我有一个需要行索引路径的方法。使用ios7以下运行良好,我得到了索引路径,然后可以更新自定义单元格中的其他值。

    NSIndexPath *indexPath = [self.tableView indexPathForCell:(UITableViewCell *)[[[sender superview] superview] superview]];

不幸的是,当我使用 iOS6 进行测试时,indexPath 被设置为 NULL,现在 iOS6 和 iOS7 的工作方式有什么不同吗?

【问题讨论】:

【参考方案1】:

做一些研究我没有这样做是最好的方法,而不是使用 superview 我现在搜索视图层次结构。

UIView *view = sender;
while (![view isKindOfClass:[UITableViewCell class]]) 
    view = [view superview];

这现在适用于 iOS6 和 7,我遇到的另一个问题是分段控件的默认高度与 iOS7 不同并影响行高。

【讨论】:

我怀疑视图层次结构发生了变化。使用类似“3 个 superview 的视图是 TableViewCell”这样的逻辑不是很稳定。 搜索视图层次一般不是很稳定。如果发件人不在 UITableViewCell 中,您的代码也可能导致无限循环。【参考方案2】:

您可以创建 UISegmentedControl 的子类并添加 indexPath 属性,然后只需在 cellForRowAtIndexPath 中设置 indexPath:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    SegmentCell *returnCell = [tableView dequeueReusableCellWithIdentifier:@"SegmentCell" forIndexPath:indexPath];
    returnCell.segmentedControl.indexPath = indexPath;

    return returnCell;

更简洁,如果视图层次结构发生变化,您的解决方案也不会中断。

【讨论】:

【参考方案3】:

这是我认为最好的方式:

CGPoint subviewPosition = [sender convertPoint:CGPointZero toView:self.myTable];

NSIndexPath* indexPath = [self.myTable indexPathForRowAtPoint:subviewPosition];

不管是iOS6还是7,都会返回正确的索引路径

【讨论】:

【参考方案4】:

这是因为在 iOS7 中 UITableViewWrapperView 是 UITableViewCell 的父视图,与 iOS6 不同

你应该使用

if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1)       
//iOS7

NSIndexPath *indexPath = [self.tableView indexPathForCell:(UITableViewCell *)[[[sender superview] superview] superview]];

 else 

//iOS6

NSIndexPath *indexPath = [self.tableView indexPathForCell:(UITableViewCell *)[[sender superview] superview]];


感谢 null (UITableViewCell indexPath crash in iOS7)

【讨论】:

以上是关于UItableview indexPathForCell - iOS6 'v' iOS7的主要内容,如果未能解决你的问题,请参考以下文章

UItableview 单元格的动态高度与 UItableview 单元格内的 UItableview

UITableView

水平 UITableView 中的垂直 UITableView

如何与重叠显示的 UITableView 交互另一个 UITableView

在 UITableView 中的 UINib 中重新加载 UITableView

iOS小技能:1. 什么是UITableView? 2. UITableView如何展示数据