我要回答我的问题,因为我花了不少时间今天试图弄清楚这一点,很多人用这个程序斗争,主要是因为我觉得不好我不断地问堆栈社区所有这些集合视图问题所有周:
我发现的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上的教程进行操作,集合视图编程指南“中,它引导您完成设置集合视图的过程,但它使用绑定。
所以,现在的关键是要建立一个文本框的子类 //MyNSTextField.h #进口 @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拖动设置的代表,或者如果你正在从中拖出我其他来源,确保你有适当的拖动源代表设置,它应该工作。