ViewController + Storyboard使用controlTextDidChange设置验证

时间:2017-01-03 13:52:17

标签: swift xcode cocoa swift3 appkit

尝试在新的(非常小的)Swift Mac应用中为几个文本字段设置验证。在SO和其他一些例子中关注其他各种主题,我仍然无法将controlTextDidChange传播(传播到我的ViewController)。

例如:How to live check a NSTextField - Swift OS X

我已经阅读了至少十几种基本相同概念的变体。由于所接受的答案似乎都没有起作用,我只是越来越感到困惑,这在大多数平台上通常都是一项相当简单的任务。

我实现了controlTextDidChange,只需调用NSLog就可以告诉我是否有任何内容。

AppDelegate应该是响应者链的一部分,最终应该处理controlTextDidChange,但我也没有看到任何内容。

使用当前的Xcode我开始一个新项目。 Cocoa app,Swift,Storyboard等等。

从我可以收集的内容中,以下孤立的示例应该可行。在我的实际应用程序中,我尝试了一些将ViewController插入响应程序链的方法。我发现的一些答案表明它并不总是存在。我还尝试手动添加ViewController作为代码中的委托theTextField.delegate = self

我所做的一切似乎都没有改变文字以触发任何事件

为什么我在设立这个代表团时遇到这么多麻烦?

我的单个文本字段示例应用

故事板就像它一样简单:

Storyboard with single NSTextField

NSTextField Connections

的AppDelegate

import Cocoa

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate, NSTextFieldDelegate, NSTextDelegate {

    func applicationDidFinishLaunching(_ aNotification: Notification) {
        // Insert code here to initialize your application
    }

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

    func controlTextDidChange(notification: NSNotification) {
        let object = notification.object as! NSTextField
        NSLog("AppDelegate::controlTextDidChange")
        NSLog("field contains: \(object.stringValue)")
    }
}

的ViewController

import Cocoa

class ViewController: NSViewController, NSTextFieldDelegate, NSTextDelegate {

    @IBOutlet var theTextField: NSTextField!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    override var representedObject: Any? {
        didSet {
        // Update the view, if already loaded.
        }
    }

    func controlTextDidChange(notification: NSNotification) {
        let object = notification.object as! NSTextField
        NSLog("ViewController::controlTextDidChange")
        NSLog("field contains: \(object.stringValue)")
    }
}

1 个答案:

答案 0 :(得分:1)

我认为您关注的示例有点过时了。 尝试...

    override func controlTextDidChange(_ notification: Notification) {

...作为NSTextFieldDelegate中方法的功能定义。