Подтвердить что ты не робот

Обновить только пользовательские виды заголовков в 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];
}
4b9b3361

Ответ 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 после внесения изменений.