0

この投稿に出くわしましたが、私の問題は修正されませんでした。

[self.tableViewendUpdates]でiPhoneアプリがクラッシュする

UITableView新聞のウェブサイトからどのloads記事を持っているか。最初は期待どおりに機能しますが、記事に再びloadを使用するUIRefreshControlと、( )のときにアプリがクラッシュします。fetchanimatinginserting 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

この線

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

ゼロに設定iされるため、空の配列で呼び出されます。insertRowsAtIndexPaths

insertRowsAtIndexPaths新しく追加された行の行番号で呼び出すことが意図されていたと思いますが、配列を置き換える前に古いデータを覚えておく必要があります。

self.latestArticlesArray = array;

ただし、配列全体を置き換えるため、次のように呼び出すこともできます。

[self.tableView reloadData];

beginUpdates//の代わりinsertRowsAtIndexPathsendUpdates


更新:私の最初の分析は間違っています(そして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 に答える
2

初めてロードする理由は、毎回多数の行を挿入するためです。したがって、最初の実行では、行数が0から配列内のカウント(完了ブロック内)に変更され、数値を使用してinsertRowsを呼び出します。配列の数に等しいインデックスパスの数。

2回目に呼び出すと、新しい行が挿入されますが、新しい合計を反映するようにカウントが更新されていません。完了ブロックで返された配列に既存の配列を追加し、その結合された配列の数をnumberOfRowsInSectionで返す必要があります。

于 2013-03-24T13:24:32.300 に答える
1
dispatch_async(dispatch_get_main_queue(), ^(void){
        //Run UI Updates
    });
于 2017-06-15T08:47:38.827 に答える