Problem mit presentingViewController Werte übergeben

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

  • Problem mit presentingViewController Werte übergeben

    Hallo Leute,
    ich habe ein Problem und hoffe sehr das ihr mir helfen könnt.
    Ich habe ein present auf ein View gemacht, wenn man jetzt auf ein Button klickt im neuem View mache ich ein dismiss davor will ich aber mein property um eine Zahl erhöhen.
    Meine lösung war diese hier.

    Quellcode

    1. LCMainGameViewController *mainGameViewController = (LCMainGameViewController*)self.presentingViewController;
    2. mainGameViewController.questionCounter++;
    3. [self dismissViewControllerAnimated:YES completion:nil];


    so viel wie ich weiss müsste das gehen nur mein presenting ist vom Type ein UINaviagtionController hier die passende Fehlermeldung dazu


    2013-01-14 15:28:25.073 LügeOderWahrheit[5020:c07] -[UINavigationController questionCounter]: unrecognized selector sent to instance 0xb050f70

    2013-01-14 15:28:25.073 LügeOderWahrheit[5020:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UINavigationController questionCounter]: unrecognized selector sent to instance 0xb050f70'

    *** First throw call stack:

    (0x1c94012 0x10d1e7e 0x1d1f4bd 0x1c83bbc 0x1c8394e 0x4ffc 0x10e5705 0x1c920 0x1c8b8 0xdd671 0xddbcf 0xdcd38 0x4c33f 0x4c552 0x2a3aa 0x1bcf8 0x1befdf9 0x1befad0 0x1c09bf5 0x1c09962 0x1c3abb6 0x1c39f44 0x1c39e1b 0x1bee7e3 0x1bee668 0x1965c 0x299d 0x28c5)

    libc++abi.dylib: terminate called throwing an exception


    Habt ihr eine lössung oder eine andere idee wie man das machen könnte ??


    MFG Marius

  • Wenn das eine Subklasse von UINavigationController ist, dann leg doch einfach die Property questionCounter an und synthetisiere sie.
    Ich bin mir allerdings gar nicht sicher, ob mainGameViewController.questionCounter++; überhaupt klappt. Ist ja schon eine spannende Mischung aus Setter und Getter.
    Falls nicht klappt da vielleicht mainGameViewController.questionCounter = mainGameViewController.questionCounter++; besser.
    «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
  • Lucas de Vil schrieb:

    Wenn das eine Subklasse von UINavigationController ist, dann leg doch einfach die Property questionCounter an und synthetisiere sie.
    Ich bin mir allerdings gar nicht sicher, ob mainGameViewController.questionCounter++; überhaupt klappt. Ist ja schon eine spannende Mischung aus Setter und Getter.
    Falls nicht klappt da vielleicht mainGameViewController.questionCounter = mainGameViewController.questionCounter++; besser.
    man sol doch kein

    synthesize mehr benutzten steht in der Dokumentation ^^
  • Ich sehe auf dieser Website nichts, wo ausdrücklich steht, dass man @synthesize nicht mehr verwenden soll. Und die Apple Dokumentation ist es auch nicht. Ich kann mich auch was überlesen haben und lasse mich gerne eines besseren belehren. Ich lese hier nur, das das ein neues Feature ist und man diesen verwenden kann aber nicht muss.
  • Piper schrieb:

    Lucas de Vil schrieb:

    Wenn das eine Subklasse von UINavigationController ist, dann leg doch einfach die Property questionCounter an und synthetisiere sie.
    Ich bin mir allerdings gar nicht sicher, ob mainGameViewController.questionCounter++; überhaupt klappt. Ist ja schon eine spannende Mischung aus Setter und Getter.
    Falls nicht klappt da vielleicht mainGameViewController.questionCounter = mainGameViewController.questionCounter++; besser.
    man sol doch kein

    synthesize mehr benutzten steht in der Dokumentation ^^

    Naja, darüber hatten wir hier schon mal referiert...
    Übrigens: 'braucht nicht' und 'soll nicht' sind gravierende Unterschiede. ;)

    Abgesehen davon gibt es noch Teil 2 meiner Aussage:
    instanzObjekt.getter++ ist ein spannendes Konstrukt, dass so nicht funktionieren muss.
    Denn wie würdest du es ohne Punktnotation schreiben?
    Geht nicht.
    Also
    [instanzObjekt setter:[instanzObjekt getter]++];

    Oder in deinem Fall:
    mainGameViewController.questionCounter = mainGameViewController.questionCounter++;

    Für mich riecht es zumindest nach einem Fehler, der daraus entstanden ist, dass du durch die Punktnotation das Messaging von Objective-C nicht verstanden hast.
    «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
  • Piper schrieb:

    Ich habe ein present auf ein View gemacht, wenn man jetzt auf ein Button klickt

    Wie genau? Code?

    Piper schrieb:

    mein presenting ist vom Type ein UINaviagtionController

    Was für eine Klasse hättest Du erwartet? Eventuell im Interface Builder die Klasse nicht richtig eingestellt?

    Lucas de Vil schrieb:

    Ich bin mir allerdings gar nicht sicher, ob mainGameViewController.questionCounter++; überhaupt klappt. Ist ja schon eine spannende Mischung aus Setter und Getter.

    Der Compiler bastelt da schon das richtige draus.

    Lucas de Vil schrieb:

    Falls nicht klappt da vielleicht mainGameViewController.questionCounter = mainGameViewController.questionCounter++; besser.

    Diese Zeile lässt sich reduzieren auf:

    Quellcode


    Wenn schon, dann so:

    Quellcode

    1. mainGameViewController.questionCounter = ++mainGameViewController.questionCounter;

    Michael
  • Noch eine Idee:

    C-Quellcode

    1. LCMainGameViewController *mainGameViewController = (LCMainGameViewController*)self.presentingViewController;

    Das bringt dir schlicht gar nichts, wenn der View Controller vom Typ UINavigationController ist, worauf die Exception schließen lässt.
    Denn Objective-C kann nicht casten. Das kann man mit Java vergleichen: (String)numberObject wirft eine java.lang.classcastexception, (NSString*)nsNumberObject läuft - ist aber immer noch ein nsNumberObject und kein NSString.

    Wenn du deinem UINavigationController im IB also nicht gesagt hast, dass er von der Klasse LCMainGameViewController ist, dann kennt er natürlich auch dessen Properties nicht.

    Michael schrieb:

    Lucas de Vil schrieb:

    Ich bin mir allerdings gar nicht sicher, ob mainGameViewController.questionCounter++; überhaupt klappt. Ist ja schon eine spannende Mischung aus Setter und Getter.

    Der Compiler bastelt da schon das richtige draus.

    Cool. Kluger Compiler. :)
    «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
  • Hi Michael,
    danke an allen die aktive an der Fehler suche sich beteiligen

    Was für eine Klasse hättest Du erwartet? Eventuell im Interface Builder die Klasse nicht richtig eingestellt?

    ich hätte als Type meinen mainGameViewController erwartet

    hier mein der present code

    Quellcode

    1. LCRightAnswerViewController *rightAnswerView =
    2. [self.storyboard instantiateViewControllerWithIdentifier:@"LCRightAnswerViewController"];
    3. [self presentViewController:rightAnswerView animated:YES completion:nil];

    ich werde jetzt ein paar Tipps von euch ausprobieren :D
  • Was du da machst sieht für mich nach "Spaghetti" Objectmodel aus. ;) Wenn du das MVC Design Pattern verwendest stehen solche Werte im Modell und nicht im ViewController.

    Dann kannst du eine Klasse haben, die die Questions verwaltet und wenn das ein zentrales Objekt ist implementiere ich sowas als Singleton.

    z.B.
    QuestionsStore.h:

    @interface QuestionsStore : NSObject
    {
    QuestionsStore *_sharedInstance;
    }

    @property (assign, nonatomic) NSInteger QuestionsCounter;

    QuestionStore.m

    - (QuestionsStore*) defaultInstance{
    if(!_sharedInstance){
    _shartInstance = [[QuestionsStore alloc]init]
    }
    return _sharedInstance;
    }

    Hier nicht vergessen noch init und initWithZone zu überschreiben ;)

    Such mal nach Singleton iOS SDK wenn du das nicht kennst.

    Der Childviewcontroller kann sich dann das Singleton mit z.B. mit

    [QuestionsStore defaultInstance];

    holen oder mit
    [QuestionsStore defaultInstance].questionsCounter++;

    erhöhen.

    Auf jeden Fall würde ich diese Daten in eine Modellklasse auslagern.

    Oder du baust in den aufgerufenen Controller ein delegate mit protocol ein um Daten von "unten nach oben" zurückzugeben.
  • Er hat Singleton geschrieben... :-O
    Sicher, dass dein Singleton ein Singleton a.k.a. threadsafe ist? ;)

    Prinzipiell eine sehr gute Idee, halte ich persönlich allerdings noch ein wenig zu Highlevel für Piper.
    «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
  • Lucas de Vil schrieb:

    Er hat Singleton geschrieben... :-O
    Sicher, dass dein Singleton ein Singleton a.k.a. threadsafe ist? ;)

    Prinzipiell eine sehr gute Idee, halte ich persönlich allerdings noch ein wenig zu Highlevel für Piper.
    Singletons sind ok wenn man weiss wie man synchronized ;) Singlethreaded wäre auch zu langweilig vor allem auf single core devices :D

    In vielen Fällen will und braucht man es einfach so! :D Ansonsten sind Core Data und multiple contexts meine Freunde :D und dann happy contextmerging :)
  • Piper schrieb:

    hier mein der present code

    Quellcode

    1. LCRightAnswerViewController *rightAnswerView =
    2. [self.storyboard instantiateViewControllerWithIdentifier:@"LCRightAnswerViewController"];
    3. [self presentViewController:rightAnswerView animated:YES completion:nil];

    Was wird denn ausgegeben, wenn Du mal in der Methode, wo dieser Code steht folgendes machst:

    Quellcode

    1. NSLog(@"Class = %@", NSStringFromClass(self.class));

    Michael