UITableView 在保留已经获取的行的同时插入更多行

Posted

技术标签:

【中文标题】UITableView 在保留已经获取的行的同时插入更多行【英文标题】:UITableView Insert More Rows While Keeping The Already Fetched Ones 【发布时间】:2012-12-28 11:15:54 【问题描述】:

下面是我用来获取和解析不同页面的函数。

- (void)getFeed:(NSInteger) pageNumber

    collectedData = [[NSMutableData alloc] init];
    NSString *urlStr =[NSString stringWithFormat:@"http://sitename.com/feed/?paged=%d", pageNumber];
    NSURL *url = [NSURL URLWithString:urlStr];
    NSURLRequest *req = [NSURLRequest requestWithURL:url];
    conn = [[NSURLConnection alloc] initWithRequest:req delegate:self startImmediately:YES];

当用户向下滚动到 tableview 的底部时,我使用以下函数通过递增计数器来访问 feed 的第二页等等:

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView

    float endScrolling = scrollView.contentOffset.y + scrollView.frame.size.height;
    if (endScrolling >= scrollView.contentSize.height)
    
        counter ++;
        [self getFeed:counter];
    

问题在于,它不是将其加载到已获取的项目下方,而是重新加载 tableview 以显示新页面项目而旧页面项目消失。我想在现有页面下方加载新页面项目以无限滚动。我该怎么做?

【问题讨论】:

【参考方案1】:

回答你自己的问题感觉不好,但是在另一个论坛的帮助下,我能够找出答案。

tableview 控制器与可变数组不同步,所以我创建了另一个并附加了两个数组。

Step1:我创建了一个属性

@property (nonatomic, readonly) NSMutableArray *moreItems;

Step2:在调用 fetchEntries 之前初始化 ViewDidLoad 中的数组

moreItems = [[NSMutableArray alloc] init];

Step3:在 connectionDidFinishLoading 中,我将新数组 'moreItems' 附加到前一个数组 'items' 中

[moreItems addObjectsFromArray:[channel items]];

Step4:将numberOfRowsInSection中的数据源从

return [[channel items] count];

到新数组

return [moreItems count];

然后在 cellForRowAtIndexPath 中,使用了新的数组

RSSItem *item = [moreItems objectAtIndex:[indexPath row]];

【讨论】:

【参考方案2】:

你应该使用UITableViewinsertRowsAtIndexPaths: withRowAnimation:方法。

您必须注意的一点是,当您使用此方法时,tableView:numberOfRowsInSection 返回的行数应该等于number_of_existing_rows + number_of_newly_inserted_rows

【讨论】:

【参考方案3】:

在您检索完下一页的新提要后,获取数组中的对象。 将此数组中的这些对象添加到您的数据源数组中。 现在向表中插入行,如下所示:

[yourTable beginUpdates];
[yourTable insertRowsAtIndexPaths:indexPathsToInsert
                 withRowAnimation:UITableViewRowAnimationBottom];
[yourTable endUpdates];

其中“indexPathsToInsert”是 NSIndexPath 对象数组,从表中的最后一行开始,包含新对象的 indexPaths。

希望这会有所帮助。

【讨论】:

【参考方案4】:

你好,

创建一个for循环,起始索引是(数据源中的对象数)和要添加的对象数(计数),创建索引路径数组并调用insertRowsAtIndexpaths:withRowAnimation。希望代码对你有所帮助。

    NSInteger statingIndex = [self.tableViewDatasource count];
    NSInteger noOfObjects = //Get the no.of objects count from getFeed method.
    NSMutableArray *indexPaths = [[NSMutableArray alloc] init];

    for (NSInteger index = statingIndex; index < statingIndex+noOfObjects; index++) 

        [_objects addObject:]; // add the object from getFeed method.
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:index inSection:0];
        [indexPaths addObject:indexPath];
        [indexPath release];

    

    [self.tableView insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationFade];

【讨论】:

【参考方案5】:

每当您的数组添加了一个新对象时,您就调用它

-(void)insertRowInTableView
 
   int row = [YourDataSourceArray count];
   NSIndexPath *indexPath = [NSIndexPath indexPathForRow:row inSection:0];
   NSArray *indexPaths = [NSArray arrayWithObject:indexPath];
   [YourTableView insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationTop];
 

这里 YourDataSourceArray 是您从中设置 tableview 行数/数据的数组。 YourTableView 是您的 tableView 对象名称。

【讨论】:

我知道但我不知道如何使用这个功能 不幸的是,我无法在我的程序中使用这个。【参考方案6】:

这可能是因为当您从 web 服务获取数据时,您将其添加到用于填充表的数组中,这样您将只有新数据,您要做的就是必须将新数据附加到数组(使其成为可变数组并附加新数据),然后使用以下行

[your_Table reloadData];

希望这会对你有所帮助。

【讨论】:

我已经在这样做了,但这不是我的问题的解决方案。我必须使用 insertRowsAtIndexPaths 但我不知道如何 您是否希望新数据位于特定行。 @Jessica 如果您希望它们位于已获取行的末尾,那么您为什么要寻找 insertRowsAtIndexPaths。照我说的做,创建一个 iVar NSMutableArray *your_Array ,每次调用服务时,都会在数组中添加新数据,这些新数据将自动放在先前数据的末尾,然后重新加载表格 [Your_Table reloadData]; 【参考方案7】:

与其使用向下滚动来加载,不如使用 tableview 的最后一行作为“加载更多项目”,当用户选择该行时,获取新的提要并重新加载 tableview。

而且我对您的代码有一个疑问,每次在 getfeed 方法中,您都在创建数组 收集的数据。我怀疑您是否缺少将此数据附加到表数据源数据,这可能会导致仅在表视图中向您显示最近的提要数据。请检查

【讨论】:

使用 tableviewfooter 而不是滚动到底部也是一种可能。我认为现在我必须专注于主要问题 不,这是来自 masterdetail 模板的默认代码,它只是在顶部添加行 嗨,请检查下面的代码。首先,您需要在数据源中插入数据并创建调用 insertRowsAtIndexPaths:withRowAnimation。

以上是关于UITableView 在保留已经获取的行的同时插入更多行的主要内容,如果未能解决你的问题,请参考以下文章

UITableView 中同时插入/删除行的问题

获取 UITableView 中最近添加的行的 indexPath

如何快速获取UITableView中每个动态创建的行的textvalue

获取 MySQL 中现有行的插入语句

用于在 Swift 中删除 UITableView 中的行的编辑按钮不起作用

在 UiTableView reloadData 之后保留选定的部分/行