2015-01-19 5 views
18

Ich habe eine App für iPhone mit einem Tableview, dessen Daten von CoreData stammen.Wie kann ich die Daten in einer WatchKit-Tabellenansicht erneut laden?

enter image description here

Wenn ich eine Zeile aus dem iPhone-App hinzufügen:

enter image description here

und ich

enter image description here

die gleichen Daten werden auch in einer Uhr App angezeigt Laden Sie Daten in der Watch-App neu:

enter image description here

Ich sehe die alten Reihen leer! richtig

enter image description here

Wenn die die App Stoppuhr und ich beginne es wieder, erscheint alles!

enter image description here

Dies ist der Code der Tableview in der Uhr App

-(void)awakeWithContext:(id)context{ 
    [super awakeWithContext:context]; 
     [self loadTable]; 
} 

-(void)loadTable{ 
    NSLog(@"loadTableData"); 
    NSManagedObjectContext *managedObjectContext = [self managedObjectContext]; 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Data"]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Data" 
     inManagedObjectContext:managedObjectContext]; 
    [fetchRequest setEntity:entity]; 

    NSSortDescriptor *sortByDate = [[NSSortDescriptor alloc] initWithKey:@"sortedDateAndTime" ascending:NO]; 
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortByDate, nil]; 
    [fetchRequest setSortDescriptors:sortDescriptors]; 
    self.watchMArray = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy]; 

    // [self.watchTableView setRowTypes:self.watchMArray]; 
    [self.watchTableView setNumberOfRows:self.watchMArray.count withRowType:@"data"]; 

    for (NSInteger i = 0; i < self.watchMArray.count; i++) 
    { 
     WatchTableCell *cell = [self.watchTableView rowControllerAtIndex:i]; 
     NSManagedObject *data = [self.watchMArray objectAtIndex:i]; 
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){ 
      //Background Thread 
      UIImage *foto =[self loadImageFromData:[data valueForKey:@"imageData"]]; 
      dispatch_async(dispatch_get_main_queue(), ^(void){ 
       //Run UI Updates 
      [cell.watchImage setImage:foto]; 
      [cell.watchDate setText:[NSString stringWithFormat:@"%@", [data valueForKey:@"dataEOra"] ]]; 
      }); 
     }); 
    } 
} 

Dies ist der Code, den ich es neu zu laden verwenden bin derzeit zu besetzen:

- (IBAction)reloadTable {   
    [self loadTable]; 
} 

Wo bin ich falsch?

+0

Schwer zu sagen. Ich würde diesen Code in LLDB durchgehen wollen, was sicherlich nützlich wäre. –

+0

seit WatchOS2.0 veröffentlicht, kann ich wissen, wie Sie es schaffen, die gleiche Sache (Coredata über iOS und WatchOS Datenkonsistenz) jetzt zu tun? –

+0

Mit watchOS 2 Coredata ist ein großes Problem !! – Ragazzetto

Antwort

10

In dem Link @leolobato geschrieben, gibt es tatsächlich eine Problemumgehung. Es hat mein Problem gelöst.

https://devforums.apple.com/message/1098875#1098875

, wenn Sie Ihre Reihen setzen sie nur zu = @ "" zuerst ändern.

Zum Beispiel, wenn Ihre Zeile eine row.Label hat und Sie es ändern, tun row.Label.text = @ "", dann wieder rechts nach row.Label.text = @ "[Actual Text]"

+0

Großartig !!!! Jetzt funktioniert es perfekt !!! Danke @Bonan !! – Ragazzetto

+0

Es ist dein Beitrag hat mich zu diesem Beitrag geführt und mein Problem gelöst, also danke :) – Bonan

+0

Nein nein, danke !! – Ragazzetto

3

Aufruf der setRowTypes: oder setNumberOfRows:withRowType: Methode.

Unten ist eine Aussage aus dem Entwicklerdokument, ich glaube, das wird funktionieren.

Wenn Sie den Inhalt einer Tabelle aktualisieren möchten, rufen Sie setRowTypes: oder setNumberOfRows: withRowType: wieder mit dem neuen Typ Informationszeile. Wenn Sie diese Methoden erneut aufrufen, wird die Tabelle gezwungen, die alten Zeilen zu verwerfen und neue zu erstellen. Um neue Zeilen einzufügen, ohne die alten zu entfernen, verwenden Sie die Methode insertRowsAtIndexes: withRowType:.

Link to document

+0

konsistent zu machen, wie Sie aus dem Code in der Methode loadTable sehen können, gibt es bereits einen Methodenaufruf [self.watchTableView setNumberOfRows : self.watchMArray.count mitRowType: @ "Datum"]; – Ragazzetto

+0

Technisch sollte es nur mit einer einzigen Codezeile arbeiten, wobei die setRowTypes erwähnt werden. Ich habe es nicht versucht, aber ich habe das Dokument gelesen, deshalb schicke ich dich. –

+0

Danke @JayahariV, ich habe den Duncan-Code verwendet, aber in meinem Fall hat die Änderung des Codes das Problem nicht gelöst !! Jetzt sind alle Reihen leer :-( – Ragazzetto

0

die Daten neu zu laden, Ihre IBAction ändern:

- (IBAction)reloadTable { 
    [self.watchTableView setNumberOfRows:self.watchMArray.count withRowType:@"data"]; 
} 

Von Apple's developer documentation on WKInterfaceTable

:

Diese Methode alle vorhandenen Zeilen aus der Tabelle entfernt und konfiguriert eine neue Reihe von Zeilen basierend auf den Informationen in den Parametern numberOfRows und rowType.

Wenn Sie setNumberOfRows:withRowType: in Ihrem ursprünglichen Code verwenden, habe ich das hier verwendet. Die Methode erreicht ebenfalls den gleichen Effekt.

+0

Danke für den Vorschlag Duncan, aber in meinem Fall hat die Änderung des Codes das Problem nicht gelöst !! Jetzt sind alle Zeilen leer :-( – Ragazzetto

+1

Umm, progress ?! :) –

+0

Yeah ;-) Das Merkwürdige ist das Detailview funktioniert tadellos, nur die Daten der Tabelle fehlen :-( – Ragazzetto

3

Ich habe festgestellt, dass der Aufruf von setNumberOfRows: rowType die Tabelle nicht aktualisiert, es sei denn, Sie rufen sie von der Methode willActivate auf. Ich hatte eine Delegate-Methode, die ich von einem modalen Controller aufruft, der eine neue Reihe von Datensätzen von der übergeordneten App abrufen und dann die Tabelle neu laden würde. Obwohl das Ausdrucken von numberOfRows die neue Anzahl von Zeilen, die ich gesetzt habe, zeigte, wurden die vorhandenen Zeilen visuell immer noch auf dem Bildschirm angezeigt. Erst nachdem ich in meiner Delegate-Methode ein Flag gesetzt habe und dann in WillActivate dieses Flag überprüft und erst dann die Tabelle neu geladen hat, hat es die Anzeige aktualisiert.

+0

Dies ist tatsächlich in den 'WKInterfaceController' dokumentiert. – mxcl

0

Ich glaube Sie zwei Dinge gleichzeitig tun müssen, um zu demselben Ergebnis tableview.reloadData() iOS Funktion zu erreichen, so eine Tabelle in der Uhr neu zu laden mit neu tun Daten wie folgt vor: 1-Call-table-Methode : setNumberOfRows 2-Schleife durch die Zeilen aktualisieren Werte.

vacationList.setNumberOfRows(dict.count, withRowType: "vacationRow") 
    for index in 0..<vacationList.numberOfRows { 
     if let controller = vacationList.rowControllerAtIndex(index) as? VacationRowcontroller { 
      controller.vacation = dict.objectForKey("\(index)") as? NSDictionary 
     } 
    } 

Hinweis: dict = Wörterbuch der neu aus Backend nachgeladen Daten.

Verwandte Themen