it-swarm.com.ru

tableView reloadData не работает

Когда я вызываю [tableView reloadData], функция - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath не запускается? Зачем?

Вот мой TableView.m

@implementation TableView
@synthesize managedObjectContext;
@synthesize controller = _controller;
@synthesize tableView = _tableView;

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {

    }
    return self;
}
-(id)init
{
    self = [super init];
    if (self) {
        NSLog(@"%s",__PRETTY_FUNCTION__);
        self.del = [[UIApplication sharedApplication] delegate];
        self.managedObjectContext = self.del.managedObjectContext;

        [self performControllerFetch];
    }
    return self;
}


#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    ...
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    ...
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    ...
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {

    ...
}

-(void)reloadTableView
{
    NSLog(@"%s",__PRETTY_FUNCTION__);

    [self.tableView reloadData];

}

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath {

    NSLog(@"%s",__PRETTY_FUNCTION__);
    UITableView *tableView = self.tableView;

    switch(type) {

        case NSFetchedResultsChangeInsert:
            [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeDelete:
            [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeUpdate:
            [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
                                  withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeMove:
            [tableView deleteRowsAtIndexPaths:[NSArray
                                               arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
            [tableView insertRowsAtIndexPaths:[NSArray
                                               arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;
    }
}


- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id )sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type {

    switch(type) {

        case NSFetchedResultsChangeInsert:
            [self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeDelete:
            [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
            break;
    }
}


- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
    // The fetch controller has sent all current change notifications, so tell the table view to process all updates.
    [self.tableView endUpdates];
}

@end

TableView.h

@interface TableView : UITableView <UITableViewDataSource, UITableViewDelegate, NSFetchedResultsControllerDelegate>

@property (nonatomic, strong) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, strong) AppDelegate *del;
@property (nonatomic, strong) NSFetchedResultsController *controller;
@property (weak, nonatomic) IBOutlet TableView *tableView;

-(void)reloadTableView;
-(void)performControllerFetch;
@end
20
iCode

Похоже, вы никогда не устанавливали свойства delegate и datasource в своем табличном представлении, не так ли? Вы реализуете методы в этих протоколах внутри tableview.m, но не устанавливаете два свойства в self, поэтому вызов reloadData не имеет никакого эффекта. 

Это помогает?

Правка:

Похоже, у вас есть свойство tableView, установленное для подкласса UITableView и подключенное к файлу компоновщика интерфейса. Это странная установка (просмотр таблицы внутри просмотра таблицы). Обычно у вас есть что-то вроде подкласса UIViewController, подключенное к XIB и устанавливающее 

@property (nonatomic, strong) IBOutlet UITableView * tableView 

в этом подклассе, или что-то подобное. А затем обработайте выборку данных и делегат/источник данных табличного представления внутри этого подкласса viewcontroller.

Но здесь, из-за вложенных UITableViews, это не так просто. Есть ли причина для этого дизайна? Я рекомендую перейти к описанному выше, чтобы внести ясность в настройку. 

Кроме того, попробуйте добавить несколько операторов NSLog в ваш метод init, чтобы увидеть, установлены ли свойства tableview! = Nil и делегат и источник данных. Я подозреваю, что связь не установлена.

Кроме того, вне зависимости от рассматриваемой проблемы, вам больше не нужно вручную @synthesize ivar = _ivar, это будет сделано для вас автоматически с использованием соглашения о подчеркивании.

14
Alfie Hanssen

У меня была та же проблема, что перезагрузка не работала. Я полагаю, что делегат метод, из которого я вызывал его, был в фоновом потоке , который вызывал проблему. Мое решение состояло в том, чтобы создать новый метод (ниже) и вызвать вместо него reload , а также обеспечить его вызов из основного потока :

- (void) tocLoad {
    dispatch_async(dispatch_get_main_queue(), ^{
    [self.tableView reloadData];
    });
}
9
user3730468

Если вы не можете перезагрузить таблицу, используя

[self.tableView reloadData];

Пожалуйста, убедитесь, что вы добавляете ссылку на подписку из раскадровки

@property (weak, nonatomic) IBOutlet TableView *tableView;

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

tableView эталонный выход

2
ashish mankar

Это случилось со мной, потому что был звонок

tableView.beginUpdates()

без звонка

tableView.endUpdates()

В моем коде. Удаление tableView.beginUpdates() решило проблему для меня.

0
Menno

Я потратил несколько дней на устранение этой проблемы и нашел массу возможных исправлений. Я снялся в роли того, кто работал на меня, но все они действительны.

Во-первых, конечно, убедитесь, что ваш делегат, источник данных, IBOutlet и т.д. Настроены правильно.

** Установите точку останова All Exceptions и посмотрите, получаете ли вы исключение за пределами вашего источника данных. Без установки точки останова сбоя не будет, и просмотр таблицы просто не сможет перезагрузиться.

Другие возможные исправления: проверьте кадр таблицы, чтобы убедиться, что ширина или высота не равна 0. Попробуйте выполнить reloadData в главном потоке. Наконец, попробуйте перезагрузить только один раздел ( здесь ).

Должен любить таблицы просмотров.

0
Max Friedman

Несмотря на написание этого [self.tableView reloadData];, попробуйте ниже, потому что вы уже написали урок, так что нет необходимости возвращаться к розетке: -

[self reloadData]
0
Hussain Shabbir