【问题标题】:How do I programatically move the cursor from one NSTextField to another after a character count has been reached?达到字符数后,如何以编程方式将光标从一个 NSTextField 移动到另一个?
【发布时间】:2020-07-30 08:01:57
【问题描述】:

我正在尝试创建一个窗口,用户可以在其中输入产品的激活密钥,我通过创建 5 个不同的 NSTextField 来完成此操作,如图所示。

我要补充的是the ability for the cursor to move to the next text field once a character count has been reached (which is 5 characters maximum per textfield)

我确实找到了此代码,但它是针对 IOS 的,因为我不知道要进行哪些更改(Code for the IOS version)

这是我尝试过的代码

    override func viewDidLoad() {
    super.viewDidLoad()
    ActKeyOne.textDidChange(Notification.Name.init(rawValue: "textchanged"))
}

它给出了错误:

Cannot convert value of type 'Notification.Name' (aka 'NSNotification.Name') to expected argument type 'Notification'

【问题讨论】:

  • 使用文本字段通知计算每个文本字段中的字符数。
  • textDidChangeNotification & makeFirstResponder(_:)。尝试一下,如果它不适合您,请使用不适合您的代码编辑您的问题。
  • 您可以使用委托和controlTextDidChange(_:),而不是textDidChangeNotification
  • 看起来 controlTextDidChange( :) 效果更好,谢谢大家

标签: swift macos user-interface cocoa


【解决方案1】:

这个问题的部分答案由@cheesey 发布here

这里是创建一个窗口的完整代码,该窗口从用户 (This is using swift 4) 获取产品的许可证密钥。

首先在viewDidLoad 函数中将文本字段设置为代表和第一响应者,然后在达到字符串限制后更改第一响应者

class CommercialActivationView: NSViewController {
  override func viewDidLoad() {
    super.viewDidLoad()
    @IBOutlet weak var firsttextfield: NSTextField!
    @IBOutlet weak var secondtextfield: NSTextField!
    @IBOutlet weak var thirdtextfield: NSTextField!

    firsttextfield.window?.makeFirstResponder(firsttextfield)
    firsttextfield.delegate = self
  }

  func makeFirstResponder() {
    
    if firsttextfield.stringValue.count == 5 {
        firsttextfield.window?.makeFirstResponder(secondtextfield)
    }
    if secondtextfield.stringValue.count == 5 {
        secondtextfield.window?.makeFirstResponder(thirdtextfield)
    }
  }
}

现在创建扩展,每次用户编辑 TextField (Here i'm limiting the number of characters per text field to 5) 时创建字符限制或文本字段。

extension CommercialActivationView: NSTextFieldDelegate {
func controlTextDidChange(_ obj: Notification) {
    
    let object = obj.object as! NSTextField
    if object.stringValue.count > 5{
        object.stringValue = String(object.stringValue.dropLast())
        makeFirstResponder()
    }
}

这样一旦在 1 TextField 中达到 5 个字符,它就会自动切换到下一个字符。此外,我发布的代码是 3 TextFields 如果需要,可以添加更多文本字段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 2011-07-03
    • 1970-01-01
    相关资源
    最近更新 更多