简单的拖放应用程序无法正常工作

时间:2010-07-14 11:25:15

标签: cocoa drag-and-drop nsview nsbox

我正在尝试一个简单的拖放应用程序:

  1. 我正在运行时创建一个CameraIconView(NSView的子类,包含一些图像视图,文本字段和一个弹出按钮)。
  2. 此视图包含在CameraIconEnclosingBox(NSBox的子类)
  3. 要求是:用户应该能够在CameraIconEnclosingBox中的其他位置拖动Ca​​meraIconView。
  4. 为了实现我的要求,我这样做:

    1. 在CameraIconView类中实现以下方法 -
    2. - (void)mouseDown:(NSEvent *)e {

          NSPoint location; 
          NSSize size;
          NSPasteboard *pb = [NSPasteboard pasteboardWithName:@"CameraIconContainer"];
      
          location.x =  ([self bounds].size.width - size.width)/2;
          location.y =  ([self bounds].size.height - size.height)/2;
      
          NSData *data = [NSKeyedArchiver archivedDataWithRootObject:self];
          [pb declareTypes:[NSArray arrayWithObject:IconDragDataType] owner:self];
          [pb setData:data forType:IconDragDataType];
          [self dragImage:[NSImage imageNamed:@"camera_icon.png"] at:location offset:NSZeroSize event:e pasteboard:pb source:self slideBack:NO];
      }
      

      2。在CameraIconEnclosingBox类中实现了以下方法 -

      - (void)awakeFromNib{
          [self registerForDraggedTypes:[NSArray arrayWithObject:IconDragDataType]];
      }
      - (NSDragOperation)draggingEntered:(id < NSDraggingInfo >)sender{
          return NSDragOperationEvery;
      }
      - (BOOL)performDragOperation:(id < NSDraggingInfo >)sender{
          return YES;
      }
      - (void)concludeDragOperation:(id < NSDraggingInfo >)sender{
          NSPoint dropLocation = [sender draggingLocation];
      
          float x = dropLocation.x;
          float y = dropLocation.y;
          NSLog(@"dragOperationConcluded! draggingLocation: (%f, %f)",x,y);
      
          NSPasteboard *pb = [sender draggingPasteboard];
          NSLog(@"Pasteboard name- %@",[pb name]);
          NSData *draggedData = [pb dataForType:IconDragDataType];
      
          CameraIconView *object = [NSKeyedUnarchiver unarchiveObjectWithData:draggedData];
          NSLog(@"object - %@ / cameraNo : %@/ operatorName : %@",object,[[object cameraNo] stringValue],[[object operatorName] stringValue]);
          // the cameraNo and operatorName are properties defined within CameraIconView class
          // the above log is returning (null) for both properties
      
          float width  = [object frame].size.width;
          float height = [object frame].size.height;
      
          NSLog(@"width - %f / height - %f",width,height);
          [object setFrame:NSMakeRect(x, y, width, height)];
      }
      

      在实现这些方法之后,我能够执行拖动但是drop操作不起作用,尽管调用了CameraIconEnclosingBox中的所有拖动委托方法。

      任何人都可以建议我可能出错的地方或其他更好的方式来实现我的要求吗?

      谢谢,

      Miraaj

1 个答案:

答案 0 :(得分:0)

我可以通过添加以下代码来解决它:

[self addSubview:object];
在此代码之前

[object setFrame:NSMakeRect(x, y, width, height)];

所以CameraIconView现在出现在丢弃的位置。 :)

......但现在我正面临一个新问题 -

  

每次CameraIconView都是   拖拽,它不是   定位拖动的CameraIconView   到新的位置,但正在创建和   在其中显示一个新实例   CameraIconEnclosingBox位于新位置,即。为了   首先拖放两个图标开始   出现在同一个CameraIconView中   ......第二次拖放三次   图标开始出现等等....

有人可以建议我解决一些问题吗?

谢谢,

Miraaj