BackgroundColor eines Views über anderen Viewcontroller ändern

  • BackgroundColor eines Views über anderen Viewcontroller ändern

    Hi,

    ich versuche die Hintergrundfarbe des Views im "Haupt" Viewcontroller durch einen Button in einem anderen zweiten ViewController zu ändern.
    Ich habe bis jetzt in der Klasse des zweiten ViewControllers die headerdatei des ersten importiert und folgenden Code für die Action des buttons geschrieben:

    Quellcode

    1. - (IBAction)buttonAendern:(id)sender
    2. {
    3. MainViewController *mvc;
    4. [UIView animateWithDuration:3.0 animations:^{
    5. mvc.mainView.backgroundColor = [UIColor greenColor];
    6. }];
    7. }


    Das funktioniert schon mal nicht. Es wird nichts geändert !
    Außerdem möchte ich, dass nach dem drücken des buttons nicht nur die Farbe des MainViews geändert wird, sondern dieser auch gepusht wird.
    Dazu habe ich folgenden Code geschrieben:

    Quellcode

    1. [self.navigationController pushViewController:mvc animated:YES];



    Das geht aber auch nicht, was mich sehr verwundert, da ich das schon andere male erfolgreich benutzt habe.
    Was fehlt oder was mache ich falsch ???

    Vielen Dank im voraus
    Check out my Apps:

    PinguFlap and writtenWatch
  • AppleDeveloper schrieb:

    Du musst den ViewController anhand seines Indetifiers initaliserien. Das heißt, wenn du Storyboard nimmst gibst du den ViewController eine StoryboardID und tust diesen dann über folgenden Code initalisieren:

    Quellcode

    1. MainViewController *mvc = [self.storyboard instantiateViewControllerWithIdentifier:@"deinIdentifier"]
    Danke :) Es klappt aber trotzdem nicht :(
    Check out my Apps:

    PinguFlap and writtenWatch
  • Dein MasterViewController braucht einen NavigationController.

    Arbeitest du mit Storyboard?

    Wenn ja:

    - klick den Controller der den neuen pushen soll im Storyboard an.
    Dann Editor->Embed In->NavigationController.

    Dann prüfe mal im Code, ob mvc == nil ist.

    Wieso änderst du die Farbe eigentlich nicht in der viewDidLoad-Methode des Controller der angezeigt werden soll?
  • matz schrieb:

    Wieso änderst du die Farbe eigentlich nicht in der viewDidLoad-Methode des Controller der angezeigt werden soll?
    Ich habe hier ganz grob den Sachverhalt meines Projekts dargestellt. Ich habe als Vorlage die UtilityApplication genommen und in diesem sind ja 2 ViewController über einen Modalen Segue verbunden. Der Zweite ViewController (FlipsideViewController) dient für mich als Einstellungsseite. Auf dieser Seite habe ich z.B. einen Button der die Hintergrundfarbe ändert. Beim Druck auf diesen Button wird wiederum über einen Modalen Segue ein dritter manuell hinzugefügter ViewController (über PartialCurl) eingeblendet. Auf diesem ist ein UIPickerView, den ich über ein Array mit mehreren Strings für die jeweiligen Farben gefüllt habe. Über die Methode didSelectRow benutze ich den Code, den ich oben für den "button" geschrieben habe und lege so je nach row, die Farbe des Views fest.
    Danach soll auch automatisch der MainViewController wieder eingeblendet werden. Da mit einem NavigationController das Design und Funktionsweise meiner App gestört werden würde, hätte ich nun gern gewusst ob man auch einen Modalen Segue codebasiert erstellen und ausführen kann ??
    Check out my Apps:

    PinguFlap and writtenWatch
  • matz schrieb:

    Segue manuell erstellen kannst du natürlich ;) Aber dafür brauchst du keine Segue, sondern machst das normal wie man es ohne Segue machen würde.
    Meinst du folgendes ??

    Quellcode

    1. FlipsideViewController *fvc = [self.storyboard instantiateViewControllerWithIdentifier:@"identifier"]; [self dismissViewControllerAnimated:YES completion:nil]; [fvc dismissViewControllerAnimated:YES completion:nil];



    also self.dismiss funktioniert, aber den anderen kann ich nicht dismissen. Oder könnte man den schon vorhanden gewesenen done button auf dem FlipsideViewController über Code aufrufen, sodass die damit verbundene Aktion(nämlich wieder den Haupptview anzuzeigen) ausgeführt wird. Wäre also das selbe wie dismissViewController. Aber das funktioniert immer noch nicht, trotz instanzierung (wie in code) des pointers fvc...
    Check out my Apps:

    PinguFlap and writtenWatch
  • matz schrieb:

    Mach doch in der didSelect-Methode des PickerView ein [self dismissViewControllerAnimated:YES completion: NULL];
    Dann hast du schon mal einen ViewController weg und der FlipSideViewController hat sowieso die Funktionalität zum Zurückkehre
    Das habe ich schon gemacht. Aber ich möchte eben, dass auch der FlipsideViewController automatisch sofort danach weicht und somit noch die im dritten View ausgelöste Backgroundcoloranimation des MainViews zeigt. Ich will, dass der User sofort sieht, was er geändert hat und wie sich das auf die App auswirkt :D
    Check out my Apps:

    PinguFlap and writtenWatch
  • Ok, ich habe mich jetzt etwas in die Delegation eingelesen und habe folgendermaßen mein Projekt damit "ausgestattet":

    Ich habe einen MainViewController und einen PickerViewController. Wenn ich im PickerViewController auf den button Ändern drücke soll der View im MainViewController beispielsweise grün werden.


    Code für PickerViewController.h:

    Quellcode

    1. #import <UIKit/UIKit.h>
    2. @protocol PickerDelegate <NSObject>
    3. -(void)colorChanged:(UIColor*) backgroundColor;
    4. @end
    5. @interface PickerViewController : UIViewController <UIPickerViewDelegate, UIPickerViewDataSource> {
    6. id<PickerDelegate> delegate;
    7. }
    8. @property (strong, nonatomic) IBOutlet UIPickerView *colorPickerView;
    9. @property(nonatomic,assign)id delegate;
    10. - (IBAction)buttonAendern:(id)sender;
    11. @end
    Alles anzeigen




    Code für button in PickerViewController.m:

    Quellcode

    1. - (IBAction)buttonAendern:(id)sender
    2. {
    3. if([delegate respondsToSelector:@selector(colorChanged:)])
    4. {
    5. [delegate colorChanged:[UIColor greenColor]];
    6. }
    7. [self dismissViewControllerAnimated:YES completion:nil];}



    In MainViewController.h habe ich dann entsprechend das PickerDelegate implementiert und in MainViewController.m noch die colorChanged Methode aus dem PickerViewController definiert:

    Quellcode

    1. - (void) colorChanged:(UIColor *)backgroundColor
    2. {
    3. self.mainView.backgroundColor = backgroundColor;
    4. }



    Leider funktioniert es nicht :( Was habe ich vergessen oder wo liegt der Fehler ???

    Vielen Dank im voraus
    Check out my Apps:

    PinguFlap and writtenWatch
  • macmoonshine schrieb:

    Setz mal ein paar sinnvolle Breakpoints und schau, ob Dein Code auch ausgeführt wird.
    Ich habe einen "All Exceptions" Breakpoint gesetzt, also sollte bei irgendwelchen Problemen sofort die Fehlerzeile markiert werden, aber das Problem ist, das alles komplett stabil ohne Probleme läuft, aber die Funktion die ich erzielen wollte einfach nicht eintritt. Wenn ich den Button im PickerViewController drücke, soll ja eigentlich der View des MainViewControllers Grün gefärbt werden...
    Noch irgendwelche anderen Fehler ???
    Check out my Apps:

    PinguFlap and writtenWatch
  • Thallius schrieb:

    Mach einen Breakpoint in die IBAction und schau mal of das Delegate überhaupt gesetzt ist bzw geh doch dann einfach mal in Einzelschritten durch den Code und schau was er aufruft.

    Gruß

    Claus
    Ok jetz habe ich die Problemstelle gefunden: In der buttonAendern Methode im PickerViewController.m wird ja mit dem if-statement geprüft ob die Methode colorChanged: über den selector überhaupt "antwortet". Offensichtlich wird aus irgendeinem Grund die colorChanged Methode die im MainViewController.m eingesetzt und vervollständigt ist, nicht aufgerufen. Was könnte der Fehler sein ??? Ich habe soweit alles beachtet...
    Check out my Apps:

    PinguFlap and writtenWatch