我如何知道UITableViewCell当前是否存在?

时间:2013-08-11 04:10:03

标签: ios

鉴于UITableViewCell的indexPath,我想知道该单元格当前是否存在。

我知道如何检查它是否在屏幕上(使用tableView.indexPathsForVisibleRows)。但是,我也想知道它是否在屏幕外但已经创建(假设用户已滚动但尚未进入屏幕)。

我该怎么做?

6 个答案:

答案 0 :(得分:10)

你可以做到

[self.tableView cellForRowAtIndexPath:indexPath];

(不要与数据源方法[self tableView:cellForRowAtIndexPath:]混淆),如果存在该索引路径的单元格,则返回该单元格。否则,您将获得nil

你绝对不希望你的后台更新过程直接引用单元格,因为正如你所说,它可能已经滚动屏幕并在获取完成时被回收。相反,保持对索引路径的引用或可用于查找索引路径的某些数据,然后使用该索引路径和上述方法来检索单元格。

答案 1 :(得分:2)

存在的唯一单元格是当前可见的单元格。当单元格在视图外滚动时,单元格对象可供UITableViewCell dequeueReusableCellWithIdentifier method使用,这是操作系统在处理大量表格数据时如何节省内存,以便在如此少量的实际内容中显示房地产。

如果你想跟踪已经看过哪些单元格,你应该修改底层对象,以便在将对象数据提供给应用程序“{{中的表格视图单元格时设置某种BOOL或值。 1}}“方法。

答案 2 :(得分:2)

如果您按dequeueReusableCellWithIdentifier:重复使用单元格,则tableView将像传送器一样执行。已经滚动屏幕的单元格将立即转移到将要进入屏幕的单元格。从理论上讲,tableView不会为您创建超过屏幕的单元格。因此,想要了解屏幕上的单元格是没有意义的。

UITableViewCell只是根据MVC Pattern的观点。您的模型和数据决定了特定indexPath中特定单元格中应该存在的内容。你的代码可能会是这样的:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // dequeue a cell
    // ...
    if (!cell)
    {
        // init a cell
        // ...
    }

    // for a given indexPath, decide what should be presented in the cell, something like updating the cell's properties
    cell.textLabel.text = [self.data dataShouldBePresentedAtIndexPath:indexPath];
}

答案 3 :(得分:0)

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // dequeue a cell
    // ...
    if (cell == nill)
    {
        // init a cell
        // ...
    }

    // for a given indexPath, decide what should be presented in the cell, something like updating the cell's properties
    cell.textLabel.text = [self.data dataShouldBePresentedAtIndexPath:indexPath];
}

你可以检查细胞是否存在....希望这有效......:)

答案 4 :(得分:0)

或者你也可以这样做

-(BOOL) isRowPresentInTableView:(int)row withSection:(int)section
{
    if(section < [self.tableView numberOfSections])
    {
        if(row < [self.tableView numberOfRowsInSection:section])
        {
            return YES;
        }
    }
    return NO;
}

答案 5 :(得分:0)

Swift 3

let YOURINDEXPATH = IndexPath(row: 4, section: 0)

if tableView.cellForRow(at: YOURINDEXPATH) != nil {

    // DO YOUR STUFFS HERE
}
  

相应地定义索引路径(YOURINDEXPATH)