显示最后一个单元格时添加表格单元格。在ios中

Posted

技术标签:

【中文标题】显示最后一个单元格时添加表格单元格。在ios中【英文标题】:Adding table cell when last cell displayed. in ios 【发布时间】:2012-05-14 14:00:47 【问题描述】:

我设置了。显示最后一个单元格时,通过threadProcess添加单元格。

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell      forRowAtIndexPath:(NSIndexPath *)indexPath
 
    int nArrayCount;
    nArrayCount=[self.mAppGameList count];
    int row= (int)indexPath.row ;

    if(row == nArrayCount)
    
        if(mSearchGame_Thread != nil)
            return;

        NextSearchCell *searchCell =(NextSearchCell *)cell;

        [searchCell.mActivityView startAnimating];

        NSThread *searchThread = [[NSThread alloc] initWithTarget:self
                                                         selector:@selector(searchNextThreadProc:) object:tableView];

        self.mSearchGame_Thread = searchThread;
        [searchThread release];
        [self.mSearchGame_Thread start];
        // start new search ...

    

//线程方法

  -(void)searchNextThreadProc:(id)param
 

    UITableView *tableView=(id)param;

    NSMutableArray *newArray;

    newArray=[NSMutableArray arrayWithArray:self.mAppGameList];

    NSArray *pressedlist;
    nArrayCount=[self.mAppGameList count];

               .
               .
               .
   [newArray addObject:item];
   self.mAppGameList = newArray;

     [tableView reloadData];

     self.mSearchGame_Thread=nil;
 

这种方式有问题。

    如果我在tableview重新加载数据时滚动表格,有一段时间tableview消失并出现。

    如果我在添加下一个单元格时触摸单元格,有时会出现坏的 exc 内存。 我认为,它在重新加载新表之前调用 tableView: didSelectRowAtIndexPath: 方法。所以,表的数据不是。

所以,我想替换reload tableview的方式。有什么办法吗?请帮帮我。

【问题讨论】:

【参考方案1】:

您可以在 UITableView 中使用此方法通过动画添加新行,而不是使用 reloadData:

- (void)insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;

这样您的视图在重新加载时不会消失并重新出现。

看到这个问题:UITableView add cell Animation

还要确保在主线程中执行任何 UI 刷新,方法是:

[self performSelectorOnMainThread:@selector(refreshMethodName) withObject:nil waitUntilDone:NO];

关于您的代码的一些问题:

确保您的 mAppGameList 是保留属性或复制属性(如果在您的代码中按上述方式使用)。否则可能会导致访问不正确。 您应该确保 searchNextThreadProc 不会一次被多次调用,否则您可能会遇到时间和性能问题。它看起来不是线程安全的。 通常,您应该将内容数据与 UITableView 分开处理。将表格视图视为显示已存在数据列表的工具。它不应该担心搜索数据等。而是使用一个单独的类来保存您正在使用的 NSMutableArray 中的数据,您可以在需要时不断填充数据。这个类可以通过方法调用触发tableView开始搜索新数据,但要确保刷新过程是线程安全的,并且对UI的多次调用是可持续的!一次 10xrefresh 调用仍然意味着一次只刷新 1 次! (例如,我们不希望同时调用 10 个服务器)这个内容列表应该与 UITableView 的列表完全分开。 当有新数据可用时,通过创建可以调用的刷新方法告诉 UITableView 刷新。刷新UITableView时,如果mAppGameList属性为retain或copy,则无需重新添加列表中的所有数据。如果您在一个单独的类中有一个 NSMutableArray,其中包含建议的所有数据,只需使用类似 self.mAppGameList = [NSArray arrayWithArray:[yourClass gameList]]; (如果您对 mAppGameList 使用保留) 触发UITableView刷新时,使用performSelectorOnMainThread。要启动一个新的后台线程,您还可以使用 performSelectorInBackground 而不是 NSThread alloc 等。

【讨论】:

以上是关于显示最后一个单元格时添加表格单元格。在ios中的主要内容,如果未能解决你的问题,请参考以下文章

如何添加“加载更多”单元格,按下该单元格时会向表格视图添加更多行?

添加具有行动画的单元格时,将 tableview 保持在相同的滚动位置

在表格中悬停单元格时突出显示特定单元格

当我删除一个包含核心数据的单元格时,同一个单元格显示两次

在节的最后一行添加一个表格视图单元格

添加新单元格时 UITableViewCell 约束中断