2012-04-25 15 views
10

gelen sürükle ve bırak. Kur, bir Çekirdek Veri deposuna Kakao bağlamaları kullanarak veri kaynağı olarak işlev gören bir dizi denetleyicisi olan bir NSTableView kullanır.NSTableView ve ben sürükle uygulamak ve benim app bir NSTableView içine Finder düşecek çalışıyorum Finder

Ben temelde ben SO ve diğer siteler üzerinde bulunan çeşitli blog yayınlarında aşağıdaki aşağıdaki yaptı: benim görünümü denetleyicisi awakeFromNib yılında

ararım:

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

Ben NSArrayController sınıflandırma ve aşağıdaki ilave alt sınıfıma yönelik yöntemler (alt sınıflandırma için mantık, tablo denetleyicisinin veri kaynağı gibi davranması nedeniyle dizi denetleyicisinin damladan haberdar olması gerektiğidir):

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

Yukarıdakiler için uygulamam şu anda yalnızca günlüğe yazar ve sonra bir boolean YES döndürür.

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

IB ben benim özel NSArrayController alt sınıfa işaret dizi denetleyicisi var.

Sonuç: hiçbir şey. Masaüstümden bir PNG'yi masaüstüme sürüklediğimde hiçbir şey olmuyor ve dosya mutlu bir şekilde kaynağına geri dönüyor. Yanlış bir şey yapmalıyım ama ne olduğunu anlamıyorum. Nerede yanlış gidiyorum?

cevap

17

Finder gelen bir sürükle daima dosya sürükleme değil, bir resim sürükleme olduğunu. URL'lerin Finder'dan sürüklenmesini desteklemeniz gerekir.

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

Öyle gibi dosyaları doğrulayabilir: Daha sonra tekrar URL'yi ayıklamak gerekir

- (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; 
} 

Bunu yapmak için, size tür URL'ler istediğiniz beyan gerekir tableView:acceptDrop:row:dropOperation: yöntemi çağrıldığında, URL'den bir resim oluşturun ve ardından bu görüntüyle bir şeyler yapın.

Kakao bağlamaları kullanmanıza rağmen, sürükleme yöntemlerini kullanmak istiyorsanız, NSTableView numaranızın datasource bir nesnesini atamanız ve uygulamanız gerekir. veri kaynağı yöntemleri NSTableView uygulanmadı çünkü NSTableView sınıflara yaramaz.

Yalnızca veri kaynağı nesnesinde sürükleme ilgili yöntemler, değil bunu yapmak için bağları kullanarak konum olarak tablo veri sağlamak olanları uygulamak gerekir. Dizin sonucunun dizi denetleyicisine, yöntemlerinden birini insertObject:atArrangedObjectIndex: gibi yöntemlerden birini arayarak veya Anahtar-Değer Kodlaması uyumlu erişim yöntemleri kullanarak destek dizisini değiştirerek bildirmeniz sizin sorumluluğunuzdur.

+0

teşekkürler ama tablo görünümü hala herhangi sürükle kabul etmez/düşer. Finder'dan sürüklediğim herhangi bir dosya geri döner. Tabloyu veri kaynağına eklemek için Cocoa bağlamaları kullanıyorum. – Roger

+0

Cevabımı güncelledim. Bir veri kaynağı nesnesini hala uygulamanız gerekiyor. –

İlgili konular