Путаница с набором UIViewNeedsDisplay - PullRequest
3 голосов
/ 26 августа 2011

У меня есть ивар из UITableView * myTableView. У меня есть данные, загружаемые из Интернета, поэтому, когда данные загружаются, я должен вызвать [myTableView setNeedsDisplay], я знаю, что могу / должен вызвать [myTableView reloadData], но путаница заключается в том, что вызов setNeedsDisplay также должен работать, но не работает.

Я просто ищу объяснение того, что делает setNeedsDisplay? при вызове экземпляра UITableView.

Согласно документации setNeedsDisplay вызывает drawRect в «следующем цикле рисования». поэтому кто-нибудь может сказать мне, каков следующий цикл рисования.

Ответы [ 5 ]

6 голосов
/ 26 августа 2011

setNeedsDisplay метод не имеет ничего общего с перезагрузкой tableView .Он просто перерисовывает view tableView , а не его клеток или разделителей .

setNeedsDisplay и reloadData полностью для разных целей.

5 голосов
/ 26 августа 2011

setNeedsDisplay отмечает вызов UIView как необходимость перерисовки, это чисто визуальный смысл, который, как указано, произойдет в следующем цикле рисования.

Это полностью отличается от перезагрузки данных при использованиив контексте UITableView.

См. в этой статье для получения дополнительной информации по этому вопросу.

2 голосов
/ 02 августа 2013

SetNeedsDisplay

Хороший пример этого - когда UIImageView визуализируется с одним изображением; и пока он все еще на экране, вы меняете изображение на что-то другое. В этом случае простое изменение изображения не всегда вызовет перерисовку вида, для этого необходимо позвонить на номер setNeedsDisplay.

.

reloadData

Он должен вызываться, когда базовый источник данных для табличного представления изменяется, и вы хотите, чтобы это было указано в UI. В этом случае вызовите это reloadData mehod

1 голос
/ 26 августа 2011

Как правило, вам нужно вызывать setNeedsDisplay только для пользовательских представлений, для которых вы реализовали drawRect.

0 голосов
/ 26 апреля 2016

Мое решение состояло в том, чтобы обновить все видимые ячейки и отслеживать indexPath ячейки в моем пользовательском классе "ProductTableViewCell" с помощью reloadRowsAtIndexPaths, см. Ниже:

NSArray *arrayCells = [self.tableView visibleCells];
NSMutableArray *mArrayIndexPaths = [[NSMutableArray alloc] init];
for(ProductTableViewCell *cell in arrayCells) {
    [mArrayIndexPaths addObject:cell.indexPath];
}

[self.tableView beginUpdates];
[self.tableView endUpdates];
[self.tableView reloadRowsAtIndexPaths:[mArrayIndexPaths copy] withRowAnimation:UITableViewRowAnimationAutomatic];

Вот как определяется класс:

@interface ProductTableViewCell : UITableViewCell {
    NSString *reuseID;
}

@property (nonatomic, strong) NSIndexPath *indexPath;
...