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 

看起来你从来没有在你的tableview上设置delegatedatasource属性,不是吗? 你正在tableview.m里面的那些协议中实现这些方法,但是没有tableview.m两个属性设置为self所以调用reloadData没有效果。

这有帮助吗?

编辑:

看起来你有一个tableView属性设置在UITableView的子类上,并连接到一个接口生成器文件。 这是一个奇怪的设置(tableview中的tableview)。 通常你会有一个UIViewController子类连接到一个XIB,并设置一个

@property (nonatomic, strong) IBOutlet UITableView * tableView

在那个子类中,或类似的东西。 然后处理viewcontroller子类中的数据获取和tableview委托/数据源。

但在这里,由于嵌套的UITableView它不是那么简单。 有这个devise的原因吗? 我build议移动到像我上面描述的东西,以帮助澄清设置。

另外,尝试添加一些NSLog语句到你的init方法中,看看是否已经设置了tableview!= nil和委托和数据源属性。 我怀疑是没有联系。

此外,与手头上的问题无关,您不再需要手动@synthesize ivar = _ivar ,它将自动使用下划线约定为您完成。

我有同样的问题, 重新加载不起作用。 我相信我所调用的委托方法是在后台线程中导致问题。 我的解决scheme是创build一个新的方法 (下面),而不是从那里调用reload ,同时也确保从主线程调用它:

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

如果您无法使用重新加载表

 [self.tableView reloadData]; 

请确保您添加了对故事板中以下内容的引用

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

如何添加引用你可以点击下面的图片链接:

tableView参考sockets

尽pipe写了这个[self.tableView reloadData]; 请尝试下面,因为你已经写了课,所以没有必要再次出口: –

 [self reloadData] 

我花了几天的时间来debugging这个问题,并发现了很多可能的修复。 我主演了一个为我工作的人,但他们都是有效的。

首先,当然,请检查您的委托,数据源,IBOutlet等是否都正确configuration。

**设置所有exception断点,看看你是否在你的数据源中出现越界exception。 没有设置断点没有崩溃,tableview将无法重新加载。

其他可能的修复:检查tableview的框架,以确保宽度或高度不是0.尝试在主线程上执行reloadData。 最后,只尝试重新加载一个部分( 这里 )。

得爱表意见。