UItableview indexPathForCell - iOS6'v'iOS7

时间:2013-10-09 20:44:15

标签: ios uitableview nsindexpath

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

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

不幸的是,当我使用iOS6对其进行测试时,indexPath被设置为NULL,现在它对iOS6和iOS的工作方式有所不同。 iOS7?

4 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    SegmentCell *returnCell = [tableView dequeueReusableCellWithIdentifier:@"SegmentCell" forIndexPath:indexPath];
    returnCell.segmentedControl.indexPath = indexPath;

    return returnCell;
}

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

答案 2 :(得分:0)

这是我认为最好的方式:

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

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

无论是iOS6还是7,它都会返回正确的索引路径

答案 3 :(得分:-1)

这是因为在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