2016-11-19 1 views
0

Ich habe eine funktionierende UITableView unterstützt von Core Data.geholtObjects ist Null nach performFetch, aber TabelleView hat Daten

ich Umsetzung bin jetzt ein Merkmal, dass, wenn die Tabelle leer ist, deaktiviere ich die rightBarButtonItem:

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear: animated]; 

    self.navigationItem.rightBarButtonItem.enabled = self.fetchedResultsController.fetchedObjects ? YES : NO; 
} 

Aber auch wenn die Tabelle Artikel, self.fetchedResultsController.fetchedObjects gibt nil zurück, so wird die Taste immer deaktiviert.

Ich rufe performFetch in viewDidLoad.

Ich habe diesen Code in ViewDidLoad versucht, aber das gleiche passiert.

Warum ist self.fetchedResultsController.fetchedObjects Null, auch wenn die Tabelle ausgefüllt ist?

EDIT hinzugefügt mehr Code

Artikel sofort in ein Kind Kontext erzeugt werden, bevor die Tabelle zeigt. Derselbe Kontext wird für die fetchRequest verwendet.

Die Elemente befinden sich definitiv im Kontext, da die Tabelle mit den Elementen im untergeordneten Kontext gefüllt wird. Wenn Sie jedoch viewWillAppear aufrufen, ist self.fetchedResultsController.fetchedObjects immer noch Null. Diese

ist, wie ich performFetch nennen (in viewDidLoad):

 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 
NSError *error = nil; 
if (![self.fetchedResultsController performFetch: &error]) 
{ 
     NSLog(@"Failed to perform fetch: %@", error); 
} 

dispatch_async(dispatch_get_main_queue(), ^{ 
      [self.tableView reloadData]; 
    }); 
    }); 

ich den Kontext speichere vor dem VC zeigt.

+0

fügen Sie bitte Code aufrufen. –

Antwort

1

Haben Sie versucht, self.fetchedResultsController.fetchedObjects in Ihrem dispatchBlock wie diese zum Abrufen und NSManagedObjectContext Konfiguration

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 
NSError *error = nil; 
if (![self.fetchedResultsController performFetch: &error]) 
{ 
     NSLog(@"Failed to perform fetch: %@", error); 
} 

dispatch_async(dispatch_get_main_queue(), ^{ 
      self.navigationItem.rightBarButtonItem.enabled = self.fetchedResultsController.fetchedObjects ? YES : NO; 
      [self.tableView reloadData]; 
    }); 
    }); 
+0

Wow das funktioniert. Es muss noch einen weiteren Grund geben, dass "fetchedObjects" nach dem Anzeigen der Tabelle gelöscht wird. Ich werde nachforschen. Da der 'performFetch'-Code in einer Super-Klasse ist und nicht alle Unterklassen die Schaltfläche haben, muss ich meinen Code etwas umgestalten, aber das sollte kein Problem sein. Ich überprüfe jetzt auch nach "self.fetchedResultsController.fetchedObjects.count", da 'fetchedObjects' existiert, aber leer ist. – Koen

+1

Das Problem ist, dass Sie die Daten in Async-Warteschlange abrufen, die einige Zeit dauern wird und Sie 'self.fetchedResultsController.fetchedObjects' in viewWillAppear verwenden, möglicherweise zu diesem Zeitpunkt das Ergebnis nicht abgerufen wird – Rajat

+0

Ja, darüber habe ich auch nachgedacht . Aber immer noch wird der Tisch bevölkert, also muss die Verzögerung sehr, sehr kurz sein. Als ich den Button enable Code in 'viewDidAppear' gesetzt habe, funktionierte es, aber dann erschien zuerst die Ansicht, und dann wurde die Schaltfläche abgeblendet, was nicht gut aussieht. Alles funktioniert jetzt gut. – Koen

Verwandte Themen