我有一个表视图和这个方法来查找其中一个单元的子视图的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 ...
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
}
答案 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;
}