如何在Swift中将多个NSTextfields(OSX cocoa app,NOT iOS)中的最大字符数设置为一个?
请解释一下如何做到这一点,因为我在OSX应用程序开发方面是一个完全新手,因此我不理解像“使用NSFormatter”这样的简短答案,因为我不知道它是什么以及如何实现它。像例子一样
答案 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()
}
}