我目前正在使用Swift编写OS X应用程序。我想要做的是当用户在NSTextField
中输入文本时,我想运行一个检查值并将其添加到Label的函数。我怎么能在swift中做到这一点?
答案 0 :(得分:7)
ViewController
符合协议NSTextDelegate
。ViewController
作为TextField
的代表。实施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
}
}
}
}
答案 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()函数中打印出来。
希望这个帮助