2011-12-19 7 views
8

Ho una semplice applicazione che gestisce le informazioni di marketing. Quello che ho fatto è stato quello di chiamareAccettare file trascinati su un'applicazione Cocoa

NSInteger result = [openPanel runModalForDirectory:nil file:nil types:fileTypes]; 

Quando l'utente fa clic sul menu File->Open. Ora mi è stato chiesto di aggiungere funzionalità drag and drop all'app in modo che l'utente possa trascinarne un file anziché dover andare al menu o premere il comando + o per aprire un file.

Prima di dirmi di leggi la documentazione Ho già verificato il numero di Apple Intro to drag and drop e altri documenti. Ancora non riesco a capire cosa fare.

Sono un vecchio programmatore Unix C che è necessario copiare con questo e alcune delle ipotesi contenute nel documento Apple non hanno senso per me.

Insomma, quello che ho bisogno di aggiungere al mio app per:

  1. Abilita trascinare e rilasciare
  2. maniglia che si è trascinato file di

Come nota, devo gestire un solo file alla volta.

Grazie per l'aiuto

risposta

15

Beh, è ​​necessario implementare il protocollo NSDraggingDestination, che presumo che hai letto già. Puoi implementarlo in una vista specifica o nell'intera finestra: sembra che tu stia accettando il trascinamento dei file a livello di applicazione, quindi probabilmente vorrai che l'intera finestra accetti il ​​trascinamento. Indipendentemente da ciò, una volta che lo fai funzionare, vedrai come personalizzarlo ulteriormente.

Sottoclasse NSWindow. Il primo passo consiste nello specificare quali tipi di trascina siete interessati a

Informi il finestra personalizzata che è interessato a nomi di file:.

- (void)awakeFromNib { 
    [self registerForDraggedTypes:[NSArray arrayWithObject:NSFilenamesPboardType]]; 
} 

di Tell OS X che tipo di cursore su schermo:

- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender { 
    return NSDragOperationCopy; 
} 

- (NSDragOperation)draggingUpdated:(id<NSDraggingInfo>)sender { 
    return NSDragOperationCopy; 
} 

fare il trascinamento:

- (BOOL)performDragOperation:(id<NSDraggingInfo>)sender { 
    NSPasteboard *pboard = [sender draggingPasteboard]; 
    NSArray *filenames = [pboard propertyListForType:NSFilenamesPboardType]; 

    if (1 == filenames.count) 
     if ([[NSApp delegate] respondsToSelector:@selector(application:openFile:)]) 
      return [[NSApp delegate] application:NSApp openFile:[filenames lastObject]]; 

    return NO; 
} 

Questo è il minimo indispensabile per farlo funzionare.

+0

Ok, grazie per le informazioni. Quando inserisco '[self registerForDraggedTypes: [NSArray arrayWithObject: NSFilenamesPboardType]];' a 'awakeFromNib' ottengo un'eccezione e: *** Terminando l'app a causa dell'eccezione non rilevata 'NSInvalidArgumentException', motivo: '- [MyAppAppDelegate registerForDraggedTypes:] : selettore non riconosciuto inviato all'istanza 0x100141330 ' –

+0

Oh, anche aggiungendo '[self registerForDraggedTypes: [NSArray arrayWithObject: NSFilenamesPboardType]];' mi avvisa: Metodo -registerForDraggedTypes non trovato –

+0

È necessario chiamare tale metodo sulla finestra o visualizzare quello accettando trascinamenti. Preferisco chiamarlo dalla finestra stessa, in 'awakeFromNib' nella sottoclasse NSWindow. –

Problemi correlati