如何生活检查NSTextField - Swift OS X.

时间:2016-01-09 14:15:06

标签: macos label swift2 nstextfield

我目前正在使用Swift编写OS X应用程序。我想要做的是当用户在NSTextField中输入文本时,我想运行一个检查值并将其添加到Label的函数。我怎么能在swift中做到这一点?

5 个答案:

答案 0 :(得分:7)

  1. 使ViewController符合协议NSTextDelegate
  2. 指定ViewController作为TextField的代表。
  3. 实施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
        }
    }
    
  4. ViewController中的

    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
             }
          }
       }
    }
    

答案 1 :(得分:1)

我知道它已经在一段时间之前得到了回答,但我最终在Swift 3中找到了macOS的解决方案(不幸的是它不适用于Swift 4),它会在内部点击文本字段并且每次按键时都会发出通知。

将此委托添加到您的班级: -

MenuItem

在viewDidLoad()

NSTextFieldDelegate

然后添加此功能: -

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

希望这有助于其他人。

答案 2 :(得分:0)

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

Swift 4的解决方案

该过程大致相同,但您只需将某些功能扩展到 NSTextfield 类。我们必须这样做的原因是像 controlTextDidChange:这样的委托协议方法实际上根本不存在,因为Objective-c代码的旧设计不能很好地映射到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中使用,只需将该方法放在扩展子句中。

答案 3 :(得分:0)

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:NSTextFieldDelegate

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)

}

答案 4 :(得分:-4)

您可以使用NSNotificationCenter观察文本字段。

@IBOutlet weak var textField: UITextField!

在viewDidLoad()

let noti = NSNotificationCenter.defaultCenter()    
noti.addObserver(self, selector: "textDidChange:", name: UITextFieldTextDidChangeNotification, object: textField)

然后定义一个函数,例如:

func textDidChange(noti: NSNotification) {
    print(textField.text)
}

现在您在文本字段中输入的每个梯形图,它将在textDidChange()函数中打印出来。

希望这个帮助