Methoden in Methoden aufrufen klappt nicht

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

  • Methoden in Methoden aufrufen klappt nicht

    Hallo in die Runde,

    ich lerne seit einiger Zeit die Programmiersprache Swift. Nebenher probiere ich mich auch etwas in Objective-C. Hier stoße ich gerade auf das Problem, dass ich eine Methode die ein NSAlert Fenster öffnen soll nicht in anderen Methoden aufrufen kann. Ich kriege es einfach nicht hin. Ich hab wahrscheinlich ein Denkfehler.

    es geht im Code um die Methode "- (void)myDialog" und ich möchte sie gerne in der Action "openImage" nach einer if Abfrage nutzen. In Swift verwende ich einfach den Methodennamen und übergebe dann die entsprechenden Parameter.

    #import "ViewController.h"

    @implementation ViewController

    - (void)viewDidLoad {
    [super viewDidLoad];

    // Do any additional setup after loading the view.
    }


    - (void)setRepresentedObject:(id)representedObject {
    [super setRepresentedObject:representedObject];

    // Update the view, if already loaded.
    }

    - (void)myDialog:(NSString *)messageText :(NSString *)infoText {
    NSAlert *meinDialog = [[NSAlert alloc] init];
    [meinDialog setMessageText: messageText];
    [meinDialog setInformativeText: infoText];
    [meinDialog addButtonWithTitle:@"OK"];
    [meinDialog runModal];
    }

    - (IBAction)chooseImageButton:(id)sender {
    NSOpenPanel *meinDialog = [NSOpenPanel openPanel];
    [meinDialog setTitle:@"Öffnen"];
    [meinDialog setPrompt:@"Öffnen"];
    [meinDialog setAllowedFileTypes:NSImage.imageTypes];
    if ([meinDialog runModal] == NSModalResponseOK) {
    NSURL *datenURL = [meinDialog URL];
    NSString *urlString = datenURL.path;
    NSImage *meinBild = [[NSImage alloc] initWithContentsOfFile: [[meinDialog URL]path]];
    if (meinBild != nil) {
    _bildName.stringValue = urlString;
    [_bildAnzeige setImage:meinBild];
    }
    }
    }


    - (IBAction)openImage:(id)sender {
    //if (_bildName.stringValue == 0) {

    // Hier soll die Methode aufgerufen werden, anstatt das Alert-Fenster hier manuell zu Programmmieren.

    NSAlert *meinDialog = [[NSAlert alloc] init];
    [meinDialog setMessageText: @"Achtung"];
    [meinDialog setInformativeText: @"Bitte geben Sie erst einen Dateipfad an, oder wählen Sie eine Datei über den Button \"Auswählen\""];
    [meinDialog addButtonWithTitle:@"OK"];
    [meinDialog runModal];
    }

    - (IBAction)beendenClicked:(id)sender {
    [[NSApplication sharedApplication] terminate: self];
    }

    @end



    Vielen Dank für eure Hilfe :D
  • In Swift ist self vielfach obsolet.

    Ich bin noch nicht wirklich fit in Swift, aber der komplette Aufruf einer Funktion/Methode, innerhalb der Klasse, in Swift wäre eigentlich self.myDialog(). Da man sich das self hier aber auch sparen kann, verwenden alle nur noch myDialog().

    In Objective-C ist das Target bzw. das Objekt bei dem eine Methode aufgerufen werden soll immer erforderlich. Die Syntax zum Aufruf einer Methode lautet daher immer [{Target/Object} {Methode)].

    Beim Aufruf einer Methode in der selben Klasse bzw. beim eigenen Objekt kommt self zum Einsatz. Die Syntax lautet also einfach [self myDialog]. ;)

    Wenn man sich in diesem Fall das self sparen könnte/würde, dann wäre die Syntax [myDialog], was schon sehr seltsam aussehen würde.

    Ich sehe gerade, dass Deine Methode auch Parameter hat. Der komplette Aufruf mit Parametern wäre also [self myDialog:@"messageText" :@"infoText"].

    Ein kleiner Tipp zum Aufbau von Methodennamen in Objective-C. Alle Parameter bitte mit Namen versehen und den kompletten Methodennamen, also Name + Parameter, wie einen Satz formulieren. Ein, in meinen Augen, guter Methodenname für diese Methode wäre z.B.

    - (void)showAlertWithMessage:(NSString *)messageText info:(NSString *)infoText;

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

  • Nun hätte ich eine weitere Frage. Über folgende Funktion kann ich über das Panel ein Bild laden und anzeigen lassen. Der Dateipfad wird mir
    außerdem noch in einem NSTextField angezeigt.
    Nun möchte ich aber über einen weiteren Button "öffnen" ein Bild anzeigen lassen, bei dem der User den Pfad selbst in dem NSTextField eingibt. Wie muss ich vorgehen? Mein Versuch steht unter dem ersten Code.

    Bild Auswahl - Methode

    - (IBAction)chooseImageButton:(id)sender {
    NSOpenPanel *meinDialog = [NSOpenPanel openPanel];
    [meinDialog setTitle:@"Öffnen"];
    [meinDialog setPrompt:@"Öffnen"];
    [meinDialog setAllowedFileTypes:NSImage.imageTypes];
    if ([meinDialog runModal] == NSModalResponseOK) {
    NSURL *datenURL = [meinDialog URL];
    NSString *urlString = datenURL.path;
    NSImage *meinBild = [[NSImage alloc] initWithContentsOfFile: [[meinDialog URL]path]];
    if (meinBild != nil) {
    _bildName.stringValue = urlString;
    [_bildAnzeige setImage:meinBild];
    }
    }
    }

    Öffnen Methode
    - (IBAction)openImage:(id)sender {
    NSString *urlString = _bildName.stringValue;
    NSLog(urlString);
    NSURL *userUrl = [NSURL URLWithString:urlString];
    NSImage *meinBild = [[NSImage alloc] initWithContentsOfURL:userUrl];
    [_bildAnzeige setImage:meinBild];
    }
  • Ich habe es jetzt so geschrieben:

    - (IBAction)openImage:(id)sender {
    NSImage *meinBild = [[NSImage alloc] initWithContentsOfFile:[_bildName stringValue]];
    [_bildAnzeige setImage:meinBild];
    }

    Läuft immer noch nicht so richtig.
    Wenn ich aber vorher ein Bild über das Panel lade (Methode chooseImageButton).... dann klappt es zumindest das ich über die Eingabe des NSTextField das gleiche Bild laden kann wie über das Panel. Eine Kleinigkeit fehlt mir also noch.
  • ich lass mir den Pfad ja über die Methode "chooseImageButton" ausgeben. daran dürfte es nicht scheitern. Den habe ich kopiert und versuche über die "öffnen" Taste ein weiteres Bild zu laden, das klappt dann nicht. das geladene Bild verschwindet und es bleibt leer. Rufe ich dann wieder das erste Bild über den "öffnen" Button aus, klappt es.