2009-02-26 110 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]; 

}