Использование `textField: shouldChangeCharactersInRange:`, как мне получить текст, включая текущий типизированный символ?

Я использую код ниже, чтобы попытаться обновить текстовый контент textField2, чтобы он соответствовал textField1 всякий раз, когда пользователь вводит в textField1.

- (BOOL) textField: (UITextField *)theTextField shouldChangeCharactersInRange: (NSRange)range replacementString: (NSString *)string {    
  if (theTextField == textField1){    
     [textField2 setText:[textField1 text]];    
  }
}

Однако вывод, который я наблюдаю, заключается в том, что...

textField2 равен "12", когда textField1 равен "123"

textField2 - "123", когда textField1 равен "1234"

... когда я хочу:

textField2 - "123", когда textField1 равен "123"

textField2 - "1234" , когда textField1 равен "1234"

Что я делаю неправильно?

+98
источник поделиться
9 ответов

-shouldChangeCharactersInRange получает название до, текстовое поле фактически меняет текст, поэтому вы получаете старое текстовое значение. Чтобы получить текст после обновления, используйте:

[textField2 setText:[textField1.text stringByReplacingCharactersInRange:range withString:string]];
+261
источник
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSString * searchStr = [textField.text stringByReplacingCharactersInRange:range withString:string];

    NSLog(@"%@",searchStr);
    return YES;
}
+48
источник
другие ответы

Связанные вопросы


Похожие вопросы

Swift 3

В соответствии с принятым ответом следующее должно работать в Swift 3:

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

    let newString = NSString(string: textField.text!).replacingCharacters(in: range, with: string)

    return true
}

Примечание

Оба String и NSString имеют методы, называемые replacingCharacters:inRange:withString. Однако, как и ожидалось, первый ожидает экземпляр Range, в то время как последний ожидает экземпляр NSRange. Метод делегата textField использует экземпляр NSRange, поэтому использование NSString в этом случае.

+23
источник

Вместо использования UITextFieldDelegate попытайтесь использовать "Редактирование измененного" события UITextField.

+21
источник

Быстрая версия для него:

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

    if string == " " {
        return false
    }

    let userEnteredString = textField.text

    var newString = (userEnteredString! as NSString).stringByReplacingCharactersInRange(range, withString: string) as NSString

    print(newString)

    return true
}
+7
источник

Это код, который вам нужен,

if ([textField isEqual:self.textField1])
  textField2.text = [textField1.text stringByReplacingCharactersInRange:range withString:string];
+5
источник

использовать охрану

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
        guard case let textFieldString as NSString = textField.text where
            textFieldString.stringByReplacingCharactersInRange(range, withString: string).length <= maxLength else {
                return false
        }
        return true
    }
+1
источник

Мое решение - использовать UITextFieldTextDidChangeNotification.

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(copyText:) name:UITextFieldTextDidChangeNotification object:nil];

Не забудьте вызвать [[NSNotificationCenter defaultCenter] removeObserver:self]; в методе dealloc.

0
источник

Если вам нужно заменить текст текстового поля на это, вы можете использовать мое решение (Swift 3): https://gist.github.com/Blackjacx/2198d86442ec9b9b05c0801f4e392047

После замены вы можете просто получить textField.text для извлечения скомпонованного текста.

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос