IPhone, как получить текст UITextField при наборе текста?

Я пытаюсь показать изменения, внесенные в UITextField на отдельный UILabel. Есть ли способ захватить полный текст UITextField после каждого символа, который вводит пользователь? В настоящее время я использую этот метод, но он не фиксирует последний символ, введенный пользователем.

Я знаю, что UITextView имеет метод didChange, но я не смог найти этот метод для UITextField.

//does not capture the last character

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{

        [self updateTextLabelsWithText: textField.text];

    return YES;
}

Как я могу извлечь текст из UITextField после ввода каждого символа?

Спасибо!

Ответ 1

  • Сначала добавьте один UITextField и UILabel в раскадровку /nib
  • Теперь назначьте IBOutlet для UILabel (здесь я использовал myLabel)
  • Назначить UITextFieldDelegate владельцу файла, также реализовать тот же делегат в файле .h
  • Используйте эти строки кода:

    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
    {
        NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
        [self updateTextLabelsWithText: newString];
    
        return YES;
    }
    
    -(void)updateTextLabelsWithText:(NSString *)string
    {
         [myLabel setText:string];
    }
    

Надеюсь, что это поможет.

Ответ 2

Просто обработайте событие "Редактирование изменено"

[textField addTarget:self 
              action:@selector(editingChanged:)
    forControlEvents:UIControlEventEditingChanged];

и селектор:

-(void) editingChanged:(id)sender {
   // your code
}

Вы можете сделать это вручную или с помощью раскадровки CTRL-Перетаскивая событие "Редактирование изменено" Sent на ваш .h, создав для вас метод редактированияChanged.

Ответ 3

В Swift 2.0 +

 class CheckInViewController: UIViewController, UITextFieldDelegate {

 override func viewDidLoad() {
    super.viewDidLoad()

    yourTextField.delegate = self

 }

 func textField(textField: UITextField!, shouldChangeCharactersInRange range: NSRange, replacementString string: String!) -> Bool {
    var updatedTextString : NSString = textField.text as NSString
    updatedTextString = updatedTextString.stringByReplacingCharactersInRange(range, withString: string)

    self.methodYouWantToCallWithUpdatedString(updatedTextString)
    return true
 }

}

Надеюсь, это поможет вам быстрыми пионерами.

Ответ 4

Swift с addTarget Swift 2.0 +

   titleTextField.addTarget(self, action: #selector(textFieldTyping), forControlEvents: .EditingChanged)

И реализуем selector

func textFieldTyping(textField:UITextField)
{
    //Typing
}

Ответ 5

В Swift 3.0:

Некоторые из этих решений были за одним символом, или для более ранних версий Swift и Obj-C. Вот что я использую для Swift 3.0

В классе я объявил местозаполнитель для хранения текста.

var tempName = ""

В ViewDidLoad я использовал:

nameField.addTarget(self, action: #selector(typingName), for: .editingChanged)

Затем я произвел функцию:

   func typingName(textField:UITextField){

        if let typedText = textField.text {
            tempName = typedText
            print(tempName)
        }
    }

Ответ 6

Свифт 3. 0+: Мне это очень понравилось.

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    self.yourLabel.text = "\(textField.text ?? "")\(string)"
    return true
}

Ответ 7

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        if textField == yourTextFieldOutletName
        {
           if yourTextFieldOutletName.isEmpty == false
           {
             youtlabelname.text = yourTextFieldOutletName.text!
            }


        }

        return true

    }

func textViewDidEndEditing(_ textView: UITextView) {
       if textField == yourTextFieldOutletName
            {
               if yourTextFieldOutletName.isEmpty == false
               {
                 youtlabelname.text = yourTextFieldOutletName.text!
                }


            } 
    }

Ответ 8

Может кто-нибудь поделиться полным кодом в качестве примера для этого новичка (меня)?