2012-04-25 15 views
10

Próbuję zaimplementować przeciąganie i upuszczanie z Findera na NSTableView mojej aplikacji. Konfiguracja wykorzystuje NSTableView, kontroler tablicowy, który działa jako źródło danych przy użyciu wiązań Cocoa do magazynu danych podstawowych.NSTableView i przeciągnij i upuść z Findera

zrobiłem następujący, w zasadzie po różnych blogach znalazłem na SO i inne strony:

W awakeFromNib mojego widoku kontrolera wzywam:

[[self sourcesTableView] registerForDraggedTypes:[NSArray arrayWithObjects: NSPasteboardTypePNG, nil]]; 

I podklasy NSArrayController i dodaje się następujący metody do mojej podklasy (rozumowanie dla podklasy polega na tym, że kontroler tablic musi zostać poinformowany o upuszczeniu, ponieważ działa jako źródło danych widoku tabeli):

- (BOOL) tableView: (NSTableView *) aTableView acceptDrop: (id <NSDraggingInfo>) info row: (NSInteger) row dropOperation: (NSTableViewDropOperation)operation 

Moja implementacja powyższego wpisuje się tylko do dziennika, a następnie zwraca wartość boolean YES.

- (NSDragOperation) tableView: (NSTableView *) aTableView validateDrop: (id <NSDraggingInfo>) info proposedRow: (NSInteger) row proposedDropOperation: (NSTableViewDropOperation) operation 

W IB Mam kontroler macierzy skierowaną do mojego niestandardowego NSArrayController podklasy.

Wynik: nic. Kiedy przeciągam plik PNG z pulpitu do mojego widoku tabeli, nic się nie dzieje, a plik szczęśliwie odskakuje z powrotem do swojego źródła. Muszę robić coś złego, ale nie rozumiem co. Gdzie się mylę?

Odpowiedz

17

przeciąganie z Findera jest zawsze przeciągnąć plik, a nie przeciąganie obrazu. Musisz obsługiwać przeciąganie adresów URL z Findera.

Aby to zrobić, trzeba zadeklarować, że chcesz rodzajów URL:

[[self sourcesTableView] registerForDraggedTypes:[NSArray arrayWithObject:(NSString*)kUTTypeFileURL]]; 

Można sprawdzić poprawność plików tak:

- (NSDragOperation)tableView:(NSTableView *)aTableView validateDrop:(id <NSDraggingInfo>)info proposedRow:(NSInteger)row proposedDropOperation:(NSTableViewDropOperation)operation 
{ 
    //get the file URLs from the pasteboard 
    NSPasteboard* pb = info.draggingPasteboard; 

    //list the file type UTIs we want to accept 
    NSArray* acceptedTypes = [NSArray arrayWithObject:(NSString*)kUTTypeImage]; 

    NSArray* urls = [pb readObjectsForClasses:[NSArray arrayWithObject:[NSURL class]] 
    options:[NSDictionary dictionaryWithObjectsAndKeys: 
       [NSNumber numberWithBool:YES],NSPasteboardURLReadingFileURLsOnlyKey, 
       acceptedTypes, NSPasteboardURLReadingContentsConformToTypesKey, 
       nil]]; 

    //only allow drag if there is exactly one file 
    if(urls.count != 1) 
     return NSDragOperationNone; 

    return NSDragOperationCopy; 
} 

Będziesz wtedy trzeba ponownie wyodrębnić URL po wywołaniu metody tableView:acceptDrop:row:dropOperation: utwórz obraz z adresu URL, a następnie zrób coś z tym obrazem.

Nawet jeśli używasz wiązania kakao, trzeba jeszcze, aby przypisać i wdrożenie obiekt jako datasource swojej NSTableView jeśli chcesz korzystać z metody przeciągania. Podklasy NSTableView nic nie pomogą, ponieważ metody źródeł danych nie są zaimplementowane w NSTableView.

Wystarczy wdrożyć metody związane przeciągając w swoim obiektu źródła danych, a nie te, które dostarczają danych tabeli jako używasz wiązania tego robić. Obowiązkiem użytkownika jest powiadomienie kontrolera tablicowego o wyniku upuszczenia, przez wywołanie jednej z metod NSArrayController, takich jak insertObject:atArrangedObjectIndex: lub przez zmodyfikowanie tablicy bazowej za pomocą metod dostępowych zgodnych z kodami Key-Value.

+0

Dzięki, ale widok tabeli nadal nie akceptuje przeciągania/upuszczania. Każdy plik, który przeciągam z Findera odbija się ... Używam wiązań Cocoa do dołączenia tabeli do jej źródła danych. – Roger

+0

Zaktualizowałem swoją odpowiedź. Nadal musisz zaimplementować obiekt źródła danych. –