Добавить префикс к UITextField - PullRequest
2 голосов
/ 18 марта 2012

Мне нужен знак «$» в текстовом поле, который нельзя стереть.Пользователь должен иметь возможность вводить значения после него, и если он нажимает клавишу Backspace, он должен только стереть введенное им значение.

Причина, по которой я не могу использовать UILabel до этого, заключается в том, что текст в UITextfield выровнен по центру ион увеличивается в любую сторону, когда пользователь вводит значения.

Пожалуйста, предоставьте любое решение

Ответы [ 4 ]

8 голосов
/ 18 марта 2012
  1. Первоначально установите для текста текстового поля значение "$".
  2. Установите для делегата текстового поля какой-либо объект (возможно, содержащий его контроллер представления).
  3. Реализация -textField:shouldChangeCharactersInRange:replacementString: и верните NO, если предлагаемое изменение приведет к удалению "$".

Кроме того, вам может потребоваться реализовать -textFieldDidBeginEditing: для позиционирования курсора после "$", если его там нетуже.

1 голос
/ 21 сентября 2015

Нет необходимости использовать shouldChangeCharactersInRange метод делегата.Самое простое и удобное решение - это

            var label = UILabel(frame: CGRectMake(0, 0, 50, 50))
            label.text = "$";
            label.backgroundColor = UIColor(white: 0.0, alpha: 0.0)
            tenantField.rightViewMode = .Always
            tenantField.rightView = label
0 голосов
/ 09 мая 2016

Вы можете создать подкласс UITextField для всех текстовых полей, которые принимают сумму в качестве значения.

class SpecialTextField: UITextField {

var amount: String {
    get {
        if self._amount.characters.count > 1 {
            return (self._amount as NSString).substringFromIndex(2)
        }
        return ""
    }
}

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

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


private var newVal: String = ""
private var _amount: String = ""

func didChangeText() {
    if (text?.characters.count > 2) {
        if text?.rangeOfString("$ ") == nil {
            text = newVal
        }
    }

    if (text?.characters.count == 1) && (text?.characters.count > newVal.characters.count) {
        text = "$ " + text!
    }
    if (text?.characters.count == 2) && (text?.characters.count < newVal.characters.count) {
        text = ""
    }
    newVal = text ?? ""
    _amount = newVal
}
}

Это вставит знак $ при каждом вводе первого числа и удалит его при удалении всех чисел.

var amount даст действительное значение суммы, введенное пользователем, после удаления знака $.

Надеюсь, это помогло.

0 голосов
/ 21 октября 2013

Как отмечалось в предыдущем ответе Добавьте префикс к UITextField

внутри textFieldDidBeginEditing в качестве метода делегата, который я нашел, используя следующий код, чтобы быть лучшим и правильным способом форматирования строки, которую мыдо / после фиксации символы валюты / коды

        NSNumberFormatter* formatter = [[NSNumberFormatter alloc]init];
        [formatter setNumberStyle:NSNumberFormatterCurrencyStyle];
        [formatter setPaddingPosition:NSNumberFormatterPadAfterPrefix];
        [formatter setCurrencySymbol:symbol];
        [formatter setMaximumFractionDigits:2];
        [formatter setMinimumFractionDigits:2];
        [formatter setUsesGroupingSeparator:YES];
        [formatter setCurrencyGroupingSeparator:@","];
        [formatter setCurrencyDecimalSeparator:@"."];
...