indexPathForCell:返回nil

时间:2016-11-20 15:58:22

标签: ios objective-c uitableview

我有一个表视图和这个方法来查找其中一个单元的子视图的indexPath ...

- (NSIndexPath *)indexPathContainingView:(UIView *)view {
    while (view && ![view isKindOfClass:[UITableViewCell self]]) {
        view = view.superview;
    }
    UITableViewCell *cell = (UITableViewCell *)view;
    return (cell)? [self.tableView indexPathForCell:cell] : nil;
}

我用最顶层单元格的子视图调用(可见,表格视图已滚动),并且在return行上有一个断点,我得到了这个令人困惑的结果在lldb ...

enter image description here

cell看起来不错。单元格的表格视图与我的tableView匹配(有一些中间UITableViewWrapperView作为直接超级视图)。但是看看indexPathForCell:如何返回nil?我确信细胞是可见的。

我认为这不重要,但我开始的cell的子视图是UICollectionView,我在集合视图的数据源方法上调用它。

有什么想法吗?

编辑更多背景......

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

    // do stuff to setup the cell
    // now reload the collection view that it contains
    UICollectionView *collectionView = (UICollectionView *)[cell viewWithTag:33];
    [collectionView reloadData];

    return cell;
}

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
    NSIndexPath *indexPath = [self indexPathContainingView:collectionView];
    return // get my model from the index path and return the count of an array it contains
    // but here's the problem.  index path is nil here
}

1 个答案:

答案 0 :(得分:1)

假设您正在使用故事板,并且如果您愿意更改方法,那么您正在使用可能的解决方案(在我看来,这是一个更清洁的解决方案):

将单元格内UICollectionView的插座拖到UITableViewCell。在您的故事板中,再次通过拖动插座将delegate的{​​{1}}和dataSource设置为您的班级。当然,您必须使用自定义UICollectionView

UITableViewCell cellForRowAtIndexPath UITableView设置UICollectionView的标记为indexPath.row。现在,在您的numberOfItemsInSection中,您可以访问UICollectionView代码属性,它将包含您尝试访问的indexPath.row UITableViewCell,因此您可以访问您的模型。< / p>

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

    CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];

    // do stuff to setup the cell
    // now reload the collection view that it contains
    cell.collectionView.tag = indexPath.row;
    [cell.collectionView reloadData];
    return cell;
}

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {

// get my model from the index path and return the count of an array it contains
    Model *model = dataArray[collectionView.tag];

    return model.count;

}