繁体   English   中英

当UITableView是UIView的子视图时(数据最初加载),未调用NSFetchedResultsControllerDelegate方法

[英]NSFetchedResultsControllerDelegate methods not called when UITableView is a subview of UIView (data initially loads)

我有一个UIView包含UITableView 这些由继承自委托方法UITableViewDelegateNSFetchedResultsControllerDelegateUIViewController管理。 我可以使用NSFetchedResultsController很好地填充表,但是在对fetchObjects托管对象进行更改时,不会调用委托方法(特别是controllerWillChangeContent )。

我已经独立检查了对对象所做的更改,这些更改已反映在单元格中,但是您必须手动重新加载单元格(向上滚动)才能看到更改。 我正在寻找的行为是,当对对象进行更改(通过保存)时,将触发NSFetchedResultsControllerDelegate方法,以便可以对表视图进行更新。

需要明确的是,在加载视图时,数据是从数据库中填充的,所以我知道代码可以正常运行。

头接口

@interface HSAwardsViewController : UIViewController <UITableViewDelegate, UITableViewDataSource, NSFetchedResultsControllerDelegate>

@property (nonatomic, retain) IBOutlet UITableView *tableView;

@property (nonatomic, retain) NSPersistentStoreCoordinator *persistentStoreCoordinator;
@property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController;
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;

@end

初始化方法-设置ManagedObjectContext(使用Magical Record)

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        HSInternalDB *dbInstance = [HSInternalDB getInternalDB];
        self.persistentStoreCoordinator = [dbInstance getPersistentStoreCoordinator];
        self.managedObjectContext = [NSManagedObjectContext MR_contextWithStoreCoordinator:self.persistentStoreCoordinator];

        self.tableView.delegate = self;
        self.tableView.dataSource = self;

        NSError *error;
        if (![[self fetchedResultsController] performFetch:&error]) {
            // Update to handle the error appropriately.
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            exit(-1);  // Fail
        }
    }
    return self;
}

设置NSFetchedResultsController并分配委托

- (NSFetchedResultsController *)fetchedResultsController {

    if (_fetchedResultsController != nil) {
        return _fetchedResultsController;
    }

    NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Award"];

    NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"gameTypeIdentifier" ascending:NO];

    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];
    [fetchRequest setFetchBatchSize:20];

    NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:nil];

    NSError *error = nil;
    [theFetchedResultsController performFetch:&error];
    theFetchedResultsController.delegate = self;
    self.fetchedResultsController = theFetchedResultsController;

    // Listen for this notification so that the managedObjectContext runs on the main thread
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(contextChanged:) name:NSManagedObjectContextDidSaveNotification object:nil];

    return _fetchedResultsController;
}



- (void)contextChanged:(NSNotification*)notification
{
    NSManagedObjectContext *context = [notification object];
    if ([context isEqual:self.managedObjectContext]) {
        return;
    }

    if (![NSThread isMainThread]) {
        [self performSelectorOnMainThread:@selector(contextChanged:) withObject:notification waitUntilDone:YES];
        return;
    }

    [[self managedObjectContext] mergeChangesFromContextDidSaveNotification:notification];
}

据我所知,所有连接都是通过代码或情节提要进行的。 我知道数据库中记录了更改,因为我正在监听NSManagedObjectContextDidSaveNotification

这让我感到难过,因此,我感谢任何建议或面包屑。 我很乐意回答任何问题或在需要时发布更多代码!

contextChanged:应该在MainThread上调用,因为它涉及UI更新。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM