Хобрук: Ваш путь к мастерству в программировании

Раздел перезагрузки UITableView

Я хочу перезагрузить только один раздел, а не полную таблицу. Есть ли какой-нибудь метод в UITableView.

[tableView reloadData] используется для загрузки полной таблицы.
Я хочу знать, как загрузить только один раздел, так как у меня большое количество строк в таблице.

29.11.2011

  • Вызов reloadData по-прежнему только первоначально перезагружает UITableViewCells, которые находятся на экране. 29.11.2011
  • возможный дубликат stackoverflow.com/ вопросы / 3485162 / 29.11.2011

Ответы:


1

Да, есть:

- (void)reloadSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation
29.11.2011

2

Меня беспокоит метод reloadSections - мне нужно создать несколько объектов. Это замечательно, если вам нужна гибкость, но иногда мне также нужна простота. Это выглядит так:

NSRange range = NSMakeRange(0, 1);
NSIndexSet *section = [NSIndexSet indexSetWithIndexesInRange:range];                                     
[self.tableView reloadSections:section withRowAnimation:UITableViewRowAnimationNone];

Это перезагрузит первый раздел. Я предпочитаю иметь категорию в UITableView и просто вызываю этот метод:

[self.tableView reloadSectionDU:0 withRowAnimation:UITableViewRowAnimationNone];

Мой метод категорий выглядит так:

@implementation UITableView (DUExtensions)

- (void) reloadSectionDU:(NSInteger)section withRowAnimation:(UITableViewRowAnimation)rowAnimation {
    NSRange range = NSMakeRange(section, 1);
    NSIndexSet *sectionToReload = [NSIndexSet indexSetWithIndexesInRange:range];                                     
    [self reloadSections:sectionToReload withRowAnimation:rowAnimation];
}
29.05.2012
  • Обожаю функцию @implementation! Спасибо, что сделали это так просто 08.01.2013
  • Разве не проще вызвать [NSIndexSet indexSetWithIndex: section]? 20.12.2013
  • Или вы можете сделать [NSIndexSet indexSetWithIndex:1] (вместо диапазона) 04.11.2015

  • 3

    Но вы можете перезагружать только те разделы, которые содержат такое же количество строк (или вам придется вручную добавлять или удалять их). В противном случае вы получите:

    *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of rows in section 2. The number of rows contained in an existing section after the update (1) must be equal to the number of rows contained in that section before the update (0), plus or minus the number of rows inserted or deleted from that section (0 inserted, 0 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out).'

    Этого не требуется при использовании [tableView reloadData].

    Если вам нужно перезагрузить раздел и вы изменили количество строк внутри него, вы можете использовать что-то вроде этого:

    NSIndexSet *indexSet = [NSIndexSet indexSetWithIndex:section];
    
    [self beginUpdates];
        [self deleteSections:indexSet withRowAnimation:rowAnimation];
        [self insertSections:indexSet withRowAnimation:rowAnimation];
    [self endUpdates];
    

    Если вы поместите его в категорию (например, шоу bandejapaisa), это может выглядеть так:

    - (void)reloadSection:(NSInteger)section withRowAnimation:(UITableViewRowAnimation)rowAnimation {
        NSIndexSet *indexSet = [NSIndexSet indexSetWithIndex:section];
    
        [self beginUpdates];
            [self deleteSections:indexSet withRowAnimation:rowAnimation];
            [self insertSections:indexSet withRowAnimation:rowAnimation];
        [self endUpdates];
    }
    
    22.10.2012
  • И в каком случае? Теперь лучшим подходом может быть использование KVO (и, таким образом, получение возможности автоматической перезагрузки UITableView на основе изменений в какой-либо модели) - или, если вы используете CoreData, вас может заинтересовать NSFetchResultsController. 26.03.2014
  • Я попал в эту проблему. Я просто перезагружаю проблемный раздел перед перезагрузкой фактического раздела. Это решило проблему. 27.05.2019

  • 4

    Для Swift 3, 4 и 5

    let sectionToReload = 1
    let indexSet: IndexSet = [sectionToReload]
    
    self.tableView.reloadSections(indexSet, with: .automatic)
    
    17.02.2017

    5

    что правильный путь:

    [self.tableView beginUpdates]; 
    [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone];
    [self.tableView endUpdates];
    
    04.05.2016

    6

    Основываясь на принятом здесь ответе, я создал функцию, которая перезагрузит все разделы в таблице с помощью анимации. Вероятно, это можно было бы оптимизировать, перезагружая только видимые разделы.

    [self.tableView reloadData];
    NSRange range = NSMakeRange(0, [self numberOfSectionsInTableView:self.tableView]);
    NSIndexSet *sections = [NSIndexSet indexSetWithIndexesInRange:range];
    [self.tableView reloadSections:sections withRowAnimation:UITableViewRowAnimationFade];
    

    В моем случае мне пришлось принудительно выполнить reloadData перед анимацией раздела, потому что базовые данные для таблицы изменились. Однако он правильно анимируется.

    10.04.2013

    7

    Вам понадобится это ... для перезагрузки строки

    - (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation
    

    или для раздела "Обновить"

    - (void)reloadSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation
    
    29.11.2011

    8

    Вот метод, вы можете передавать детали раздела по-разному

    [self.tableView reloadSections:[[NSIndexSet alloc] initWithIndex:1] withRowAnimation:NO];
    
    [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:1] withRowAnimation:UITableViewRowAnimationNone];
    

    Перезагрузка определенных разделов улучшает производительность для табличного представления, а также позволяет избежать некоторых проблем, таких как перемещение / перемещение пользовательских верхних и нижних колонтитулов в вашем представлении. ТАК старайтесь использовать reloadSection, чем relaodData, когда это возможно

    23.08.2016

    9

    Попробуй использовать

    [self.tableView beginUpdates]; 
    [self.tableView endUpdates];
    

    Надеюсь, это решит вашу проблему.

    14.08.2013

    10

    Если у вас есть настраиваемый вид сечения, вы можете добавить слабую ссылку на него в своем контроллере представления и обновить его, когда захотите. Вот мой код для справки:

    @property (weak, nonatomic) UILabel *tableHeaderLabel;
    
    ....
    
    -(UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
    {
        UITableViewHeaderFooterView *myHeader = [[UITableViewHeaderFooterView alloc] init];
    
        UILabel *titleLabel = [[UILabel alloc] init];
        [titleLabel setFrame:CGRectMake(20, 0, 280, 20)];
        [titleLabel setTextAlignment:NSTextAlignmentRight];
        [titleLabel setBackgroundColor:[UIColor clearColor]];
        [titleLabel setFont:[UIFont systemFontOfSize:12]];
    
        [myHeader addSubview:titleLabel];
    
        self.tableHeaderLabel = titleLabel; //save reference so we can update the header later
    
        return myHeader;
    }
    

    Позже вы можете обновить свой раздел следующим образом:

    - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
    {
        self.tableHeaderLabel.text = [NSString stringWithFormat:@"Showing row: %ld", indexPath.row];
    }
    
    02.10.2014

    11

    Но вы можете перезагружать только те разделы, которые содержат такое же количество строк (или вам придется вручную добавлять или удалять их). В противном случае вы получите исключение NSInternalInconsistencyException.

    Шаги:

    1. вычислить, какие строки удалить и / или вставить
    2. сгенерировать массив IndexPath из этих
    3. вызвать связанные методы tableView

    теперь вы можете спокойно вызывать reloadSections :) Раздел Reload вызовет обновление для остальных индексов.

    Или вы можете использовать такую ​​библиотеку, как: https://github.com/onmyway133/DeepDiff

    Swift псевдокод:

    
            tableView.deleteRows(at: valueIndexesToRemove, with: .automatic)
            tableView.insertRows(at: valueIndexesToInsert, with: .automatic)
            tableView.reloadSections(IndexSet([section]), with: .automatic)
    
    
    25.03.2020
    Новые материалы

    Получение стоковых обновлений с помощью Python
    Для начинающего финансового аналитика Введение Описание: Этот проект Python создает скрипт для получения текущих обновлений акций с финансового веб-сайта Yahoo. Для этого проекта мы..

    Это все, что вам нужно знать о Kotlin в 2022 году
    Добро пожаловать! Kotlin — это язык программирования, популярность которого, кажется, растет, его действительно можно использовать для создания чего угодно, и если вы хотите узнать о Kotlin,..

    Текстовый графический интерфейс с Lanterna на Java
    Мой опыт работы с компьютерами (и текстовыми графическими пользовательскими интерфейсами) начался еще в восьмидесятых, когда я был ребенком, на дне рождения друга. Это был «новенький» Amstrad..

    Перезарядите свой мозг: умопомрачительный потенциал мозговых компьютерных интерфейсов
    Способность читать свои мысли и управлять объектами разумом долгое время были предметом человеческого любопытства, ограниченного областью научной фантастики… то есть до сих пор? С технологией,..

    Основы C# — Нулевой оператор объединения (??)
    Оператор ?? называется null-coalescing operator . Этот оператор используется для предоставления значения по умолчанию, если значение операнда в левой части оператора равно null ...

    Сравнение номеров версий в C++ с использованием синтаксического анализа строк
    Номера версий обычно используются для обозначения развития или обновлений программного обеспечения или любого другого продукта. При работе с номерами версий в C++ может быть полезно сравнить две..

    В мир искусственного интеллекта…
    ИИ — это новое топливо в современном мире. Куда бы вы ни обратились, с кем бы вы ни разговаривали — они, как правило, упоминают об ИИ хотя бы раз в ходе разговора. ИИ гудит повсюду. У каждого..