Как отключить перетаскивание для 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];
}