0

看到这篇文章,但没有解决我的问题。

iPhone 应用程序在 [self.tableView endUpdates] 上崩溃

拥有来自报纸网站的UITableView哪些文章。loads首先load按预期工作,但是当我再次使用UIRefreshControl文章时,我的应用程序在 ( )fetch时崩溃。animatinginserting rows

错误:

在此处输入图像描述

代码:

- (void)insertRowsWithAnimation
{
    NSMutableArray *indexPaths = [NSMutableArray array];
    NSInteger i = self.latestArticlesArray.count - self.latestArticlesArray.count;

    for (NSDictionary *dict in self.latestArticlesArray) {
        [indexPaths addObject:[NSIndexPath indexPathForRow:i inSection:0]];
        i++;
    }
    [self.tableView beginUpdates];
    [self.tableView insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationMiddle];
    [self.tableView endUpdates];
}

- (void)fetchEntries
{
    UIView *currentTitleView = [[self navigationItem] titleView];
    UIActivityIndicatorView *aiView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];

    [[self navigationItem] setTitleView:aiView];
    [aiView startAnimating];

    void (^completionBlock) (NSArray *array, NSError *err) = ^(NSArray *array, NSError *err) {
        if (!err) {
            [[self navigationItem] setTitleView:currentTitleView];
            self.latestArticlesArray = [NSArray array];
            self.latestArticlesArray = array;
            [self insertRowsWithAnimation];
        }
    };
    [[Store sharedStore] fetchArticlesWithCompletion:completionBlock];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return self.latestArticlesArray.count;
}

如果您想查看更多方法,请告诉我。希望你能帮忙。从我目前所了解到的情况来看,我认为帖子的数量已经发生了变化,因此该表期望显示其他数量的文章?

4

3 回答 3

2

它第一次加载的原因是因为您每次都插入了许多行,所以在第一次运行时,行数从 0 变为数组中的计数(在完成块中),并且您使用数字调用 insertRows索引路径的数量等于数组的计数。

第二次调用它是在插入新行,但没有更新计数以反映新的总和。您应该将现有数组添加到完成块中返回的数组中,并在 numberOfRowsInSection 中返回该组合数组的计数

于 2013-03-24T13:24:32.300 回答
2

线

NSInteger i = self.latestArticlesArray.count - self.latestArticlesArray.count;

设置为零i,因此使用空数组调用。insertRowsAtIndexPaths

我假设您的意图是insertRowsAtIndexPaths使用新添加行的行号进行调用,但是您必须在替换数组之前记住旧数据

self.latestArticlesArray = array;

但请注意,由于您替换了整个数组,您也可以调用

[self.tableView reloadData];

而不是beginUpdates/ insertRowsAtIndexPaths/ endUpdates


更新:我的第一个分析是错误的(而 wattson12 的分析是正确的)。正如您在评论中所说,您只需要一个简单的动画即可删除所有先前的行并在获取后插入新行。这可以这样做:

- (void)replaceArticlesWithAnimation:(NSArray *)articles
{
    NSUInteger oldCount = [self.latestArticlesArray count];
    self.latestArticlesArray = articles;
    NSUInteger newCount = [self.latestArticlesArray count];

    [self.tableView beginUpdates];
    for (NSUInteger i = 0; i < oldCount; i++) {
        [self.tableView deleteRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:i inSection:0]] withRowAnimation:UITableViewRowAnimationAutomatic];
    }
    for (NSUInteger i = 0; i < newCount; i++) {
        [self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:i inSection:0]] withRowAnimation:UITableViewRowAnimationAutomatic];
    }
    [self.tableView endUpdates];
}

fetchEntries你打电话

if (!err) {
    [[self navigationItem] setTitleView:currentTitleView];
    [self replaceArticlesWithAnimation:array];
}
于 2013-03-24T13:05:01.150 回答
1
dispatch_async(dispatch_get_main_queue(), ^(void){
        //Run UI Updates
    });
于 2017-06-15T08:47:38.827 回答