Цель этого приложения - убедиться, что пользователь ввел определенный текст в NSTextField.Если этот текст отсутствует в поле, ему нельзя оставлять его.
При наличии приложения macOS с текстовым полем подкласса, кнопкой и другим универсальным NSTextField.Когда кнопка нажата, отображается NSPopover, который «прикреплен» к полю, управляемому NSViewController с именем myPopoverVC.
Например, пользователь вводит 3 в верхнем поле и затем щелкает «Показать поповер».Кнопка, которая отображает всплывающее окно и предоставляет подсказку: «Что равняется 1 + 1?»когда всплывающее окно показывает, это поле становится первым респондентом.В это время ничего не будет введено - только для этого вопроса.
Пользователь нажмет кнопку Закрыть, которая закрывает всплывающее окно.В этот момент, что должно произойти, если пользователь щелкает или вкладывает вкладку вне поля с пометкой «3», приложение не должно допускать этого движения - возможно, издает звуковой сигнал или какое-либо другое сообщение.Но что происходит, когда всплывающее окно закрывается и пользователь нажимает клавишу Tab
Даже если в этом поле с «3» было кольцо фокуса, которое должно снова указывать первого респондента в этом окне, пользователь может щелкнуть или убрать его, поскольку функция textShouldEndEditing не вызывается.В этом случае я нажал кнопку закрытия в всплывающем окне, поле «3» имело кольцо фокусировки, и я нажал на вкладку, которая затем перешла к следующему полю.
Это функция в текстовом поле с подклассамиэто работает правильно после того, как текст был введен в поле.В этом случае, если пользователь вводит 3, а затем нажимает клавишу Tab, курсор остается в этом поле.
override func textShouldEndEditing(_ textObject: NSText) -> Bool {
if self.aboutToShowPopover == true {
return true
}
if let editor = self.currentEditor() { //or use the textObject
let s = editor.string
if s == "2" {
return true
}
return false
}
Код кнопки showPopover устанавливает для флага aboutToShowPopover значение true, что позволит подклассу отображать всплывающее окно,(устанавливается в false, когда всплывающее окно закрывается)
Итак, вопрос в том, закрывается ли всплывающее окно, как вернуть статус firstResponder в исходное текстовое поле?Похоже, что он имеет статус первого респондента, и он думает, что имеет этот статус, хотя textShouldEndEditing не вызывается. Если вы введете в поле еще один символ, то все будет работать как надо.Это как если бы редактор поля окна и поле с '3' были отключены, поэтому редактор поля не передает вызовы к этому полю.
Кнопка вызывает функцию, которая содержит это:
let contentSize = myPopoverVC.view.frame
theTextField.aboutToShowPopover = true
parentVC.present(myPopoverVC, asPopoverRelativeTo: contentSize, of: theTextField, preferredEdge: NSRectEdge.maxY, behavior: NSPopover.Behavior.applicationDefined)
NSApplication.shared.activate(ignoringOtherApps: true)
закрытие NSPopover -
parentVC.dismiss(myPopoverVC)
Еще одна часть информации.Я добавил этот бит кода в подклассный элемент управления NSTextField.
override func becomeFirstResponder() -> Bool {
let e = self.currentEditor()
print(e)
return super.becomeFirstResponder()
}
Когда всплывающее окно закрывается и textField становится первым респондентом Windows, этот код выполняется, но печатает ноль.Это указывает на то, что, хотя он является первым респондентом, он не имеет связи с окном fieldEditor и не будет получать события.Почему?
Если что-то неясно, спросите.