swift - 在 Swift 4 NSTextFields 中键入字符导致发出哔哔声 Mac OS X
问题描述
我是 Swift 4 开发的新手,在我的应用程序中输入 NSTextFields 似乎是一个非常基本的问题(但我无法弄清楚)。该应用程序由一个主视图控制器构成,该控制器具有一个带有多个 NSTextFields 的视图供用户输入。
import Cocoa
import CoreWLAN
class ViewController: NSViewController, NSComboBoxDataSource, NSTableViewDataSource, NSTableViewDelegate, NSComboBoxDelegate {
@IBOutlet weak var txtTotalCashAmt: NSTextField!
@IBOutlet weak var txtTotalCheckAmt: NSTextField!
@IBOutlet weak var txtSubTotalAmt: NSTextField!
@IBOutlet weak var txtTotalLessCashAmt: NSTextField!
主视图控制器中的 viewDidload 函数正在监视 keydown 事件:
override func viewDidLoad()
{
super.viewDidLoad()
NSEvent.addLocalMonitorForEvents(matching: [NSEvent.EventTypeMask.keyDown]) {
self.keyDown(with: $0)
return $0
} . . . .
并且在这个主控制器中有一个针对 keydown 事件的覆盖
override func keyDown(with event: NSEvent)
{
if (event.keyCode == 48 || event.keyCode == 36){
if(cmboPayer.stringValue.count > 0) {
if(isOnCmboPayer == true) {. . . . .
这一切都很好。我的问题出现的地方是我有 2 个可以从这个主视图控制器启动的 segues 以及通知设置为在输入完成时返回到这个主视图:
NotificationCenter.default.addObserver(self, selector: #selector(shouldReloadDeposit), name: NSNotification.Name(rawValue: "newDataNotifDeposit"), object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(setUserLabels), name: NSNotification.Name(rawValue: "newNotifUserDef"), object: nil)
这些通过视图链接到其他控制器,并且它们也除了类似的 NSTextField 输入,但在其他 2 中的任何一个上的 keyDown 都没有覆盖。
class UserDefinedCController: NSViewController, NSTableViewDataSource, NSTableViewDelegate, NSTextFieldDelegate{ }
class AccountMaintController: NSViewController, NSComboBoxDataSource, NSTableViewDelegate, NSComboBoxDelegate{ }
我使用 controlTextDidChange 检查这两个上的击键,以确保正确输入文本,这也可以正常工作:
override func controlTextDidChange(_ notification: Notification) {
if let textField = notification.object as? NSTextField {
let numChars = textField.stringValue.count
switch textField.tag {
case 1000:
let aSet = NSCharacterSet(charactersIn:"0123456789acd@").inverted
let compSepByCharInSet = textField.stringValue.components(separatedBy: aSet)
let numberFiltered = compSepByCharInSet.joined(separator: "")
. . .
txtMicrRoutingNo.stringValue = textField.stringValue
我对所有视图进行了子类化:
import Cocoa
class View: NSView {
override func performKeyEquivalent(with event: NSEvent) -> Bool {
return true
}
}
问题:每次我在任何视图(主要或通过 Segue 调用的其他 2 个)上键入一个字符时,我都会听到哔哔声,这真的很烦人。
我注意到尝试调试的是,每次我加载应用程序并通过 segue 转到其中一个视图,并在 NSTextField 中键入一个字符时,主视图控制器上的 keydown 事件都会执行(基本上看起来事件是触发两次,一次在主视图上,然后在实际接收输入的视图上)。任何关于我做错或遗漏以防止哔哔声的帮助将不胜感激。
解决方案
推荐阅读
- html - 为什么ajax在html模板中返回循环的最新变量?
- javascript - Sequelize 包含嵌套列:“where 子句”中的未知列
- firebase - Dart firebase 和等价物
- batch-file - 在批处理文件中使用完整路径或相对路径
- azure - Azure:如何找到容器注册表的所有者或资源 ID?
- snowflake-cloud-data-platform - 我如何从多个表中复制到?雪花
- heroku - Heroku错误?说我的 package.json 缺少东西
- firebase - 如何在一个查询中结合“where”、“starAt”和“limit” [FIREBASE,REACT NATIVE,REDUX]
- node.js - 从 axios 设置值到外面
- pandas - 如何使用 for 循环遍历多个 panda 数据帧