6

我在UITextField使用新Swift语言在 a 中创建前缀时遇到问题。目前,我已经UITextField使用 Interface Builder 创建了一个,并为其分配了一个IBOutlet名为usernameField的函数,然后使用我在其中textFieldDidBeginEditing编写了一个名为usernamePrefix的函数,仅包含单词“C-TAD-”,最后我限制了最大字符编号为 13,如下所示:NSMutableAttributedStringUITextField

class ViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet var usernameField : UITextField!

    private var usernamePrefix = NSMutableAttributedString(string: "C-TAD-")

    func textFieldDidBeginEditing(textField: UITextField) {
        if textField == usernameField {
            if usernameField.text == "" {
                usernameField.attributedText = usernamePrefix
            }
        }

        usernameField.addTarget(self, action: "textFieldDidChangeText:", forControlEvents:UIControlEvents.EditingChanged)
    }

    func textField(textField: UITextField!, shouldChangeCharactersInRange range: NSRange, replacementString string: String!) -> Bool {
        let maxUsernameLength = countElements(usernameField.text!) + countElements(string!) - range.length

        return maxUsernameLength <= 13
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        usernameField.delegate = self
        passwordField.delegate = self
    }
}

现在,我如何为usernamePrefix分配新参数,以便必须为写入的文本提供 2 种不同的颜色UITextField?我想将前缀放入.lightGreyColor(),其余放入.blackColor(). 另外,如何使用户无法编辑和删除 usernamePrefix?

谢谢您的帮助

4

3 回答 3

21

对于第一部分,您可以按如下方式重构您的委托方法。

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    //This makes the new text black.
    textField.typingAttributes = [NSForegroundColorAttributeName:UIColor.blackColor()]
    let protectedRange = NSMakeRange(0, 6)
    let intersection = NSIntersectionRange(protectedRange, range)
    if intersection.length > 0 {

        return false
    }
    if range.location == 12 {
        return true
    }
    if range.location + range.length > 12 {
        return false
    }
    return true
}

这会将长度锁定在 13 并且前缀不能被删除。输入的所有内容都是 UIColor.blackColor()

然后,您可以在 viewDidLoad 中使用类似以下的方法来设置前缀。

func makePrefix() {
    let attributedString = NSMutableAttributedString(string: "C-TAD-")
    attributedString.addAttribute(NSForegroundColorAttributeName, value: UIColor.lightGrayColor(), range: NSMakeRange(0,6))
    textField.attributedText = attributedString
}
于 2015-02-10T16:30:36.647 回答
20

更简单的选择是设置leftViewUITextField自定义它你喜欢它:

let prefix = UILabel()
prefix.text = "C-TAD-"
// set font, color etc.
prefix.sizeToFit()

usernameField.leftView = prefix
usernameField.leftViewMode = .whileEditing // or .always

它不可编辑且不可删除,您无需进行任何计算即可检查输入的长度。

于 2018-12-11T13:13:13.750 回答
0

我采用了 Jeremy 的解决方案并进行了一些改进以使其更加快捷,并且还处理了用户将多个字符粘贴到文本字段中的情况。

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    let protectedRange = NSRange(location: 0, length: usernamePrefix.length)
    let intersection = protectedRange.intersection(range)
    
    // prevent deleting prefix
    if intersection != nil {
        return false
    }
    
    // limit max character count
    if (textField.text ?? "").count + string.count > 13 {
        return false
    }
    
    return true
}
于 2020-12-11T16:30:10.867 回答