我将回答我自己的问题,因为我今天花了很多时间试图弄清楚这一点,很多人都在为这个过程而苦苦挣扎,主要是因为我感觉很糟糕,我整个星期都在向 Stack 社区询问所有这些集合视图问题:
我发现 NSTextField 的默认行为实际上允许放置,如果它是焦点。问题是我需要适当的 NSTextField 来自动关注鼠标进入的事件。事实证明,我什至不需要 NSCollectionView 拖放委托。我需要 NSTableView 拖动代表,我需要继承 NSTextField 并在其中实现鼠标事件(放置)代表。
所以我的原始 collectionViewItem 类看起来像这样:
//someClass.h
@interface SomeClass : NSObject{
IBOutlet NSTextField *field1_;
IBOutlet NSTextField *field2_;
IBOutlet NSTextField *field3_;
IBOutlet NSButton *chkBox1_;
IBOutlet NSButton *chkBox2_;
}
@porperty(readwrite, copy) NSTextField *filed1_;
为所有 5 个出口制作属性以用于绑定目的。如果您按照 Mac OSX Dev Library 上的教程进行操作;集合视图编程指南,它引导您完成设置集合视图的过程,但它使用绑定。
所以现在关键是设置一个textField子类 //MyNSTextField.h #import @interface MyNSTextField : NSTextField{
//mouse positioning
unsigned long last_;
}
//MyNSTextField.m
#import "MtTextField.h"
@implementation
-(void)dealloc{
[super dealloc];
}
-(void)awakeFromNib{
//register for dragged types
//any other nib stuff
}
//three required mouse events
-(unsigned long)draggingEntered:(id<NSDraggingInfo>)sender{
//this forces the textfield to focus before drop
[self.window makeFirstResponder: self];
NSPasebord *pBoard;
self->last_ = DragOperationNone;
pBoard = [sender draggingPastboard];
return self->last_;
}
-(unsigned long)draggingUpdated:(id<NSDraggingInfo>)sender{
return self->last_;
}
-(void)draggingExited:sender{
if([sender draggingSource] != self){
self->last = NSDragOperationNone;
}
}
}//结束类
现在只需返回原始类并将 textField 出口的名称从 NSTextField 更改为 MyNSTextField 并在集合视图中,选择每个文本字段并在检查器中为其分配新的类名,只要您设置了 tableview 拖动代表向上,或者如果您从其他来源拖动,请确保您设置了适当的拖动源代理,并且它应该可以工作。