如何在UITableView中获取所有单元格

时间:2012-10-23 10:22:46

标签: ios uitableview

假设我有一个有多行的UITableView。我希望在某个时间点将所有UITableViewCells作为NSArray。我试过了

[tableView visibleCells] 

但是这种方法存在问题:我不能拥有当前屏幕中当前不存在的所有单元格。所以我转向另一种方法:

-(NSArray *)cellsForTableView:(UITableView *)tableView
{
    NSInteger sections = tableView.numberOfSections;
    NSMutableArray *cells = [[NSMutableArray alloc]  init];
    for (int section = 0; section < sections; section++) {
        NSInteger rows =  [tableView numberOfRowsInSection:section];
        for (int row = 0; row < rows; row++) {
            NSIndexPath *indexPath = [NSIndexPath indexPathForRow:row inSection:section];
            UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];   // **here, for those cells not in current screen, cell is nil**
            [cells addObject:cell];
        }
    }
    return cells;
}

但似乎这种方法仍然无法获得那些未在屏幕上显示的单元格。任何人都可以帮我吗?

9 个答案:

答案 0 :(得分:21)

我认为这不可能,因为tableView不存储所有单元格。它使用缓存机制,该机制仅存储一些不可见的单元以供重用。

为什么需要所有细胞?也许你可以实现,你正在尝试做什么,否则。

答案 1 :(得分:12)

这是Swift 3.0中最简单的解决方案

func getAllCells() -> [UITableViewCell] {

    var cells = [UITableViewCell]()
    // assuming tableView is your self.tableView defined somewhere
    for i in 0...tableView.numberOfSections-1
    {
        for j in 0...tableView.numberOfRowsInSection(i)-1
        {
            if let cell = tableView.cellForRowAtIndexPath(NSIndexPath(forRow: j, inSection: i)) {

               cells.append(cell)
            }

        }
    }
 return cells
 }

答案 2 :(得分:6)

每次创建单元格时,都可以将其添加到NSMutableArray中,您可以在需要时解析它:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CustomCell *Cell = [self dequeueReusableCellWithIdentifier:@"Custom_Cell_Id"];
    if (Cell == NULL)
    {
        Cell = [[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Custom_Cell_Id"]];
        [Cells_Array addObject:Cell];
    }
}

- (void) DoSomething
{
    for (int i = 0;i < [Cells count];i++)
    {
        CustomCell *Cell = [Cells objectAtIndex:i];
        //Access cell components
    }
}

答案 3 :(得分:1)

我认为您可能误解了UITableView的实施方式。需要理解的重点是,不可见的细胞实际上并不存在(或者至少它们可能不存在)

当滚动UITableView时,凭借dequeueReusableCellWithIdentifier,旧单元格被新单元格替换  用于

-(UITableViewCell) cellForRowAtIndexPath (NSIndexPath *)indexPath

答案 4 :(得分:1)

功能解决方案swift 4.1

/sbin/init

答案 5 :(得分:0)

你想要那些文字字段的价值吗?如果是,您可以使用indexpath.row

通过textfield的tag属性进行访问

答案 6 :(得分:0)

然而,获得当前单元格的更简单的实现将使用Set ie O(1)

/// Reference to all cells.
private var allCells = Set<UITableViewCell>()

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Your_Cell_ID") as! UITableViewCell
    if !allCells.contains(cell) { allCells.insert(cell) }
    return cell
}

答案 7 :(得分:0)

我想我找到了解决这个问题的窍门。试试这个;)

self.tableView.frame = CGRectMake(self.tableView.frame.origin.x, self.tableView.frame.origin.y, self.tableView.contentSize.width, self.tableView.contentSize.height);

UITableView根据cellForRowAtIndexPath的高度调用tableView.frame,因此您应该更新tableView的高度。

答案 8 :(得分:-3)

我没有在我的xcod中测试过,但我认为这可以帮助您,或者您可以通过此代码了解并实现自己的。

 -(NSMutableArray *)cellsForTableView:(UITableView *)tableView
  {
  NSMutableArray *cells = [[NSMutableArray alloc]  init];

//Need to total each section
for (int i = 0; i < [tableView numberOfSections]; i++) 
{
    NSInteger rows =  [tableView numberOfRowsInSection:i];
    for (int row = 0; row < rows; row++) {
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:row inSection:i];
        UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
        for (UIView *subView in cell.subviews)
        {
            if ([subView isKindOfClass:[UITextField class]]){
                UITextField *txtField = (UITextField *)subView;
                [cells addObject:txtField.text];

            }
        }

    }

}
return cells;

}

-(void) reloadViewHeight
 {
    float currentTotal = 0;

//Need to total each section
for (int i = 0; i < [self.tableView numberOfSections]; i++) 
{
    CGRect sectionRect = [self.tableView rectForSection:i];
    currentTotal += sectionRect.size.height;
}

//Set the contentSizeForViewInPopover
self.contentSizeForViewInPopover = CGSizeMake(self.tableView.frame.size.width, currentTotal);

}