Label einer anderen View verändern

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Label einer anderen View verändern

    Hallo,

    ich bin neu hier und habe auch direkt eine Frage. Ich bin neu was Objective C angeht, ich kenn mich jedoch mit C++ aus. Trotzdem werden mir einige Dinge nicht so klar.
    Was ich zur Zeit versuche. Ich habe 2 View Controller. VC1 hat einen Button und ein Label, welches im VC2 geändert werden soll. Das ganze ist eingebettet in einem NavigationViewController.

    Im VC1 gelangt man durch einen Button in den VC2, welcher ein Textfeld hat. Der eingegebene Text soll dann das Label in VC1 ersetzen.

    Ich habe den Code der 4 Dateien mal bei Git hochgeladen.
    Ich hoffe einer kann man das genau erklären und mir dabei kurz helfen.
    Ich habe die Stelle in der Datei "Namensraum.m" unten deutlich gemacht!

    github.com/gchroner/ios_test.git


    Viele Grüße
  • Super und vielen lieben Dank dafür!

    Ist es bei Objective C wirklich so aufwendig in eine andere Klasse bzw. View zu delegieren?

    Wärst du so freundlich und könntest im Quelltext ein paar Kommentare setzen zu den Methoden und der genauen Vorgehensweise? Dann würde mir das noch ein bisschen mehr einleuchten.

    LG
  • Die Lösung heisst, wie in vielen Fällen bei derartigen Fragen/Problemen, MVC bzw. Model View Controller oder MVC-Entwurfsmuster. ;)

    Du solltest den eingegebenen Wert also nicht direkt in dem gewünschten Label, also der Anzeige, anpassen, sondern in Deinem Datenmodel speichern. Wenn der entsprechende View dann wieder zur Anzeige kommt, in welchem der Wert aus dem Datenmodel angezeigt wird, dann kannst Du die Anzeige in dem entsprechenden Label aktualisieren. Dafür gibt es im ViewController z.B. die Methode viewWillAppear:, welche aufgerufen wird, bevor der entsprechende ViewController bzw. dessen View angezeigt wird.

    Ich kann mir nicht vorstellen, dass MVC unter C++ nicht verwendet wird.
  • Danke für den Link. Werde dort gleich mal reinschnuppern.

    So, habe mir das mal angeschaut, ganz schlau werde ich trotzdem noch nicht daraus.

    Ich verstehe nicht, wie das alles zusammenhängt. Evtl. wären noch ein paar Erklärungen für mich nötig.

    In den unten angegebenen Codebeispielen beziehe ich mit auf das Projekt von @matz.

    Ich habe also 2 View. View 1 mit dem Label und View 2 in dem das Label von View 1 geändert werden soll.
    Soweit die Herausforderung.

    In View 1 befindet sich also nur das Label mit einem vorbelegten Text.

    View 2 beinhaltet dann ein Textfeld, welches dann durch drücken der Enter Taste auf der Tastatur das Label in 1 ändern soll. Soweit so gut.


    Jetzt habe ich dazu folgende Fragen.

    Warum muss ich in der .h von View2 eine @class definieren?

    Quellcode

    1. @class ChangeNameViewController;


    Wozu dient jetzt genau das Protocol?

    Quellcode

    1. @protocol ChangeNameViewControllerDelagte <NSObject>


    Warum brauche ich diese Methode und warum brauch ich diese Methode in der View2 obwohl der Name ja in View1 geändert werden soll?

    Quellcode

    1. - (void) ChangeNameViewController:(ChangeNameViewController *)controller didChangeName:(NSString *)name;


    Wozu wird die @property genutzt?

    Quellcode

    1. @property (nonatomic, strong) id<ChangeNameViewControllerDelagte>delegate;


    In der View2.m steht bei viewDidLoad folgendes:

    Quellcode

    1. - (void)viewDidLoad
    2. {
    3. [super viewDidLoad];
    4. [[self nameTextField] setDelegate:self];
    5. }



    Was besagt diese Zeile genau?

    Quellcode

    1. [[self nameTextField] setDelegate:self];



    Evtl. könnte @MCDan mir ja das Beispiel mit dem MVC erklären? Wie stelle ich das mit einem MVC an ohne dabei "Delegate" zu benutzen?

    LG

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Shizophren ()

  • In der Softwareentwicklung gibt es nicht nur 1 korrekte Lösung sondern viele, welche zwar durchaus ähnlich sind, sich aber, je nach Situation und in teilweise nur winzigen Details, voneinander unterscheiden.

    Wenn das von Dir o.a. Beispiel z.B. für die Einstellungen in einer App verwendet wird, dann gibt es dafür die unterschiedlichsten Lösungen.

    Wenn Du den entsprechenden Wert für die Einstellungen z.B. in den UserDefaults speicherst, dann würde es z.B. reichen dem 2. ViewController einfach nur den jeweiligen Key für die UserDefaults zur Verfügung zu stellen. Somit hättest Du z.B. einen ViewController, welcher in der Lage ist unterschiedliche Werte in den UserDefaults zu ändern. Allerdings lassen sich damit dann nur Werte in den UserDefaults anzeigen und ändern.

    Wenn Du jedoch einen ViewController haben möchtest, welcher nicht nur Werte in den UserDefaults anzeigen und ändern kann, dann musst Du sicherlich eine andere Lösung wählen. Hier bieten sich natürlich wieder verschiedene Varianten an.

    Eine Lösung über Delegation ist z.B. eine davon. Ein ViewController zeigt seinem Delegate also z.B. über eine definierte Delegate-Methode an, dass die Eingabe eines Wertes beendet wurde und übernommen werden soll. Alternativ könnte der ViewController z.B. über eine weitere Delegate-Methode die Eingabe eines Wertes abbrechen.

    Alternativ könnte man z.B. auch einen ViewController erstellen, welcher die Referenz auf ein Datenmodel und einen Key oder sogar Keypath erhält, um somit quasi direkt eine evtl. Änderung des Wertes im Datenmodel vornehmen zu können.

    Wenn ich noch ein wenig nachdenke, dann würden mir sicherlich noch weitere Lösungsmöglichkeiten einfallen, z.B. über Notifications.

    Wenn Du wirklich wissen und verstehen möchtest, wie die o.a. Lösungen genau funktionieren, dann kannst Du diese ja mal der Reihe nach umsetzten. Dabei wirst Du dann sicherlich auch evtl. Vor- und Nachteile der jeweiligen Lösung kennen lernen.
  • Danke dir. Ich kann das Prinzip nachvollziehen, jedoch nicht so ohne weiteres auf meinen Code oder auf das von mir gewünschte Ergebnis anwenden.
    Ich möchte einfach in View2 ein Label von View1 ändern. Am besten ohne Delegate oder sonst etwas. So einfach wie möglich. Wenn es geht sogar mur mit einer Klasse, spricht ein ViewController und zwei View mit diesem Verbinden. Aber auch das schaffe ich ohne weiteres nicht.

    Habe ich einen ViewController und damit 2 Views verlinkt, weiß ich leider nicht, wie ich ein Label / Textfeld etc. in dem jeweiligen View ansprechen kann.

    Ich habe irgendwo etwas von IBOutlet gelesen, es aber nicht korrekt hinbekommen. Ich ziehe meine Labels und Textfelder immer über das Storyboard mit STRG an die korrekte Stelle. Dann gebe ich einen Namen und habe jeweils ein Outlet. Die Views sind auch beide der Klasse "ViewController" zugeordnet.

    Gruß