首页 > 解决方案 > 在 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 事件都会执行(基本上看起来事件是触发两次,一次在主视图上,然后在实际接收输入的视图上)。任何关于我做错或遗漏以防止哔哔声的帮助将不胜感激。

标签: swiftmacos

解决方案


推荐阅读