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】:你应该使用UITableView
的insertRowsAtIndexPaths: 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 中最近添加的行的 indexPath
如何快速获取UITableView中每个动态创建的行的textvalue