2013-10-10 2 views
20

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

Вот мой 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 
+4

Зачем нужен downvoting? – iCode

+4

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

ответ

13

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

Помогает ли это?

Edit:

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

@property (nonatomic, strong) IBOutlet UITableView * tableView

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

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

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

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

+0

Я установил делегат и источник данных в построителе интерфейса в класс TableView.m. Достигает ли это? – iCode

+0

Хм, Можете ли вы также разместить файл .h (какой класс наследует tablview.m)? И можете ли вы опубликовать код, в котором вы объявляете свои IBOutlets (если есть)? Иногда IB может быть придирчивым к тому, что вы делаете соединение делегат/источник данных с «владельцем файлов» и видом в XIB-файле. –

+0

Я обновил свой код. btw: данные в таблице отображаются правильно. – iCode

0

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

[self reloadData] 
+0

Все еще не работает. – iCode

+0

В принципе, в чем проблема, я имею в виду, что это не освежает данные? –

+0

Да, это проблема. – iCode

6

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

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

Сохранение моего приклада! – CommaToast

0

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

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

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

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

Gotta love table views.

1

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

[self.tableView reloadData]; 

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

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

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

tableView reference outlet

+0

Черт. Вот и все. У меня была переменная tableview, но раскадровка отключила ее. Xcode (и жизнь) было бы намного проще, если бы был только малейший намек на обнаружение ошибок в Xcode, чтобы указать нам в правильном направлении ... Grrrr .... –

+0

Удивительный .., который спас мой день – Najam

Смежные вопросы