Как отключить перетаскивание для NSTextField?

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

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

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

Есть идеи?

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

4 ответа

Решение

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

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

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

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

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

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

windowWillReturnFieldEditor: ToObject:

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

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

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

}

Ты пытался

 - (void)unregisterDraggedTypes 
из NSView?

Другие вопросы по тегам