воскресенье, 7 ноября 2010 г.

Drag and Drop on a Mac

Отработка драга&дропа в маке банальна по своей сути, если известно что делать ).

Рассмотрим случай когда досточно простого переноса/добавление файлов, папки, диска в программу. Бонусом идет, что если мы переносим эти объекты на пиктограмму не запущенной еще программы, то используется тот же механизм (к примеру есть известная программа iPhoto, в нее можно закидывать фотки как папками, кучей файлов, отдельным файлом, так и переносм на пиктограмму).

Первое что нам понадобится, это подправить немного info.plist 

Information Property List -> добавляем Document types
В Document types -> Item -> Document OS Types
В Document OS Types ->
Item 0 = ****
Item 1 = fold (для папок и файлов)
Item 2 = disk (для дисков)
Можно выставить Role = Viewer.

Теперь добавим немного кода в класс-делегат (обычно это основной Controller к которому привязан View).

  1. - (NSDragOperation)draggingEntered:(id )sender   
  2. {   
  3.     // в зависимости от типа операции перенос, добавление etc.   
  4.     // будет у нас при драге на объекте значок   
  5.     return NSDragOperationLink;   
  6. }   
  7.    
  8. - (BOOL)prepareForDragOperation:(id )sender   
  9. {   
  10.     return YES;   
  11. }   
  12.    
  13. - (BOOL)performDragOperation:(id )sender   
  14. {   
  15.     NSPasteboard *pboard;   
  16.     NSDragOperation sourceDragMask;   
  17.           
  18.     sourceDragMask = [sender draggingSourceOperationMask];   
  19.     pboard = [sender draggingPasteboard];   
  20.           
  21.     if ([[pboard types] containsObject:NSFilenamesPboardType])   
  22.     {   
  23.         NSArray *files = [pboard propertyListForType:NSFilenamesPboardType];   
  24.           
  25.         // ... отрабатываем данные      
  26.           
  27.     }   
  28.           
  29.     return YES;   
  30. }