2009-02-26 174 views
1

我想禁止将任何东西放入我的NSTextField中。在我的应用程序中,用户可以将iCal事件拖放到GUI的不同部分。现在我有一个测试用户不小心将iCal事件放入文本字​​段 - 但他没有意识到这一点,因为文本插入到我在单行文本字段中看到的那一行上方的行中。 (您可以通过点击文本字段并使用键盘排列一行来显示插入的文本 - 但普通用户不会这样做,因为他/她甚至不会意识到插入了某些东西)如何禁用NSTextField的拖放操作?

我试过registerForDraggedTypes:[NSArray array]](似乎没有任何影响)以及实现draggingEntered:委托方法返回NSDragOperationNone(委托方法甚至没有被调用)。

任何想法?

编辑:当它集中在his blog并在comments to a blog entry by Daniel Jalkut通过SSP描述当然掉落的东西到一个的NSTextField中,只有工作。

回答

3

这可能会起作用:如果您将NSTextView继承并实现-acceptableDragTypes以返回nil,则文本视图将被禁用为拖动目标。我还必须实现NSDraggingDestination方法-draggingEntered:-draggingUpdated:以返回NSDragOperationNone。

@implementation NoDragTextView 
- (NSArray *)acceptableDragTypes 
{ 
    return nil; 
} 
- (NSDragOperation)draggingEntered:(id<NSDraggingInfo>)sender 
{ 
    return NSDragOperationNone; 
} 
- (NSDragOperation)draggingUpdated:(id<NSDraggingInfo>)sender 
{ 
    return NSDragOperationNone; 
} 
@end 
-1

您是否试过从NSView获得

- (void)unregisterDraggedTypes

+0

我终于来试试这个(我同意文档听起来好像这应该做的工作)。 所以在我的控制器的awakeFromNib中,我在我的NSTextField插座上调用unregisterDraggedTypes。然而这似乎没有任何效果......我仍然可以将东西拖入我的领域。 – 2009-03-04 14:17:29

+0

你是否在调试器中检查了你的插座,以确认它在调用unregisterDraggedTypes时连接了而不是NULL? – Mark 2009-03-04 14:51:37

3

我很高兴你在我的博客文章中发现了评论。我认为他们是发现如何实现你所寻找的东西的冰山一角。

需要注意的是,拖动到NSTextField的原因在它具有焦点时起作用的原因是NSTextField本身被更为丰富,功能更强大的视图(NSTextView)遮挡,该视图被称为“Field编辑。”

退房苹果在球场上的编辑文档的这一部分:

http://developer.apple.com/documentation/Cocoa/Conceptual/TextEditing/Tasks/FieldEditor.html

要实现你追求什么,我想你可能需要拦截的标准计提的字段编辑器的你NSTextFields,通过实施窗口的委托方法:

windowWillReturnFieldEditor:toObject:

这让你有机会要么调整上个配置e NSTextView,或者提供一个全新的字段编辑器对象。

在最坏的情况下,您可以提供您自己的NSTextView子类作为字段编辑器,该编辑器旨在拒绝所有拖动。

2

我能够通过创建自定义NSTextView并实现进入和退出NSDraggingDestination协议方法来设置NSTextView隐藏来解决此问题。一旦文本字段是隐藏在上海华将能够赶上拖/丢弃事件,或者如果上海华不执行或想拖/放他们被丢弃

例如:

- (NSDragOperation)draggingEntered:(id<NSDraggingInfo>)sender { 

    //hide so that the drop event falls through into superview's drag/drop view 
    [self setHidden:YES]; 

    return NSDragOperationNone; 
} 

- (void)draggingExited:(id<NSDraggingInfo>)sender { 

    //show our field editor again since dragging is all over with 
    [self setHidden:NO]; 

}