1

Ich hoffe wirklich, dass jemand helfen kann, da ich glaube, dass ich jede Option ausprobiert habe, die ich auf SC finden konnte. Zuerst tut mir leid, wenn der Code ist chaotisch oder das ist eine dumme Frage, Entwicklung ist nicht mein stärkster Punkt:/Weitergabe von Daten über den Navigations-Controller - Objective C

Grundsätzlich habe ich eine iPad-spezifische App im Storyboard erstellt, ich habe eine Reihe von View-Controller und Szenen und eingebettet haben ein Navigationscontroller. Die App ist sehr linear und bewegt sich nur durch jeden Bildschirm in der Reihenfolge (Sie können nicht innerhalb der App herumspringen).

Auf dem ersten Bildschirm gibt es 2 Auswahlen, die der Benutzer über 2 Tasten vornehmen kann. Diese zeigen jeweils ein Bild an und die Bilder, die sie auswählen, müssen auch auf jedem der nächsten Bildschirme angezeigt werden.

Wenn ich kein Navigations Controller eingebettet hatte es funktionierte ganz gut durch die folgenden Aufruf:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
if ([segue.identifier isEqualToString:@"passSegue"] && (parentImage.hidden == NO) && (parentImage2.hidden == NO)) { 
    ViewControllerGirl2 * vc = [segue destinationViewController]; 
    UIImage *imageView = [UIImage imageWithContentsOfFile:[[[NSBundle mainBundle] bundlePath] stringByAppendingString:@"/1.png"]]; 
    UIImage *imageView2 = [UIImage imageWithContentsOfFile:[[[NSBundle mainBundle] bundlePath] stringByAppendingString:@"/2.png"]]; 
    vc.parentImage = imageView; 
    vc.parentImage2 = imageView2;  
} 

Aber jetzt habe ich meine Bilder nicht mehr auf dem nächsten Bildschirm erscheinen in einem UINavigationController eingebettet. Ich habe die vorgeschlagenen Methoden ausprobiert:

UINavigationController *navController = [segue destinationViewController]; 
ViewControllerGirl2 *vc = (ViewControllerGirl2 *)navController.topViewController; 

Aber jede Weise, die ich versuchte, diese Vorschläge zu implementieren, stürzte es ab.

Jede Hilfe würde sehr geschätzt werden, da ich seit 2 Tagen fest auf diesem festgefahren bin.

+0

Was sagt es, wenn es abstürzt? Ich meine die Debug-Ausgabe, wenn überhaupt? –

+0

Hallo @EugeneZhenyaGordin heißt es: App beenden aufgrund nicht abgefangene Ausnahme 'NSInvalidArgumentException', Grund: '- [ViewControllerGirl2 topViewController]: Unbekannter Selektor zum Beispiel 0x7c9c13b0 gesendet' – Aggie

+0

so ist die destinationViewController ein UINavigationController oder ViewControllerGirl2 für Sie? schau im debug durch einen breakpoint, weil ich denke, du machst das falsche Casting dort .... der Fehler sagt dir, dass ViewControllerGirl2 nicht über die Methode topViewController verfügt, also nehme ich an, dass destinationViewController bereits ViewControllerGirl2 ist –

Antwort

0

Als schnelle Problemumgehung (wenn Sie Ihren UINavigationController subklassifiziert haben) können Sie ihr Eigenschaften von ParentImage hinzufügen, und innerhalb der Vorbereitung für segue ordnen Sie Ihre Bildwerte diesen Eigenschaften des Navigationscontrollers zu. Dann in der ViewWillAppear der Zielansicht Controller, können Sie tun:

self.parentImage = yourNavController.yourImageProperty1; 
self.parentImage2 = yourNavController.yourImageProperty1; 
+0

Danke dafür, aber ich scheine immer noch nicht in der Lage zu sein, die Vorbereitungen für die Arbeit von segue richtig zu machen, oder schlägst du vor, die Vorbereitung auf den Übergang komplett zu verwerfen? – Aggie

0

ich Ding Zielansicht Controller ist Navigation Conteoller. Probieren Sie es aus

UINavigationController * navController = [segue destinationViewController];

viewControllerGirl2 * vc2 = (ShowItemsTableViewController *) ([navController viewControllers] [0]);

Hoffe das hilft dir. .

+0

Danke, aber es hat das gleiche Ergebnis – Aggie

0

prepareforsegue verwendet für instantiate den Steuerungen und nicht UI-Eigenschaften, aber wenn Sie die UI-Eigenschaften Sie die viewDidLoad von Eltern verwenden, müssen festgelegt:

// in interface declare this 
@property (nonatomic, weak) ViewControllerGirl2 *childViewController; 

// in viewDidLoad 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    UIImage *image = [UIImage imageNamed:@"1.png"]; 
    self.childViewController.parentImage = image; 
} 

// in segue 
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.destinationViewController isKindOfClass:[ViewControllerGirl2 class]]) { 
     self. childViewController = segue.destinationViewController; 
    } 
} 

prepareforsegue läuft vor viewDidLoad, können Sie auch viewWillAppear verwenden in ihren Ort, aber nur für diesen Fall

Verwandte Themen