簡體   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