Verständnis Problem

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

  • Verständnis Problem

    Hallo zusammen,

    irgendwie stehe ich gerade auf dem Schlauch und weiß nicht wie ich das Problem angehen kann.

    Kurzbeschreibung: Ich habe 2 Views im Storyboard eines Testprojektes (Single View Application).
    Auf dem ersten sind ein Textfeld und ein Button.
    Auf dem 2. View ist nur ein Label. Der Button ist über eine Push-Sequence mit dem 2. View verknüpft.
    Das klappt soweit auch und im Simulator wird dann auch brav der 2. View aufgerufen, wenn ich den Button klicke.

    Wie stelle ich es aber an, dass der Text vom ersten View beim Button-Click "mitgepusht" wird, damit ich ihn im 2. View ausgeben kann? Bzw. wie kann ich ihn dort wieder ausgeben?

    Ratlos,
    Poscht
  • Ok, der Nebel lichtet sich langsam. :)
    Jetzt wird die Sequenze angesprungen und auch unter dem richtigen Namen erkannt.

    Mich verwirrt nur noch etwas anderes.
    Wird nicht, wenn ich dem Projekt einen weiteren View hinzufüge, immer auch die entsprechende *.h und *.m Datei hinzugefügt?
    Oder habe ich hier was falsch verstanden?
  • poscht schrieb:

    Ok, der Nebel lichtet sich langsam. :)
    Wird nicht, wenn ich dem Projekt einen weiteren View hinzufüge, immer auch die entsprechende *.h und *.m Datei hinzugefügt?
    Oder habe ich hier was falsch verstanden?


    Ja hast du falsch verstanden. Es gibt einen Unterschied zwischen Klassen und Objekten. Wenn du im Storyboard eine weitere View hinzufügst erstellst du nur ein neues Objekt.
  • ioscampus schrieb:

    Ja hast du falsch verstanden. Es gibt einen Unterschied zwischen Klassen und Objekten. Wenn du im Storyboard eine weitere View hinzufügst erstellst du nur ein neues Objekt.
    Dann verstehe ich Beispiele wie das folgende nicht.
    agilewarrior.wordpress.com/201…iewcontroller-to-another/
    Im Abschnitt "Prepare for segue" finde ich den folgenden Code:

    Quellcode

    1. #import "DoctorViewController.h"
    2. #import "HappinessViewController.h"

    Woher kommen diese Header-Dateien?
    Kann mich bitte jemand erleuchten?

    Ratlos,
    Poscht
  • ioscampus schrieb:

    Ja hast du falsch verstanden. Es gibt einen Unterschied zwischen Klassen und Objekten. Wenn du im Storyboard eine weitere View hinzufügst erstellst du nur ein neues Objekt.
    Dann verstehe ich Beispiele wie das folgende nicht. agilewarrior.wordpress.com/201…iewcontroller-to-another/ Im Abschnitt "Prepare for segue" finde ich den folgenden Code:

    Quellcode

    1. #import "DoctorViewController.h"
    2. #import "HappinessViewController.h"
    Woher kommen diese Header-Dateien? Kann mich bitte jemand erleuchten? Ratlos, Poscht
    Da fehlt das casten des DestinationControllers
  • poscht schrieb:

    Quellcode

    1. #import "DoctorViewController.h"
    2. #import "HappinessViewController.h"

    Woher kommen diese Header-Dateien?
    Kann mich bitte jemand erleuchten?

    Aus dem Projektverzeichnis. Die hat der Autor manuell angelegt und mindestens ebenso manuell im Quelltext importiert.

    Wie der Name erkennen lässt, werden dort ViewController importiert. Damit braucht sich der Autor nicht mehr um die einzelnen Views kümmern sondern steuert alles über die Controller.
    Es wird also ausgiebig das Model View Controller Paradigma genutzt. Im Übrigen ist das eine sehr gute Idee.

    Wie dem auch sei, Du denkst verkehrt herum. Nicht jedes Objekt, dass Du hinzufügst, erstellt eine .h und .m Datei.
    Aber jede .h/.m Dateikombination, die Du erstellst, ermöglicht es Dir eigene Objekte zu benutzen.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Ok, das hat mir schon mal ein ganzes Stück weitergeholfen.
    Nun habe ich für jeden meiner Views einen Controller erstellt und den mit dem jew. View verknüpft.
    Im ersten View habe ich die Methode prepareForSegue, mit der ich den Wert des Textfeldes erfolgreich an den 2. Controller übergeben kann und damit dessen Title ändere.

    Quellcode

    1. - (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    2. if ([segue.identifier isEqualToString:@"TestSegue"])
    3. {
    4. secondViewController *nextController = segue.destinationViewController;
    5. [nextController setTitle:self.TestText.text];
    6. }
    7. }


    Was mir jetzt noch fehlt: Wie kann ich den Text nun an eine andere Methode in dem 2. View übergeben?
    Diese Methode steht in der Im @implementation im 2. Controller.

    Quellcode

    1. - (void) setText:(NSString *)paramText
    2. {
    3. self.title = paramText;
    4. }

    Nur ist sie vom ersten Controller aus nicht sichtbar. Wie muß ich diese im Interface definieren, damit ich die Methode auch von außen verwenden kann?
  • Im Interface vom secondViewController (schrecklicher Name für eine Klasse):

    - (void) setText:(NSString *)paramText;

    Anscheinend handelt es sich ja um den gleichen Text. Je nach Anwendungsfall könnte es sinnvoll sein den Text einfach im init vom secondViewController zu verarbeiten / zu verbreiten / für alles zu benutzen, was du damit vor hast. Außerdem setzt deine Methode setText ja auch nur den Title vom secondViewController; was du ja bereits in prepareForSegue getan hast. Ist das dann nicht doppelt?
  • ioscampus schrieb:

    Im Interface vom secondViewController (schrecklicher Name für eine Klasse):

    - (void) setText:(NSString *)paramText;

    Anscheinend handelt es sich ja um den gleichen Text. Je nach Anwendungsfall könnte es sinnvoll sein den Text einfach im init vom secondViewController zu verarbeiten / zu verbreiten / für alles zu benutzen, was du damit vor hast. Außerdem setzt deine Methode setText ja auch nur den Title vom secondViewController; was du ja bereits in prepareForSegue getan hast. Ist das dann nicht doppelt?
    Perfekt, danke! :)
    Ja, die Methode macht das Gleiche. Da ich sie ohne die fehlende Definition nicht aufrufen konnte habe ich als "Workaround" den Title erst mal direkt angesprochen.
    Und ja, der Name ist wirklich nicht toll. :) Ist halt erst mal nur ein Testprojekt.

    Grüße,
    Poscht
  • Eine Frage hätte ich da noch ... ;)
    Ich habe die folgende Methode in meiner Netzwerk-Klasse.
    Sie funktioniert soweit, die URL wird zu Beginn ordentlich zusammengesetzt und liest auch die gewünschte Seite ein.

    Wenn ich NSLog verwende wird mir auch das HTML im Debugger ausgegeben.

    Quellcode

    1. NSLog(@"HTML = %@", html);

    Aber der Returnwert am Ende der Methode ist leer (gleiche Variable) und ich bekomme "" als Rückgabe?!
    Kann mir bitte einer sagen warum?

    Quellcode

    1. - (NSString *)getData:(NSString*)URL{
    2. NSString *urlAsString = [ShopURL stringByAppendingString:URL];
    3. NSString *html = @"";
    4. NSURL *url = [NSURL URLWithString:urlAsString];
    5. NSMutableURLRequest *urlRequest =
    6. [NSMutableURLRequest requestWithURL:url];
    7. [urlRequest setTimeoutInterval:30.0f];
    8. [urlRequest setHTTPMethod:@"GET"];
    9. NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    10. [NSURLConnection
    11. sendAsynchronousRequest:urlRequest
    12. queue:queue
    13. completionHandler:^(NSURLResponse *response,
    14. NSData *data,
    15. NSError *error) {
    16. if ([data length] >0 && error == nil)
    17. {
    18. NSString *html =
    19. [[NSString alloc] initWithData:data
    20. encoding:NSUTF8StringEncoding];
    21. NSLog(@"HTML = %@", html);
    22. }
    23. else if ([data length] == 0 && error == nil)
    24. {
    25. NSLog(@"Nothing was downloaded.");
    26. }
    27. else if (error != nil)
    28. {
    29. NSLog(@"Error happened = %@", error);
    30. }
    31. }];
    32. return html;
    33. }
    Alles anzeigen
  • html wird zweimal instanziiert. Einmal ausserhalb des Blocks, und einmal im Block. Im Block gibt es nen Inhalt
    , ausserhalb "".

    Aber: so kann das gar nicht gehen, der asynchrones Laden des HTMLs = Laden im Hintergrund
    in einer Queue. Du musst quasi abwarten, bis das beendet ist, bevor du den inhalt zurückgeben kannst.

    Volker
  • volker schrieb:

    html wird zweimal instanziiert. Einmal ausserhalb des Blocks, und einmal im Block. Im Block gibt es nen Inhalt
    , ausserhalb "".

    Aber: so kann das gar nicht gehen, der asynchrones Laden des HTMLs = Laden im Hintergrund
    in einer Queue. Du musst quasi abwarten, bis das beendet ist, bevor du den inhalt zurückgeben kannst.

    Volker
    *Hand an den Kopf klatsch
    Danke! Ist wohl doch schon zu spät heute für mich. :)

    Grüße,
    Poscht