我想禁止将任何内容放入我的NSTextField中。在我的应用程序中,用户可以将iCal事件拖放到GUI的不同部分。现在我有一个测试用户不小心将iCal事件放入了文本字段 - 但他没有意识到这一点,因为文本被插入到我在单行文本字段中看到的行上方的行中。
(您可以通过单击文本字段并使用键盘来显示插入的文本一行 - 但普通用户不会这样做,因为他/她甚至不会意识到插入的内容第一名!)
我尝试registerForDraggedTypes:[NSArray array]]
(似乎没有任何效果)以及实现返回draggingEntered:
的{{1}}委托方法(甚至没有调用委托方法)。< / p>
有什么想法吗?
编辑:当然,将内容放到NSTextField上只有在它有焦点时才有效,如his blog中的ssp和comments to a blog entry by Daniel Jalkut中所述。
答案 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?