Ungewöhnliches Problem

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

  • Ungewöhnliches Problem

    Hallo,

    ich wollte eigentlich ein kleines Experiementier-Projekt starten, in dem ich einige Sachen ausprobieren. Es enthält jetzt ein Fenster mit einem Button und einem Label, und einer Klasse mit einer Methode mit einer Zeile Code. Der Compiler lässt es durch - nur geht die Aktion nicht. Findet irgendwer den Fehler? Ich verzweifle hier noch...

    Danke im Vorraus!


    Header:


    Quellcode

    1. #import
    2. @interface Bla : NSObject {
    3. IBOutlet NSTextField * label;
    4. }
    5. -(IBAction)setLabel:(id)sender;
    6. @end
    Alles anzeigen


    Implementation:

    Quellcode

    1. #import "Bla.h"
    2. @implementation Bla
    3. -(IBAction)setLabel:(id)sender
    4. {
    5. [label setStringValue:@"Hello"];
    6. }
    7. @end
    Alles anzeigen
  • Dein Outlet ist nicht verbunden, weil die Methode und der Setter die selbe Signatur haben.
    Die Methode soll anders benannt werden.

    Schau mal genau die beiden Methoden

    Quellcode

    1. -(IBAction)setLabel:(id)sender; -(void)setLabel:(NSTextField*)field;



    IBAction = void
    It is time to redesign the way we design things.
  • Wie kommst Du darauf? Die Outlets werden über Key-Value-Coding gesetzt. In diesem Fall wird da die Methode über den Selector setLabel: aufgerufen. Im Gegensatz zu vielen anderen objekt-orientierten Sprachen kann Objective-C gleichnamige Methoden nicht an Parametertypen unterscheiden. Diese zwei Methoden in einer Implementierung führen zu einem Kompilierfehler.

    Die Methode -(void)setLabel: (NSTextField*)field; taucht auch in den Beiträgen von wareox überhaupt nicht auf.
    „Meine Komplikation hatte eine Komplikation.“
  • macmoonshine schrieb:

    Die Outlets werden über Key-Value-Coding gesetzt.
    Auch das ist SO nicht richtig. Wenn die Klasse mit einem NSCoder instanziert (sprich, aus einem Nib geladen) wird und die attribute den prefix IBOutlet haben, werden sie DIREKT, sprich ohne Umwege über irgendwelche methoden gesetzt. Die alternative Methode (weiß gar net, ob die auf auf dem Mac geht, habs bisher nur beim iPhone gesehen), ist einen property zu deklarieren, die dann gesetzt wird. Das passiert über accessor methoden, wo es dann hier tatsächlich einen konflikt geben würde. Wir diese property mit @synthesize automatisch mit getter und setter versort, so wird die zweite methode dem kompiler zumindest eine warnung über nicht passende typen abringen, mehr aber nicht.
  • M.A.X schrieb:

    macmoonshine schrieb:

    Die Outlets werden über Key-Value-Coding gesetzt.
    Auch das ist SO nicht richtig. Wenn die Klasse mit einem NSCoder instanziert (sprich, aus einem Nib geladen) wird und die attribute den prefix IBOutlet haben, werden sie DIREKT, sprich ohne Umwege über irgendwelche methoden gesetzt.

    Oh, da habe ich wohl von iPhone OS auf MacOS X geschlossen (developer.apple.com/iphone/lib…oc/uid/10000051i-CH4-SW19).

    M.A.X schrieb:

    Die alternative Methode (weiß gar net, ob die auf auf dem Mac geht, habs bisher nur beim iPhone gesehen), ist einen property zu deklarieren, die dann gesetzt wird. Das passiert über accessor methoden, wo es dann hier tatsächlich einen konflikt geben würde. Wir diese property mit @synthesize automatisch mit getter und setter versort, so wird die zweite methode dem kompiler zumindest eine warnung über nicht passende typen abringen, mehr aber nicht.

    Richtig, aber abgesehen davon, dass wareox weder den Setter noch eine entsprechende Methode erwähnt, würde das Outlet trotzdem verbunden werden. Der Fehler würde sich erst zur Laufzeit bemerkbar machen, wenn beispielsweise eine nicht vorhandene Methode aufgerufen wird.
    „Meine Komplikation hatte eine Komplikation.“