Хорошо, я пытаюсь заставить демо-версию ждать, я вернусь, если смогу.

гли бы вы мне помочь.

ВUITextField когда мы предоставляем текст-заполнитель, его строка-заполнитель пропадает при вводе любого символа. Как я могу добиться, чтобы только введенный символ пропал не на всю строку? Это означает, что если я введу 3 символа, пропадут только первые 3 символа заполнителя.

# EDIT 1

Кроме того, цвет текста вновь введенного символа изменится, а цвет оставшегося текста символа останется прежним.

Заранее спасибо.

 Anbu.Karthik07 сент. 2017 г., 11:44
_ (подчеркивание) вам нужно рассчитать на основе ввода строки пользователя с учетом ввода
 Anbu.Karthik05 сент. 2017 г., 09:00
нет необходимости в заполнителе, создайте оверлей и установите те же границы вашего текстового файла, основываясь на символе текстового поля, которое он автоматически скрывает
 Vishal1605 сент. 2017 г., 09:34
Я ... Это хитрость, но я хочу добиться с помощью кода, переопределив свойство заполнителя по умолчанию. Благодарю.
 Hasya07 сент. 2017 г., 11:37
Я думаю, вы должны сделать это с наложением. @ Анбу.Картик это правда.
 Vishal1605 сент. 2017 г., 11:13
@ Anbu.Karthik На самом деле ваше решение не работает. Когда я хочу заменить знак подчеркивания '_' на определенный символ, такой как 'A' или '10', в строке возникает несоответствие.

Ответы на вопрос(6)

использующее свойство UITextField tex, t

+(BOOL)shouldChangeCharactersInRange:(NSRange)range
                   replacementString:(NSString *)string
                           textField:(UITextField *)textField
                                mask:(NSString *)mask withMaskTemplate:(NSString *)maskTemplate{

    NSString * alreadyExistString = @"";
    if (string.length == 0) {
        alreadyExistString = textField.text;
        for (int i = range.location; i >= 0; i--) {
            unichar  currentCharMask = [maskTemplate characterAtIndex:i];
            unichar  currentChar = [alreadyExistString characterAtIndex:i];
            if (currentCharMask == currentChar) {// fixed value and _
                continue;
            }else{
                alreadyExistString = [alreadyExistString stringByReplacingCharactersInRange:NSMakeRange(i, 1) withString:@"_"];
                break;
            }
        }
        textField.text = alreadyExistString;
        return NO;
    }else{
        alreadyExistString = [textField.text stringByReplacingCharactersInRange:NSMakeRange(range.location, 1) withString:string];
    }

    NSMutableString * validText = [[NSMutableString alloc] init];

    int last = 0;
    BOOL append = NO;
    for (int i = 0; i < alreadyExistString.length; i++) {
        unichar  currentCharMask = [mask characterAtIndex:i];
        unichar  currentChar = [alreadyExistString characterAtIndex:i];
        BOOL isLetter = [[NSCharacterSet alphanumericCharacterSet] characterIsMember: currentChar];
        BOOL isDigit  = [[NSCharacterSet decimalDigitCharacterSet] characterIsMember: currentChar];
        if ((isLetter && currentCharMask == '#') || (isDigit && currentCharMask == '9')) {
            [validText appendString:[NSString stringWithFormat:@"%c",currentChar]];
        }else{
            if (currentCharMask == '#' || currentCharMask == '9') {
                break;
            }
            if ((isLetter && currentCharMask!= currentChar)|| (isDigit && currentCharMask!= currentChar)) {
                append = YES;
            }
            [validText appendString:[NSString stringWithFormat:@"%c",currentCharMask]];
        }
        last = i;
    }

    for (int i = last+1; i < mask.length; i++) {
        unichar currentCharMask = [mask characterAtIndex:i];
        if (currentCharMask != '#' && currentCharMask != '9') {
            [validText appendString:[NSString stringWithFormat:@"%c",currentCharMask]];
        }
        if (currentCharMask == '#' || currentCharMask == '9') {
            break;
        }
    }
    if (append) {
        [validText appendString:string];
    }

    NSString *placeHolderMask = textField.text;
    NSString *sub = [validText substringWithRange:NSMakeRange(range.location, 1)];
    placeHolderMask = [placeHolderMask stringByReplacingCharactersInRange:NSMakeRange(range.location, 1) withString:sub];
    textField.text = placeHolderMask;
    return NO;
}

@property (nonatomic,strong) NSString * maskTemplate;// like: _2_-__-__A
@property (nonatomic,strong) NSString * mask;// like: #2#-99-##A
Первоначально установить текстовое поле текста для маски шаблонаЗатем, когда пользователь вводит данные, должен быть вызван методChangeCharactersInRange, и он отлично справляется со своей задачей.

# Редакция 1 Я также реализовал еще один код, который перемещает курсор в положение подчеркивания. Если кому-то нужна помощь. Пожалуйста, прокомментируйте, я вам помогу.

# Редакция 2

Проблемы, с которыми я сталкиваюсь при использовании этого подхода

Невозможно изменить индивидуальный цвет текста. Цвет будет одинаковым как для строки, такой как подчеркивание @ "_", так и для символов ввода одинакового цвета.Если пользователь не вводит никаких данных, я должен предоставить чек для отправки пустых строк.Отслеживание для отдельных входов.

Спасибо, все еще жду, если есть какие-либо другие обходные пути с использованием Placeholder String.

используйте UILabel под вашим текстовым полем и присвойте им одинаковый стиль шрифта. текст метки должен быть похож на "- - - - -"

И когда пользователь начинает печатать на текстовом поле, ставьте пробел после каждого нажатия символов.

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

    if textField.text?.characters.count == 0 && string.characters.count != 0 {
        textField.text = textField.text! + " "
    }
     else {
        return false
    }

    if textField.text?.characters.count == 1 && string.characters.count != 0 {
        textField.text = textField.text! + " "
    }
    else {
        return false
    }

    if textField.text?.characters.count == 2 && string.characters.count != 0 {
        textField.text = textField.text! + " "
    }
    else {
        return false
    }
    if textField.text?.characters.count == 3 && string.characters.count != 0 {
        textField.text = textField.text! + " "
    }
    else {
        return false
    }

    return true
}
 Vishal1609 сент. 2017 г., 08:10
Хорошо. Хорошее решение, но я жду еще ответов, но если нет другого способа сделать это. Я приму ваш ответ
 Saranjith09 сент. 2017 г., 08:12
Удачного кодирования Манн :)

Textfield, после этого вам нужно проверить, соответствует ли введенный символ в строке placehoder, тогда только тот символ, который будет заменен. смотрите такжеЗамена символа после каждого типа в UITextField?

 Vishal1605 сент. 2017 г., 09:38
Хорошо. Я постараюсь, но я хочу заменить заполнитель отдельным текстом. Вы можете видеть, когда мы вводим любой вводимый символ, полная строка заполнителя исчезла. Я хочу переопределить его поведение по умолчанию.
 Vikas Rajput05 сент. 2017 г., 09:42
Хорошо, я пытаюсь заставить демо-версию ждать, я вернусь, если смогу.

Я думаю, это как раз то, что вы ищете. Создайте свойUITextField объект с текстом_2_-__-__A (не заполнитель текста). Затем используйте его контроллер представления в качестве делегата и добавьте его в контроллер представления:

-(BOOL)textField:(UITextField*)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString*)string{
    if (range.length>1) return NO; // Avoids removing multiple characters at once
    if (range.location==1) range.location++;  // '2' index
    if (range.location==3) range.location++;  // '-' index
    if (range.location==6) range.location++;  // '-' index
    if (range.location==9)  return NO; // 'A' index
    if (range.location==10) return NO; // String end
    if ([string isEqualToString:@""]) return NO; //Avoids removing characters

    if (range.length==0) {
        range.length++;
        UITextPosition *beginning = textField.beginningOfDocument;
        UITextPosition *start = [textField positionFromPosition:beginning offset:range.location];
        UITextPosition *end = [textField positionFromPosition:start offset:range.length];
        UITextRange *textRange = [textField textRangeFromPosition:start toPosition:end];
        [textField setSelectedTextRange:textRange];
    }

    return YES;
}
-(void)textFieldDidBeginEditing:(UITextField*)textField{
    UITextPosition *beginning = textField.beginningOfDocument;
    UITextPosition *start = [textField positionFromPosition:beginning offset:0];
    UITextPosition *end = [textField positionFromPosition:start offset:0];
    UITextRange *textRange = [textField textRangeFromPosition:start toPosition:end];
    [textField setSelectedTextRange:textRange];
}
-(BOOL)textFieldShouldReturn:(UITextField*)textField{
    [passwordInput resignFirstResponder];
    return YES;
}

Это должно работать как задумано.

Решение Вопроса

что поведение заполнителя по умолчанию является редактируемым, но то, что вы пытаетесь выполнить, можно сделать с помощьюNSAttributedString для имитации значения заполнителя.

Я уверен, что это можно оптимизировать, но здесь я создал класс обработчика, который действует как делегат для данногоUITextFieldманипулируя строкой, которую пользователь вводит для достижения желаемого эффекта. Вы можете инициировать обработчик с желаемой строкой-заполнителем, чтобы вы могли заставить любое текстовое поле работать таким образом.

import UIKit

class CustomPlaceholderTextFieldHandler: NSObject {
    let placeholderText: String
    let placeholderAttributes = [NSForegroundColorAttributeName : UIColor.lightGray]
    let inputAttributes = [NSForegroundColorAttributeName : UIColor(red: 255/255, green: 153/255, blue: 0, alpha: 1.0)]
    var input = ""

    init(placeholder: String) {
        self.placeholderText = placeholder
        super.init()
    }

    func resetPlaceholder(for textField: UITextField) {
        input = ""
        setCombinedText(for: textField)
    }

    fileprivate func setCursorPosition(for textField: UITextField) {
        guard let cursorPosition = textField.position(from: textField.beginningOfDocument, offset: input.characters.count)
            else { return }

        textField.selectedTextRange = textField.textRange(from: cursorPosition, to: cursorPosition)
    }

    fileprivate func setCombinedText(for textField: UITextField) {
        let placeholderSubstring = placeholderText.substring(from: input.endIndex)
        let attributedString = NSMutableAttributedString(string: input + placeholderSubstring, attributes: placeholderAttributes)
        attributedString.addAttributes(inputAttributes, range: NSMakeRange(0, input.characters.count))
        textField.attributedText = attributedString
    }
}

extension CustomPlaceholderTextFieldHandler: UITextFieldDelegate {
    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

        if string == "" {
            if input.characters.count > 0 {
                input = input.substring(to: input.index(before: input.endIndex))
            }
        } else {
            input += string
        }

        if input.characters.count <= placeholderText.characters.count {
            setCombinedText(for: textField)
            setCursorPosition(for: textField)
            return false
        }
        return true
    }

    func textFieldDidBeginEditing(_ textField: UITextField) {
        setCursorPosition(for: textField)
    }
}

Вот способ, которым я инициализировал GIF выше:

class ViewController: UIViewController {

    @IBOutlet weak var textField: UITextField!
    let placeholderHandler = CustomPlaceholderTextFieldHandler(placeholder: "_2_-__-__A")

    override func viewDidLoad() {
        super.viewDidLoad()
        textField.delegate = placeholderHandler
        placeholderHandler.resetPlaceholder(for: textField)
    }
}

Это может быть расширено, чтобы принимать параметры цвета, шрифты и т. Д. При инициализации, или вы можете найти его чище для подклассаUITextField и сделать его своим собственным делегатом. Я также действительно не проверял это для выбора / удаления / замены нескольких символов.

input Переменная вернет текст, введенный пользователем в любой заданной точке. Кроме того, использование шрифта фиксированной ширины позволило бы устранить дрожание при вводе пользователем и замену текста-заполнителя.

 Vishal1614 сент. 2017 г., 07:16
Отличная работа. Спасибо

как показано ниже,

let attributeFontSaySomething : [String : Any] = [NSFontAttributeName : UIFont.systemFont(ofSize: 12.0)]
let attributeColorSaySomething : [String : Any] = [NSForegroundColorAttributeName : UIColor.blue]

var attributes = attributeFontSaySomething
for (key, value) in attributeColorSaySomething {
    attributes(value, forKey: key)
}

let attStringSaySomething = NSAttributedString(string: "Say something", attributes: attributes)
 Vishal1608 сент. 2017 г., 10:17
Не решение attributedPlacholderString исчезнет, ​​когда мы введем какой-либо ввод.

Ваш ответ на вопрос