tableView reloadData无法正常工作 [英] tableView reloadData not working
问题描述
当我调用 [tableView reloadData]
函数 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
未被解雇?为什么?
When I call [tableView reloadData]
the function - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
is not fired? Why?
这是我的 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上设置委托
和 datasource
属性,不是吗?您正在 tableview.m
中的那些协议中实现这些方法,但是没有将这两个属性设置为 self
因此调用 reloadData
无效。
It looks like you are never setting the delegate
and datasource
properties on your tableview, no? You're implementing the methods in those protocols inside tableview.m
but not setting the two properties to self
hence calling reloadData
having no effect.
这有帮助吗?
修改:
看起来你在 UITableView
的子类上设置了一个 tableView
属性并连接起来到接口构建器文件。这是一个奇怪的设置(tableview中的tableview)。通常你会有一个像 UIViewController
这样的子类连接到一个XIB并设置一个
Looks like you have a tableView
property set on a subclass of UITableView
and hooked up to an interface builder file. This is an odd setup (a tableview within a tableview). Usually you would have something like a UIViewController
subclass hooked up to an XIB and set an
@property(非原子,强)IBOutlet UITableView * tableView
在该子类中,或类似的东西。然后处理该viewcontroller子类中的数据获取和tableview委托/数据源。
in that subclass, or something similar. And then handle the data fetching and tableview delegate/datasource inside that viewcontroller subclass.
但是这里,因为嵌套的 UITableView
s并不那么简单。这个设计有原因吗?我建议转到我上面描述的内容,以帮助提高设置的清晰度。
But here, because of the nested UITableView
s it's not as straightforward. Is there a reason for this design? I recommend moving to something like I describe above to help bring clarity to the setup.
另外,尝试在 init
NSLog 语句>查看tableview!= nil以及是否已设置委托和数据源属性的方法。我怀疑是没有连接。
Also, try adding some NSLog
statements into your init
method to see if the tableview != nil and the delegate and datasource properties have been set. My suspicion is that the connection is not being made.
另外,与手头的问题无关,你不再需要手动 @synthesize ivar = _ivar
,它将使用下划线约定自动完成。
Also, unrelated to the problem at hand, you no longer have to manually @synthesize ivar = _ivar
, it will be done for you automatically using the underscore convention.
这篇关于tableView reloadData无法正常工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!