2017-03-18 6 views
1

Ich habe einen Timer in einer Tabbar-Klasse ausgeführt, die bei jedem Aufruf Daten in die Cloud speichert. Dann möchte ich, dass eine Methode auf dem aktuell ausgewählten View-Controller aufgerufen wird, um dem Benutzer mitzuteilen, was gespeichert wurde. Ich mache das mit folgendem.Aufruf von View-Controller-Methode aus TabBarClass

Dies funktioniert und die Methode wird aufgerufen, wenn es die Registerkarte auswählen ist.

NSString *teststring = [formatter stringFromDate:todaysDate]; 
NSLog(@"%@", teststring); 

self.TestLab.text = teststring; 

Das NSlog wird jedes Mal angezeigt, aber der Etikettentext wird nicht aktualisiert. Ich bin sicher, es ist einfach, aber ich kann nicht mit der Lösung kommen.

Antwort

2

Diese

MessagesViewController *msgView = [[MessagesViewController alloc]init]; 

Ordnet eine neue Instanz von MessagesViewController. Sie erhalten keinen Verweis auf die View Controller-Instanz, die gerade aktiv ist. Die Methode wird auf dieser neuen Instanz ausgeführt, so dass Sie die NSLog Ausgabe erhalten, aber das Textfeld ist wahrscheinlich nil und zumindest nicht auf dem Bildschirm.

Sie können die selectedViewController Eigenschaft eines UITabBarController verwenden, um den aktuell ausgewählten Ansichtscontroller zu erhalten.

if (self.selectedIndex == 1) { 
    MessagesViewController *msgView = (MessagesViewController *)self.selectedViewController; 
    NSLog(@"Running"); 
    [msgView testMethod]; 
} 
+0

Danke. Genau das, wonach ich gesucht habe. Es hat mich jetzt denken lassen, wenn ich die aktuelle Instanz der Tabarklasse von der MessagesViewController erhalten muss, gibt es einen ähnlichen Aufruf von self.selectedViewController? – joffd

+0

'self.parent' sollte Ihnen den Tab-Bar-Controller geben – Paulw11

+0

Arbeitete auch. Vielen Dank – joffd

-2

Da es ein Timer ist, könnte es in einem anderen Thread sein? Und Sie können die Benutzeroberfläche in keinem anderen Thread als dem Hauptthread aktualisieren. Versuchen Sie folgendes:

dispatch_async(dispatch_get_main_queue(), ^{ 
    self.TestLab.text = teststring; 
});