显示上一个单元格时添加表格单元格在ios

时间:2012-05-14 14:00:48

标签: ios uitableview cell reloaddata

我设定了。显示最后一个单元格时,按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;
 }

这种方式是个问题。

  1. 如果我在tableview重新加载数据时滚动表,那么for tableview就会消失并显示出来。

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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

请参阅此问题:UITableView add cell Animation

还要确保使用以下命令在主线程中执行UI的任何更新:

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

关于您的代码的一些评论:

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