安全文本 .echosbullets 不适用于密码字段
Secure text .echosbullets not working for password field
这是我得到的:
@IBOutlet weak var password: NSSecureTextField!
@IBOutlet weak var shwpswd: NSButton! //Checkbox
@IBOutlet weak var pswdcell: NSSecureTextFieldCell! //Cell
@IBAction func shwpswd(_ sender: Any) {
if(shwpswd.state == 1) {
pswdcell.echosBullets = false // Turn the Secure text into regular text
}
else if(shwpswd.state == 0) {
pswdcell.echosBullets = true // Secure text
}
}
一切似乎 运行 都很好,除了密码字段中的文本不会在回显项目符号和回显真实文本之间改变状态。一切都正确地链接在一起 - 单元格在文本字段内,密码按钮在视图中并且出口工作。我想知道这是不是 "Swift on mac < Swift on iOS cases".
中的另一个
编辑:这是最终的解决方案,如果有人想看的话:
@IBOutlet weak var shwpswd: NSButton! //Checkbox
@IBOutlet weak var visPswd: NSTextfield! //hidden regular box to show chars
@IBOutlet weak var password: NSSecureTextField! //visible initial secure box
@IBAction func shwpswd(_ sender: Any) {
if(shwpswd.state == 1) {
self.visPswd.stringValue = self.password.stringValue //Sync both the text fields
self.password.isHidden = true //hide the secure field
self.visPswd.isHidden = false //show the real character echo field
}
else if(shwpswd.state == 0) {
self.password.stringValue = self.visPswd.stringValue //Sync the two
self.password.isHidden = false // Inverse of above
self.visPswd.isHidden = true
}
}
请注意文本字段 password
和 visPswd
在视图中的大小和位置相同 - 始终隐藏一个以避免重叠。当用户在 password
或 visPswd
字段中输入值时,它会在复选框状态更改时与其他字段同步。
您可以在安全字段顶部添加第二个文本字段来完成您想要的操作。将 IBAction 添加到您的复选框以切换您的字段 isHidden 属性 并复制另一个 textField stringValue 并使其成为第一响应者。您的实施应如下所示:
import Cocoa
class ViewController: NSViewController {
@IBOutlet weak var password: NSSecureTextField!
@IBOutlet weak var showPassword: NSTextField!
@IBOutlet weak var shwpswd: NSButton!
override func viewDidLoad() {
super.viewDidLoad()
shwpswd.state = .off
showPassword.isHidden = true
}
override func viewDidAppear() {
super.viewDidAppear()
password.window?.makeFirstResponder(password)
}
@IBAction func showHidePassword(_ sender: NSButton) {
showPassword.isHidden.toggle()
password.isHidden.toggle()
if !showPassword.isHidden {
showPassword.stringValue = password.stringValue
showPassword.becomeFirstResponder()
} else {
password.stringValue = showPassword.stringValue
password.becomeFirstResponder()
}
}
}
这是我得到的:
@IBOutlet weak var password: NSSecureTextField!
@IBOutlet weak var shwpswd: NSButton! //Checkbox
@IBOutlet weak var pswdcell: NSSecureTextFieldCell! //Cell
@IBAction func shwpswd(_ sender: Any) {
if(shwpswd.state == 1) {
pswdcell.echosBullets = false // Turn the Secure text into regular text
}
else if(shwpswd.state == 0) {
pswdcell.echosBullets = true // Secure text
}
}
一切似乎 运行 都很好,除了密码字段中的文本不会在回显项目符号和回显真实文本之间改变状态。一切都正确地链接在一起 - 单元格在文本字段内,密码按钮在视图中并且出口工作。我想知道这是不是 "Swift on mac < Swift on iOS cases".
中的另一个编辑:这是最终的解决方案,如果有人想看的话:
@IBOutlet weak var shwpswd: NSButton! //Checkbox
@IBOutlet weak var visPswd: NSTextfield! //hidden regular box to show chars
@IBOutlet weak var password: NSSecureTextField! //visible initial secure box
@IBAction func shwpswd(_ sender: Any) {
if(shwpswd.state == 1) {
self.visPswd.stringValue = self.password.stringValue //Sync both the text fields
self.password.isHidden = true //hide the secure field
self.visPswd.isHidden = false //show the real character echo field
}
else if(shwpswd.state == 0) {
self.password.stringValue = self.visPswd.stringValue //Sync the two
self.password.isHidden = false // Inverse of above
self.visPswd.isHidden = true
}
}
请注意文本字段 password
和 visPswd
在视图中的大小和位置相同 - 始终隐藏一个以避免重叠。当用户在 password
或 visPswd
字段中输入值时,它会在复选框状态更改时与其他字段同步。
您可以在安全字段顶部添加第二个文本字段来完成您想要的操作。将 IBAction 添加到您的复选框以切换您的字段 isHidden 属性 并复制另一个 textField stringValue 并使其成为第一响应者。您的实施应如下所示:
import Cocoa
class ViewController: NSViewController {
@IBOutlet weak var password: NSSecureTextField!
@IBOutlet weak var showPassword: NSTextField!
@IBOutlet weak var shwpswd: NSButton!
override func viewDidLoad() {
super.viewDidLoad()
shwpswd.state = .off
showPassword.isHidden = true
}
override func viewDidAppear() {
super.viewDidAppear()
password.window?.makeFirstResponder(password)
}
@IBAction func showHidePassword(_ sender: NSButton) {
showPassword.isHidden.toggle()
password.isHidden.toggle()
if !showPassword.isHidden {
showPassword.stringValue = password.stringValue
showPassword.becomeFirstResponder()
} else {
password.stringValue = showPassword.stringValue
password.becomeFirstResponder()
}
}
}