Обновить только пользовательские виды заголовков в UITableView?
Мой UITableView
имеет собственные заголовки UIView
в каждом разделе. Мне нужно обновить только заголовки, а не другой контент в разделе. Я попробовал [self.tableView headerViewForSection:i]
и он ничего не возвращает, хотя должен. В любом случае, я могу это сделать?
Изменение: код основан на новом предложении
Я также сделал это, и он вызывает/обновляет UIView в этом методе, но изменения не распространяются визуально на экран.
for (int i = 0; i < self.objects.count; i++) {
UIView *headerView = [self tableView:self.tableView viewForHeaderInSection:i];
[headerView setNeedsDisplay];
}
Ответы
Ответ 1
Вместо вызова setNeedsDisplay
настройте заголовок самостоятельно, установив его свойства. И, конечно же, вы должны получить фактические заголовки в таблице, не вызывайте метод делегата, потому что этот метод обычно создает новое представление заголовка.
Обычно я делаю это в небольшом вспомогательном методе, который также вызывается из tableView:viewForHeaderInSection:
.
например:.
- (void)configureHeader:(UITableViewHeaderFooterView *)header forSection:(NSInteger)section {
// configure your header
header.textLabel.text = ...
}
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
UITableViewHeaderFooterView *header = [tableView dequeueReusableHeaderFooterViewWithIdentifier:@"Header"];
[self configureHeader:header forSection:section];
}
- (void)reloadHeaders {
for (NSInteger i = 0; i < [self numberOfSectionsInTableView:self.tableView]; i++) {
UITableViewHeaderFooterView *header = [self.tableView headerViewForSection:i];
[self configureHeader:header forSection:i];
}
}
Ответ 2
Создайте свой собственный подкласс UIView для headerView и добавьте несколько методов, чтобы ваш контроллер просмотра мог отправлять любые обновления пользовательского интерфейса, которые вы хотите ему.
Ответ 3
Вызов setNeedsDisplay
служит только для запуска метода drawRect:
получающего представления. Если это не так, где ваша логика цвета текста (т.е. В методе drawRect вашего подкласса UIView, который вы используете для заголовков), ничего не изменится. То, что вам нужно сделать, - это прямо вызвать что-то в представлениях заголовков, чтобы обновить свое состояние на основе ваших новых или измененных данных или напрямую получить доступ к метке в представлении заголовка и изменить его самостоятельно, итерации через них. setNeedsDisplay
вызывает только код, найденный в методе drawRect:
представления.
Ответ 4
Недавно у меня была эта точная проблема и только преодолела ее, сохранив указатель на заголовки, когда они были созданы. Я сделал это в Swift и с быстрым единственным типом словаря, но эту идею можно было как-то массировать в objC.
var headers : [ Int : UIView ] = [ : ] //dictionary for keeping pointer to headers
override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
if let h = super.tableView(tableView , viewForHeaderInSection: section) { //or create your view (this viewController inherits it)..
self.headers.updateValue(h , forKey: section) //keep a pointer to it before you return it..
return h
}
return nil
}
Ответ 5
Когда вы создаете свои собственные представления заголовков, используйте UITableViewHeaderFooterView
вместо простого UIView
, и когда вы его инициализируете, используйте что-то вроде этого:
UITableViewHeaderFooterView *cell = [[UITableViewHeaderFooterView alloc] initWithReuseIdentifier:@"reuseIdentifier"];
reuseIdentifier
сообщит вашему UITableView
отслеживать заголовок и больше не будет возвращать null
при попытке получить к нему доступ с помощью [self.tableView headerViewForSection:i]
Затем вы можете использовать setNeedsDisplay
в UITableViewHeaderFooterView
, который вы вернетесь из headerViewForSection
после внесения изменений.