UITextField - 开头和开头的不可编辑的前缀字符端

时间:2016-05-08 21:12:00

标签: ios swift uiviewcontroller uitextfield prefix

我有一个UITextField,我想给它不可编辑的字符。例如,我有"Hello...",我希望用户在o.之间写入,例如"Hello userTypedStuff..."

我使用了这种方法,但是使用它,用户可以长按开头,例如转到Hello中的位置。因此,用户可以弄乱前缀字符。

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    let protectedRange = NSMakeRange(0, 5)
    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
}

如何设置'不可编辑的前5个字符和最后3个字符'?

编辑:UITextField的文本对齐中心,正在UILabel上方形成。但是,如果我给textField标签的宽度,textField的宽度不会更大。因此,我给出了宽度视图的宽度。有没有办法可以分别在Hello...的两端创建UILabel,并且在中间有textField(文本对齐的中心),自动拉伸宽度?

编辑2:

如果我的文本视图两侧都有两个静态UILabel,那么这可能是一种解决方法。但是,这次UITextField不会在用户开始输入时将UILabel推送到两侧.TextField center textAligned。如果我在创建它时给它一个恒定的宽度(以CGRectMake编程),它将不会在用户输入时拉伸它的宽度。因此,我给它了视图的宽度。有没有办法自动拉伸TextField的宽度作为用户类型,推动两侧的UILabels?

 "Hello" [textfield] "..."
 uilabel             uilabel

1 个答案:

答案 0 :(得分:0)

class SpecialTextField: UITextField {

// MARK: - UITextField Observing
override internal func willMoveToSuperview(newSuperview: UIView!) {
    if newSuperview != nil {
        text = "Hello..."
        addTarget(self, action: #selector(SpecialTextField.didChangeText), forControlEvents: .EditingChanged)
    }
}

override internal func canPerformAction(action: Selector, withSender sender: AnyObject?) -> Bool {
    return false
}


private var newVal: String = "Hello..."

func didChangeText() {
    var userDidEditDefaultValue = true
    if (text?.characters.count > 7) { // Count of "Hello..."
        if text?.rangeOfString("Hello") != nil {
            if text?.rangeOfString("...") != nil {
                userDidEditDefaultValue = false
            }
        }
    }
    if userDidEditDefaultValue {
        text = newVal
    }
    newVal = text ?? "Hello..."
}
}

这不允许用户更改“Hello ...”或“Hello userEntry ...”的默认值

您可以使用委托方法在中间插入文本。

希望它有所帮助。