1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Drag'n'Drop in Textfeld vom Finder

Dieses Thema im Forum "OS X-Developer" wurde erstellt von Zettt, 21.06.09.

  1. Zettt

    Zettt Doppelter Melonenapfel

    Dabei seit:
    16.10.05
    Beiträge:
    3.374
    Hallo,

    Ich beteilige mich grade an einem (kleinen) Open Source Projekt, dass als GUI für ffmpeg herhalten soll.
    Die ersten Bugfixes konnte ich auch schon mit einsenden. Auch die ersten Zusatzfeatures habe ich bereits commitet.

    Jetzt habe ich mir zur Aufgabe gemacht unsere Textfelder zu verbessern. Das ist auch ein Bug/Request im Tracker.
    Die Textfelder sollen einen Drag'n'Drop vom Finder aus verkraften. Im Textfeld soll dann der Filepath stehen und natuerlich sollen nur erlaubte Formate ueberhaupt gedraggt werden koennen.

    Mein Kollege meinte dazu muesse man erstmal eine Subclass von NSTextField anlegen und dann die Methoden:

    Code:
    - (BOOL)performDragOperation:(id <NSDraggingInfo>)sender 
    - (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender 
    - (void) registerDragDestination 
    implementieren. Doch wo trag ich da jetzt ein, dass da nur ein ".mov" rein darf? In den Examples von Apple finde ich nur Beispiele die am Anfang der .m Datei ein #define blablablaPboardType @"irgendwas" machen.
    Aber das, so hab ich das Gefuehl, bringt mich nicht so ganz an mein Ziel.

    Danke
     
  2. MacApple

    MacApple Lord Grosvenor

    Dabei seit:
    05.01.04
    Beiträge:
    3.470
    In draggingEntered:. Da prüfst Du einfach, ob das was Dir angeboten wird akzeptabel ist und gibst die entsprechende Dragging operation zurück (NSDragOperationNone für nicht akzeptabel).

    MacApple
     
  3. Zettt

    Zettt Doppelter Melonenapfel

    Dabei seit:
    16.10.05
    Beiträge:
    3.374
    Achso verstehe und wie sage ich, dass das nur movs, divx, avi, mkv, mp4, m4v Files sein duerfen?
    Das war das zweite Ding was sich meiner Erkenntnis bisher entzogen hat.

    Danke fuer deine Antwort da hab ich noch ein bisschen was interessantes in der Doku gefunden.
     
  4. Westbär

    Westbär Weißer Winterglockenapfel

    Dabei seit:
    06.04.07
    Beiträge:
    882
    Du musst die Dateien aus dem Pasteboard lesen, das geht z.B so

    Code:
    NSPasteboard *pb = [sender draggingPasteboard]; 
    NSArray *files = [pb propertyListForType:NSFilenamesPboardType];
    
    Danach einfach durchs Array gehen und mit NSString's isSuffix (kann auch was anderes sein, bin mir grad nicht sicher) die file extension prüfen. Wenns dann keine .mov ist, hauste ein NSDragOperationNone zurück.
     
  5. Zettt

    Zettt Doppelter Melonenapfel

    Dabei seit:
    16.10.05
    Beiträge:
    3.374
    Perfekt! Das sollte klappen! Ich danke dir.
     
  6. Zettt

    Zettt Doppelter Melonenapfel

    Dabei seit:
    16.10.05
    Beiträge:
    3.374
    Bitte ignorieren funktioniert jetzt erstmal Hatte vergessen das hier aufzurfen:

    Code:
    [self registerForDraggedTypes:[NSArray arrayWithObjects:NSFilenamesPboardType,NSURLPboardType, nil]];
    Das steht jetzt in awakeFromNib. Ist das da gut aufgehoben oder soll das lieber nach init?

    -----------------------------------------------


    Also funktioniert, soweit - glaub ich. Nur jetzt bekomme ich "control reaches end of non-void function".
    Wenn ich die if's weglasse dann funktionierts auch. Aber soweit tuts erstmal nicht. :(

    [​IMG]

    EDIT:

    Zwecks Copy&Paste vielleicht noch schoener so:

    Code:
    - (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender 
    {
    	NSPasteboard *pb = [sender draggingPasteboard]; 
    	NSArray *files = [pb propertyListForType:NSFilenamesPboardType];
    	
    	NSBeep();
    	
    	for(NSString * string in files)
    	{
    		if ([string hasSuffix:@"mov"]) {
    			NSLog(@".mov detected");
    			return NSDragOperationGeneric;
    		} else {
    			NSBeep();
    			return NSDragOperationNone;
    		}
    	}
    	return NSDragOperationGeneric;
    }
     
    #6 Zettt, 24.06.09
    Zuletzt bearbeitet: 24.06.09
  7. MacApple

    MacApple Lord Grosvenor

    Dabei seit:
    05.01.04
    Beiträge:
    3.470
    Kurze Frage: welche Schriftart verwendest Du da?

    MacApple
     
  8. Zettt

    Zettt Doppelter Melonenapfel

    Dabei seit:
    16.10.05
    Beiträge:
    3.374
    Die ist schick ne? :p
    Hab ich irgendwo mal gefunden. Das ist die Anonymous. Anonymous Pro sieht auch gut aus.
     
  9. Amin Negm-Awad

    Amin Negm-Awad Süsser Pfaffenapfel

    Dabei seit:
    01.03.07
    Beiträge:
    665
    Die Fehlermeldung ist richtig und zudem hast du noch eine Merkwürdigkeit:

    1. Die Fehlermeldung bedeutet, dass es möglich ist, die Methode zu verlassen, ohne dass es einen Returnwert gibt. Dies geht auch, nämlich dann, wenn der Schleifenkörper von for nie ausgeführt wird, namentlich, weil files leer oder nil ist.

    2. Aber das Geanze ist achseltsam. Sobald du ein erstes Element in Files hast, wird immer einer der Zweige des If ausgeführt. Jeder enthält ein Return. Daher wird die Methode – wenn mindestens ein Element vorhanden ist – stets bereits im ersten Schleifendurchgang verlassen.
     
  10. Zettt

    Zettt Doppelter Melonenapfel

    Dabei seit:
    16.10.05
    Beiträge:
    3.374
    Amin, du hast meinen, eigentlich, Xcode-freien Tag auf dem Gewissen. Ich offe inständig, du bist zufrieden.
    Danke für die Ergänzung hab den Fall das der String auch leer sein kann noch ergänzt.
     

Diese Seite empfehlen