Как отключить перетаскивание для NSTextField? - PullRequest
1 голос
/ 26 февраля 2009

Я не хочу бросать что-либо в мой NSTextField. В моем приложении пользователи могут перетаскивать события iCal в другую часть графического интерфейса. Теперь у меня был тестовый пользователь, который случайно уронил событие iCal в текстовое поле - но он этого не понял, потому что текст вставлен в строки выше той, которую я вижу в моем однострочном текстовом поле.

(Вы можете показать вставленный текст, щелкнув в текстовом поле и используя клавиатуру, чтобы перейти на одну строку вверх - но обычный пользователь не сделал бы этого, потому что он / она даже не понял бы, что что-то вставлено в первое место!)

Я попытался registerForDraggedTypes:[NSArray array]] (похоже, не имеет никакого эффекта), а также реализовал метод делегата draggingEntered:, возвращающий NSDragOperationNone (метод делегата даже не вызывается).

Есть идеи?

РЕДАКТИРОВАТЬ: Конечно, перетаскивание чего-либо в NSTextField работает только тогда, когда оно имеет фокус, как описано ssp в его блоге и в комментариях к записи в блоге Даниэль Джалкут .

Ответы [ 4 ]

3 голосов
/ 25 июля 2012

Это может работать: если вы создадите подкласс 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
3 голосов
/ 11 августа 2009

Я рад, что вы обнаружили комментарии в моем блоге. Я думаю, что они - вершина айсберга в поиске того, как достичь того, что вы ищете.

Вы должны иметь в виду, что причина, по которой перетаскивание в NSTextField работает, когда он имеет фокус, заключается в том, что само NSTextField было временно скрыто более богатым, более мощным видом (NSTextView), который называется «Редактор поля . "

Ознакомьтесь с этим разделом документации Apple по полевому редактору:

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

Чтобы достичь того, к чему вы стремитесь, я думаю, вам может потребоваться перехватить стандартное положение редактора полей для ваших NSTextFields, реализовав метод делегата окна:

windowWillReturnFieldEditor: ToObject:

Это дает вам возможность настроить конфигурацию в NSTextView или предоставить совершенно новый объект редактора полей.

В худшем случае вы можете предоставить свой собственный подкласс NSTextView в качестве редактора полей, который был разработан, чтобы отклонять все перетаскивания.

2 голосов
/ 10 декабря 2011

Мне удалось решить эту проблему, создав собственный 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];

}
0 голосов
/ 26 февраля 2009

Вы пробовали

- (void)unregisterDraggedTypes
из NSView?
...