gpt4 book ai didi

iphone - tableView reloadData 不工作

转载 作者:IT王子 更新时间:2023-10-29 08:01:16 29 4
gpt4 key购买 nike

当我调用 [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 中实现这些协议(protocol)中的方法,但未将这两个属性设置为 self 因此调用 reloadData 无效。

这有帮助吗?

编辑:

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

@property (nonatomic, strong) IBOutlet UITableView * tableView

在该子类中,或类似的东西。然后在该 View Controller 子类中处理数据获取和 TableView 委托(delegate)/数据源。

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

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

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

关于iphone - tableView reloadData 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19302270/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com