• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

Drag'n'Drop in Textfeld vom Finder

Zettt

Doppelter Melonenapfel
Registriert
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
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
Doch wo trag ich da jetzt ein, dass da nur ein ".mov" rein darf?
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
 

Zettt

Doppelter Melonenapfel
Registriert
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.
 

Westbär

Weißer Winterglockenapfel
Registriert
06.04.07
Beiträge
881
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.
 

Zettt

Doppelter Melonenapfel
Registriert
16.10.05
Beiträge
3.374
Perfekt! Das sollte klappen! Ich danke dir.
 

Zettt

Doppelter Melonenapfel
Registriert
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. :(

Picture%202.png


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;
}
 
Zuletzt bearbeitet:

Amin Negm-Awad

Süsser Pfaffenapfel
Registriert
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.
 

Zettt

Doppelter Melonenapfel
Registriert
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.