首先,我删除tableView中的一个单元格,然后我想在tableView中添加另一个新单元格,但新单元格不是新单元格,它只是我删除的单元格。我知道dequeueReusableCellWithIdentifier是什么意思。我想当删除一个单元格时,dequeueReusableCellWithIdentifier中的缓存也会被删除。为什么不呢?
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSLog(@"table reload");
PDFModel* tempmodel=[PDFArray objectAtIndex:indexPath.row];
NSString * CellIdentifier=tempmodel.PDFName;
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
NSLog(@"cell %x",cell);
if (cell == nil)
{
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
//custom the cell
cell.text=...
}
return cell;
}
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
if (editingStyle==UITableViewCellEditingStyleDelete)
{
[PDFArray removeObjectAtIndex:indexPath.row];
NSMutableArray* array=[[NSMutableArray alloc] init];
[array addObject:indexPath];
[self.tableView deleteRowsAtIndexPaths:array withRowAnimation:UITableViewRowAnimationRight];
}
}
答案 0 :(得分:2)
你的问题有点奇怪,但我想你想知道以下代码是做什么的?
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
代码的作用是,它试图检索缓存的UITableView单元格。这是为了减少iPhone上的内存使用量。
删除单元格后,还应该从数据源(通常是数组)中删除数据,例如:
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle==UITableViewCellEditingStyleDelete)
{
// remove object from array ...
[dataArray removeObjectAtIndex:indexPath.row];
}
}
(请记住:您只能在运行时从NSMutableArray中删除项目,而不能从NSArray中删除)
如果重新绘制单元格,您将首先检查需要重绘的单元格,然后从数据源检索适当的数据,这全部由UITableViewDataSource委托方法完成。您只需确保从数组中检索正确的内容并在重绘时更新单元格的内容,例如像这样:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"CellIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
// no cached cell is found, create a new cell ...
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
// add some defaults for cells in the initializer,
// stuff that's done here should be important for
// all displayed cells, for example background image.
}
// update the cell's content, e.g.: - it will only display content that's currently in the array, deleted objects shouldn't exist in the array at this point
NSString *title = [dataArray objectAtIndex:indexPath.row];
[cell.textLabel setText:title];
return cell;
}
答案 1 :(得分:2)
我认为你可以使用
NSString *CellIdentifier = [NSString stringWithFormat:@"Cell%d",indexPath.row];
而不是
NSString * CellIdentifier=tempmodel.PDFName;
请更换它&核实。我认为这对你很有帮助。
答案 2 :(得分:2)
没有理由删除UITableViewCell,因为它可以重复使用。在cellForRowAtIndexPath
再次处理该单元格之前,该单元格不会显示,因此它不会显示旧数据。但是,在新数据替换旧数据之后,可以重新使用布局的单元格 - 视图及其所有子视图。
想象一下,每个单元格都是白板(干擦板),它被切割成一定的大小,所有的基本信息区域都被刻在表面上:一个文本的位置,一个数字的另一个区域,在tableView:cellForRowAtIndexPath:
检查是否cell == nil
时,您正试图找出是否有可用的蚀刻白板可以擦除并写入关于干擦标记的新信息。如果没有那么它会切断并蚀刻一个全新的板来写信息,但如果有一个可以擦除,那么它只是用橡皮擦擦除旧信息并写入新信息。可以想象,这可以节省大量时间。
当用户滚动表格时,实际发生的是当一个单元格(白板)滚动到顶部并且不再可见时,系统会删除数据并将其移动到堆栈的底部;它将成为滚动视图的下一个。因此,系统只需要创建尽可能多的白板 - 任何时候都可以看到 - 实际上不存在屏幕外的白板。
当你删除一个单元格时,你真正在做的就是告诉表格(a)停止显示那个单元格,以及(b)设置一个标志,这样表格可以使用橡皮擦来擦除旧数据,但仍然可以重复使用白板。
在计算能力方面,创建单元的成本非常高。如果UITableView在用户滚动时每次进入视图时都必须创建一个新单元 - 在类比中,如果每次进入视图时它必须切出一个新的白板并将所有区域蚀刻到其中 - - 滚动会非常生涩,看起来很糟糕。通过重复使用单元格,仅替换更改的内容,表格可以在用户与其交互时平滑移动。
答案 3 :(得分:0)
您似乎对删除单元格(objective-c UI对象)与其显示的数据之间的区别感到困惑。
当您允许用户删除用户界面中的单元格时,您需要从数据模型中删除相应的数据
UITableView的实现在iOS中进行了高度优化,它可以缓存单元格(UI对象)以提高性能。您并不需要担心这一点,因为您的表格将根据您的数据进行最佳加载和显示。
在tableView:cellForRowAtIndexPath:
中,您可以执行以下操作:
尝试使单元格实例出列。这利用了UITableView
如果dequeue不返回单元格,请创建一个新单元格。
获得单元格后,使用数据模型中的相应数据对其进行配置
当用户从单元格中选择删除操作时,请从数据模型中删除数据。可选地,您可以动画从表中删除单元格或只是重新加载整个表格。
#4的细节取决于您想要的用户界面以及您配置数据模型的方式。
Apple文档非常适合解释这一点。