2015-10-19 3 views
-1

У меня возникли проблемы с обнаружением двойного щелчка пользователя в swift, я хочу определить, когда они дважды нажимают на NSTextField.Добавление обработчика Click в NSTextField в Swift

func someFunc() { 
    y.target = self 
    y.action = "editLabel:" 
} 

@IBAction func editLabel(obj:AnyObject?) { 
    NSLog("here"); 
} 

Приведенный выше код не работает, я не могу найти основную документацию, показывающую, как добавить обработчики событий. Есть ли более простой способ сделать это?

ответ

0

Текстовое поле не обрабатывает редактирование, как таковое. Когда текстовое поле имеет фокус, текстовое представление добавляется в окно, перекрывая область текстового поля. Это называется «редактор полей», и он отвечает за обработку редактирования.

Кажется, что наиболее вероятное место для изменения поведения двойного щелчка находится в объекте текстового хранения, используемом этим текстовым представлением. NSTextStorage унаследовал от NSMutableAttributedString который наследует от NSAttributedString который имеет - doubleClickAtIndex: метод. Этот метод возвращает диапазон текста, который должен быть выбран двойным щелчком по определенному индексу.

Итак, вы захотите реализовать подкласс NSTextStorage, который переопределяет этот метод и в некоторых случаях возвращает другой результат. NSTextStorage - полу-абстрактный базовый класс кластера классов. Подклассификация требует немного больше, чем обычно. Вы должны реализовать примитивные методы NSAttributedString и NSMutableAttributedString. См. Документы об этом.

Есть несколько мест, чтобы настроить редактор поля, заменив его объект хранения текста с экземпляром своего класса:

Вы могли бы реализовать пользовательский подкласс NSTextFieldCell. Установите текстовое поле, чтобы использовать его как свою ячейку. В вашем подклассе переопределить - fieldEditorForView:. В своем переопределении выполните экземпляр NSTextView. Получите его layoutManager и вызовите - replaceTextStorage: на этом, передав ему экземпляр вашего пользовательского класса хранения текста. (Это проще, чем собрать иерархию объектов, связанных с редактированием текста, хотя вы можете сделать это сами.) Установите для свойства fieldEditor текстового представления значение true и верните его. В вашем окне делегат, реализует - windowWillReturnFieldEditor:toObject:. Создайте, настройте и верните NSTextView, используя ваше собственное текстовое хранилище, как указано выше.

6

Я думаю, ваше текстовое поле является меткой, а не редактируемым текстовым полем в нормальном состоянии. Начиная с OS X 10.10 (Yosemite), вы можете использовать NSClickGestureRecognizer:

func applicationDidFinishLaunching(aNotification: NSNotification) { 
    let gesture = NSClickGestureRecognizer() 
    gesture.buttonMask = 0x1 // left mouse 
    gesture.numberOfClicksRequired = 2 
    gesture.target = self 
    gesture.action = "editLabel:" 

    myLabel.addGestureRecognizer(gesture) 
} 

func editLabel(sender: NSGestureRecognizer) { 
    if let label = sender.view as? NSTextField { 
     print("Hello world") 
    } 
} 
Смежные вопросы