web-dev-qa-db-ja.com

iOSのtableViewreloadRowsAtIndexPathsが機能しない

UITableViewControllerがあり、ビューが表示されたときにいくつかの計算を非同期で実行すると、テーブル内の特定の行が更新されるという問題があります。

viewWillAppear関数内で、更新が必要な必要な行を次のように計算します。

- (void)reloadPaths:(NSMutableDictionary *)bookingsDict
{
    NSMutableArray* indexArray = [NSMutableArray array];
    int i = 0;
    for (NSString *dateKey in self.eventsToShow) {
        NSMutableDictionary *venues = [bookingsDict objectForKey:dateKey];
        if (venues) {
            int j = 0;
            NSArray *events = [self.eventsToShow objectForKey:dateKey];
            for (DCTEvent *event in events) {
                NSString *venueIdString = [NSString stringWithFormat:@"%@", event.eventVenueId];
                if ([venues objectForKey:venueIdString]) {
                    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:j inSection:i];
                    [indexArray addObject:indexPath];
                }
                j++;
            }
        }
        i++;
    }
    [self.tableView reloadRowsAtIndexPaths:indexArray withRowAnimation:UITableViewRowAnimationFade];
}

ただし、cellForRowAtIndexPath関数が後で呼び出されることはなく、セルが正しく更新されないことに気付きました。問題が何であるかについて何か考えはありますか?

編集:更新されるはずのセルのビューからスクロールアウトすると、スクロールしてビューに戻ると更新されることに気づきました。表示中に更新する方法はありませんか?

10
Atul Bhatia

包んでみませんか?

[tableView beginUpdates];
[tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
[tableView endUpdates];

これが私が見つけたいくつかの同様の問題です。

cellForRowAtIndexPathはreloadRowsAtIndexPathsの後に呼び出されません

ITableViewのreloadRowsAtIndexPaths:(NSArray *)indexPathsは、2回呼び出さない限り、リロードを引き起こしませんか?

お役に立てれば。

7
Hsin Chang

[〜#〜] edit [〜#〜]:各オブジェクトがトラバースされている間、増加しているため、indexPathチェックセクションが一定でない可能性があると思います。

- (void)reloadPaths:(NSMutableDictionary *)bookingsDict
{
    NSMutableArray* indexArray = [NSMutableArray array];
    int i = 0;
    for (NSString *dateKey in self.eventsToShow) {
        NSMutableDictionary *venues = [bookingsDict objectForKey:dateKey];
        if (venues) {
            int j = 0;
            NSArray *events = [self.eventsToShow objectForKey:dateKey];
            for (DCTEvent *event in events) {
                NSString *venueIdString = [NSString stringWithFormat:@"%@", event.eventVenueId];
                if ([venues objectForKey:venueIdString]) {
                    //changed here as section might be constant as i think it might be
                    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:j inSection:0];
                    [indexArray addObject:indexPath];
                }
                j++;
            }
        }
        i++;
    }

    [self.tableView beginUpdates];
    [self.tableView reloadRowsAtIndexPaths:indexArray withRowAnimation:UITableViewRowAnimationFade];
    [self.tableView endUpdates];
}

これを試して :

//your code here
[self.tableView beginUpdates];

[self.tableView reloadRowsAtIndexPaths:indexArray withRowAnimation:UITableViewRowAnimationFade];

[self.tableView endUpdates];
5
Paresh Navadiya

私にとっては、リロードコードをメインキューにプッシュすることで問題が解決しました

DispatchQueue.main.async {
    self.tableView.reloadRows(at: [indexPath], with: .automatic)
}
2
Heysem Katibi