1

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

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

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

有任何想法吗?

编辑:当然,将某些内容放到 NSTextField 上只有在它具有焦点时才有效,正如 ssp 在他的博客中和Daniel Jalkut 对博客条目的评论中所描述的那样。

4

4 回答 4

4

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

您需要记住,当一个NSTextField作品有焦点时,拖到它的原因是它NSTextField本身暂时被一个更丰富、更强大的视图(an NSTextView)所遮蔽,它被称为“字段编辑器”。

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

https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/TextEditing/Tasks/FieldEditor.html

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

windowWillReturnFieldEditor:toObject:

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

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

于 2009-08-11T12:40:49.867 回答
3

这可能有效:如果您将 NSTextView 子类化并实现-acceptableDragTypesreturn 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
于 2012-07-25T03:54:11.230 回答
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];

}
于 2011-12-10T02:51:05.230 回答
-1

你有没有尝试过

- (void)unregisterDraggedTypes
来自 NSView?

于 2009-02-26T20:07:11.820 回答