当我致电[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
答案 0 :(得分:14)
看起来你从未在tableview上设置delegate
和datasource
属性,不是吗?您正在tableview.m
内的那些协议中实现这些方法,但未将这两个属性设置为self
,因此调用reloadData
无效。
这有帮助吗?
修改强>
看起来您在tableView
的子类上设置了UITableView
属性,并连接到接口构建器文件。这是一个奇怪的设置(tableview中的tableview)。通常,您会将UIViewController
子类连接到XIB并设置
@property (nonatomic, strong) IBOutlet UITableView * tableView
在该子类中,或类似的东西。然后处理该viewcontroller子类中的数据获取和tableview委托/数据源。
但是在这里,由于嵌套UITableView
,它并不那么简单。这个设计有原因吗?我建议转到我上面描述的内容,以帮助提高设置的清晰度。
另外,尝试在NSLog
方法中添加一些init
语句,以查看tableview!= nil以及是否已设置委托和数据源属性。我怀疑是没有联系。
此外,与手头的问题无关,您不再需要手动@synthesize ivar = _ivar
,它将自动使用下划线约定。
答案 1 :(得分:9)
我遇到了同样的问题,重新加载无效。我相信我调用它的委托方法是在后台线程中导致问题。我的解决方案是创建一个新方法(下面)并从那里调用重新加载,同时还要确保从主线程调用它:
- (void) tocLoad {
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
});
}
答案 2 :(得分:2)
如果您无法使用
重新加载表格[self.tableView reloadData];
请确保您在故事板中添加以下内容
@property (weak, nonatomic) IBOutlet TableView *tableView;
如何添加引用,您可以单击以下图像链接:
答案 3 :(得分:0)
尽管在下面写这个[self.tableView reloadData];
尝试,但是因为你已经写了课,所以不需要再次出口: -
[self reloadData]
答案 4 :(得分:0)
我花了几天调试这个问题,发现了大量可能的修复。我主演了一个对我有用的,但它们都是有效的。
首先,检查您的委托,数据源,IBOutlet等是否都已正确配置。
**设置All Exceptions断点,看看你是否在数据源中遇到了一个越界异常。在没有设置断点的情况下,没有崩溃,并且tableview将无法重新加载。
其他可能的修复:检查tableview的框架以确保宽度或高度不为0.尝试在主线程上执行reloadData。最后,尝试仅重新加载一个部分(here)。
喜欢桌子观点。
答案 5 :(得分:0)
这发生在我身上,因为有一个电话
tableView.beginUpdates()
无需致电
tableView.endUpdates()
在我的代码中。删除tableView.beginUpdates()
为我解决了这个问题。