swift2 如何实时检查NSTextField - Swift OS X

0aydgbwb  于 2022-11-06  发布在  Swift
关注(0)|答案(4)|浏览(166)

我目前正在用Swift编写一个OS X应用程序。我想做的是,当用户在NSTextField中输入文本时,我想运行一个函数来检查值并将其添加到标签中。我在Swift中如何做到这一点?

uajslkp6

uajslkp61#

  1. ViewController符合方案NSTextDelegate
    1.将ViewController指定为TextField的受委托人。
    1.实作controlTextDidChange方法。
import Cocoa

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate, NSTextFieldDelegate {

    @IBOutlet weak var window: NSWindow!
    @IBOutlet weak var textField: NSTextField!
    @IBOutlet weak var label: NSTextField!

    func applicationDidFinishLaunching(aNotification: NSNotification)
    {
        textField.delegate = self
    }

    override func controlTextDidChange(notification: NSNotification)
    {
        let object = notification.object as! NSTextField
        self.label.stringValue = object.stringValue
    }

    func applicationWillTerminate(aNotification: NSNotification) {
        // Insert code here to tear down your application
    }
}

在视图控制器中:

import Cocoa

class ViewController: NSViewController, NSTextDelegate {

   @IBOutlet weak var label: NSTextField!
   @IBOutlet weak var label2: NSTextField!
   @IBOutlet weak var textField: NSTextField!
   @IBOutlet weak var textField2: NSTextField!

   override func viewDidLoad() {
      super.viewDidLoad()
   }

   override func controlTextDidChange(notification: NSNotification) {
      if let txtFld = notification.object as? NSTextField {
         switch txtFld.tag {
         case 201:
            self.label.stringValue = txtFld.stringValue
         case 202:
            self.label2.stringValue = txtFld.stringValue
         default:
            break
         }
      }
   }
}
wixjitnu

wixjitnu2#

swift 5 xcode 10格式

//TODO: move oin a better place?
extension NSTextField{ func controlTextDidChange(obj: NSNotification){} }

    class TracksController:NSViewController,
        NSTextFieldDelegate
    {
...
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        //Search bar:
        self.searchBar.delegate = self

        NotificationCenter.default.addObserver(self,
                                               selector: #selector(controlTextDidChange(_:)),
                                               name: NSTextView.didChangeSelectionNotification,
                                               object: nil)

    }

//MARK:NSTextField委派

func controlTextDidChange(_ obj: Notification)
{
    guard let object = obj.object as? NSTextView else{
        return
    }

    let delegate = object.delegate
    guard  let searchField = delegate as? NSSearchField else {
        return
    }

    let text = searchField.stringValue
    print(text)

}
p8ekf7hl

p8ekf7hl3#

我知道这个问题在一段时间前已经得到了解答,但我最终在Swift 3中为macOS找到了这个解决方案(不幸的是,它不适用于Swift 4),当文本字段被点击时,它会通知用户每一次击键。
将此委托添加到您的类:-

NSTextFieldDelegate

在viewDidLoad()中

NotificationCenter.default.addObserver(self, selector: #selector(textDidChange(_:)), name: Notification.Name.NSTextViewDidChangeSelection, object: nil)

然后添加此函数:-

func textDidChange(_ notification: Notification) {
        print("Its come here textDidChange")
        guard (notification.object as? NSTextView) != nil else { return }
        let numberOfCharatersInTextfield: Int = textFieldCell.accessibilityNumberOfCharacters()
        print("numberOfCharatersInTextfield = \(numberOfCharatersInTextfield)")
}

希望这对其他人有帮助。

t98cgbkg

t98cgbkg4#

上面的答案不适用于swift 4,

Swift 4解决方案

过程基本上是相同的,但是你只需要将一些功能扩展到NSTextfield类。我们必须这样做的原因是,像**controlTextDidChange:**这样的委托协议方法实际上根本不存在,因为旧的objective-c代码设计不能很好地Map到swift。objective-c中的NSTextFieldDelegate是一个非正式的协议,它和swift中的扩展是一样的。

示例

extension NSTextField{ func controlTextDidChange(obj: NSNotification){} }

class SomeViewController:NSViewController,NSTextFieldDelegate {

override func controlTextDidChange(_ obj: Notification)
{
    let object = obj.object as! NSTextField
    let value = object.stringValue
    print(value)
}

对于每一个你想使用的函数,从NSTextFieldDelegate中只需把该方法放在扩展子句中即可。

相关问题