Используя `textField: shouldChangeCharactersInRange:`, как мне получить текст, включающий текущий набранный символ? - PullRequest
110 голосов
/ 04 февраля 2010

Я использую приведенный ниже код, чтобы попытаться обновить текстовое содержимое 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"

Что я делаю не так?

Ответы [ 10 ]

267 голосов
/ 04 февраля 2010

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

[textField2 setText:[textField1.text stringByReplacingCharactersInRange:range withString:string]];
51 голосов
/ 01 апреля 2013
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSString * searchStr = [textField.text stringByReplacingCharactersInRange:range withString:string];

    NSLog(@"%@",searchStr);
    return YES;
}
36 голосов
/ 01 ноября 2016

Свифт 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.

24 голосов
/ 04 февраля 2010

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

10 голосов
/ 28 июня 2018

В Swift (4), без NSString (чистый Swift):

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

    if let textFieldString = textField.text, let swtRange = Range(range, in: textFieldString) {

        let fullString = textFieldString.replacingCharacters(in: swtRange, with: string)

        print("FullString: \(fullString)")
    }

    return true
}
7 голосов
/ 20 ноября 2015

Swift версия для него:

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
}
5 голосов
/ 04 февраля 2010

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

if ([textField isEqual:self.textField1])
  textField2.text = [textField1.text stringByReplacingCharactersInRange:range withString:string];
1 голос
/ 12 августа 2016

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

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
    }
0 голосов
/ 11 апреля 2017

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

После замены вы можете просто получить textField.text, чтобы получить составленный текст.

0 голосов
/ 10 января 2014

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...