在Swift的NSTextfield中设置最大字符(到一个)

时间:2016-02-23 22:26:43

标签: swift macos cocoa nstextfield

如何在Swift中将多个NSTextfields(OSX cocoa app,NOT iOS)中的最大字符数设置为一个?

请解释一下如何做到这一点,因为我在OSX应用程序开发方面是一个完全新手,因此我不理解像“使用NSFormatter”这样的简短答案,因为我不知道它是什么以及如何实现它。像例子一样

2 个答案:

答案 0 :(得分:6)

没有内置的方法可以简单地设置最大值,我想因为你需要决定你想要的行为。例如,如果字段中已经有一个字符,并且用户输入了第二个字符,那会发生什么?第二个字符应该被忽略吗?替换第一个?嘟?

在任何情况下,您都可以使用NSText Delegate方法获得所需的任何行为。使您的视图控制器(或任何具有逻辑的对象)成为文本字段的委托,并实现各种委托方法以执行您所需的操作。

同样,确切的行为取决于你,但如果我实现这一点,我可能倾向于使文本字段始终使用输入的最后一个字符(这样,如果已经存在一个字符,则按下第二个字符替换首先)。为此,您需要覆盖textDidChange以查看文本字段的值,并在适当时进行修改。类似的东西:

class ViewController: NSViewController, NSTextFieldDelegate {

    @IBOutlet weak var textField: NSTextField!

    override func controlTextDidChange(obj: NSNotification) {
        if self.textField.stringValue.characters.count > 1 {
            self.textField.stringValue = String(self.textField.stringValue.characters.last!)
        }
    }
}

答案 1 :(得分:1)

您不需要限制用户输入的字符,只需查看输入的第一个字符即可。实际上,它可能更好,因为您将始终必须处理可能的用户错误。如果您愿意,可以通过获取characters.count来发出他们输入太多的警报。如果根本不回答,您可能需要提醒。如果您使用1个NSTextField和一个按钮设置故事板并连接它们,则下面的代码将按原样运行。如果您有多个文本字段,例如多项选择测试,只需以相同的方式设置所有文本字段。

import Cocoa

class ViewController: NSViewController {

    @IBOutlet weak var firstLetter: NSTextField!

根据需要添加任意数量的文本字段:

@IBOutlet weak var secondLetter:NSTextField!

@IBOutlet weak var thirdLetter:NSTextField!

    @IBAction func button(sender: AnyObject) {

        var firstEntry = firstLetter!.stringValue

        var index1 =  firstEntry.startIndex


        if firstEntry.characters.count > 1 {

            runMyAlert("Bad USER! ONLY ONE Character!")
        }

        if firstEntry == "" {  //left it blank

            runMyAlert("You need to enter at least one character!")
            exit(0) //or you'll crash on next line
        }

        var nameLetter1:Character = firstEntry[index1]

        print( "First Letter == \(nameLetter1) ")

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

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

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

    func runMyAlert( alertMessage: String){

        var myWindow = NSWindow.self
        let alert = NSAlert()
        alert.messageText = "ERROR ERROR ERROR"
        alert.addButtonWithTitle("OK")
        alert.informativeText = alertMessage
        alert.runModal()
    }
}