24

当我调用[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

表视图.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

6 回答 6

16

看起来你从来没有在你的 tableview 上设置delegateand属性,不是吗?datasource您正在内部实现这些协议中的方法,tableview.m但没有将这两个属性设置为self因此调用reloadData无效。

这有帮助吗?

编辑:

看起来你tableView在一个子类上设置了一个属性,UITableView并连接到一个接口构建器文件。这是一个奇怪的设置(表视图中的表视图)。通常你会有一个类似于UIViewController子类的东西连接到一个 XIB 并设置一个

@property (nonatomic, strong) IBOutlet UITableView * tableView

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

但是在这里,由于嵌套UITableView的 s 并不那么简单。这种设计有原因吗?我建议移至我上面描述的内容,以帮助使设置更加清晰。

此外,尝试NSLog在您的方法中添加一些语句init,以查看 tableview != nil 以及委托和数据源属性是否已设置。我的怀疑是没有建立联系。

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

于 2013-10-10T17:27:33.897 回答
11

我遇到了同样的问题,重新加载不起作用。我相信我调用它的委托方法是在导致问题的后台线程中。我的解决方案是创建一个新方法(如下)并从那里调用重新加载,同时确保从主线程调用它:

- (void) tocLoad {
    dispatch_async(dispatch_get_main_queue(), ^{
    [self.tableView reloadData];
    });
}
于 2014-10-15T17:27:12.777 回答
2

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

[self.tableView reloadData];

请确保您从情节提要中添加对以下内容的引用

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

如何添加参考,您可以点击以下图片链接:

tableView 参考插座

于 2016-05-13T19:26:49.767 回答
1

这发生在我身上,因为有一个电话

tableView.beginUpdates()

无需致电

tableView.endUpdates()

在我的代码中。删除tableView.beginUpdates()为我解决了这个问题。

于 2019-01-31T12:33:55.783 回答
0

我花了几天时间调试这个问题,并找到了大量可能的修复方法。我出演了对我有用的那个,但它们都是有效的。

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

**设置 All Exceptions 断点并查看您的数据源中是否出现越界异常。如果不设置断点,则不会发生崩溃,并且 tableview 将无法重新加载。

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

一定要喜欢桌子的景色。

于 2015-08-20T17:19:15.240 回答
-1

尽管在下面写了这个 [self.tableView reloadData];尝试,因为你已经写了课,所以不需要再次使用插座:-

[self reloadData]
于 2013-10-10T17:40:26.410 回答