8

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

- (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 以显示新页面项目和旧页面项目消失。我想在现有页面下方加载新页面项目以无限滚动。我怎样才能做到这一点?

4

7 回答 7

2

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

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

Step1:我创建了一个属性

@property (nonatomic, readonly) NSMutableArray *moreItems;

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

moreItems = [[NSMutableArray alloc] init];

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

[moreItems addObjectsFromArray:[channel items]];

Step4:将 numberOfRowsInSection 中的数据源从

return [[channel items] count];

到新阵列

return [moreItems count];

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

RSSItem *item = [moreItems objectAtIndex:[indexPath row]];
于 2012-12-30T05:48:05.180 回答
1

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

-(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 对象名称。

于 2012-12-28T11:19:03.930 回答
1

您应该insertRowsAtIndexPaths: withRowAnimation:使用UITableView.

您必须注意的一件事是,当您使用此方法时,重新调整的行数tableView:numberOfRowsInSection应等于number_of_existing_rows + number_of_newly_inserted_rows

于 2012-12-28T11:26:03.590 回答
1

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

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

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

希望这可以帮助。

于 2012-12-28T11:48:26.170 回答
1

你好,

创建一个 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];
于 2012-12-28T11:49:38.027 回答
0

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

[your_Table reloadData];

希望这会帮助你。

于 2012-12-28T11:23:54.263 回答
0

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

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

于 2012-12-28T11:27:41.890 回答