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上设置delegate
和datasource
属性,不是吗? 你正在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。 最后,只尝试重新加载一个部分( 这里 )。
得爱表意见。