使用Swift在UITextField中使用不可编辑的前缀

Alu*_*num 3 uitextfield nsmutableattributedstring swift

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

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
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,我如何为usernamePrefix分配新参数,以便为写入的文本提供2种不同的颜色UITextField?我希望有前缀.lightGreyColor()和其余的.blackColor().另外,如何让usernamePrefix不可编辑且不可删除?

谢谢您的帮助

Jer*_*ope 15

对于第一部分,您可以重构您的委托方法,如下所示.

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
}
Run Code Online (Sandbox Code Playgroud)

这将锁定长度为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
}
Run Code Online (Sandbox Code Playgroud)


sas*_*ash 11

更简单的办法是设置leftViewUITextField,以及如何定制你喜欢它:

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

usernameField.leftView = prefix
usernameField.leftViewMode = .whileEditing // or .always
Run Code Online (Sandbox Code Playgroud)

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

  • 这与接受的答案之间的显着区别是:对于接受的答案,前缀仍然是文本字段文本的一部分。如果您有一个文本字段,例如在可编辑文本下方有一行,则区别可能很重要。对于接受的答案,这样的行将显示在前缀下方,而对于此答案,则不会;该行将从前缀结束的地方开始。这可能是利弊,取决于您的需要。 (5认同)