如何禁用NSTextField的拖放?

时间:2009-02-26 14:13:21

标签: cocoa drag-and-drop nstextfield nsdragginginfo

我想禁止将任何内容放入我的NSTextField中。在我的应用程序中,用户可以将iCal事件拖放到GUI的不同部分。现在我有一个测试用户不小心将iCal事件放入了文本字段 - 但他没有意识到这一点,因为文本被插入到我在单行文本字段中看到的行上方的行中。

(您可以通过单击文本字段并使用键盘来显示插入的文本一行 - 但普通用户不会这样做,因为他/她甚至不会意识到插入的内容第一名!)

我尝试registerForDraggedTypes:[NSArray array]](似乎没有任何效果)以及实现返回draggingEntered:的{​​{1}}委托方法(甚至没有调用委托方法)。< / p>

有什么想法吗?

编辑:当然,将内容放到NSTextField上只有在它有焦点时才有效,如his blog中的ssp和comments to a blog entry by Daniel Jalkut中所述。

4 个答案:

答案 0 :(得分:3)

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

你需要记住,拖动到NSTextField的原因是它有焦点时,NSTextField本身被一个更丰富,更强大的视图(NSTextView)暂时遮挡,这被称为“字段编辑器” 。“

在字段编辑器上查看Apple文档的这一部分:

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

为了实现您所追求的目标,我认为您可能需要通过实现窗口委托方法拦截NSTextFields的字段编辑器的标准规定:

windowWillReturnFieldEditor:toObject:

这使您有机会调整NSTextView上的配置,或提供一个全新的字段编辑器对象。

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

答案 1 :(得分: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

答案 2 :(得分: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];

}

答案 3 :(得分:-1)

您是否尝试过NSView的

- (void)unregisterDraggedTypes