it-swarm.com.ru

Как проверить, когда изменяется UITextField?

Я пытаюсь проверить, когда изменяется текстовое поле, что эквивалентно функции, используемой для textView - textViewDidChange, до сих пор я сделал это: 

  func textFieldDidBeginEditing(textField: UITextField) {
        if self.status.text == "" && self.username.text == "" {
            self.topRightButton.enabled = false
        } else {   
            self.topRightButton.enabled = true
        }
    }

Какой тип работает, но topRightButton включается, как только текстовое поле нажимается, я хочу, чтобы он был включен только тогда, когда текст действительно введен?

205
user4184036

Свифт

textField.addTarget(self, action: "textFieldDidChange:", forControlEvents: UIControlEvents.EditingChanged)

Тогда вы можете просто вызвать свою функцию!

func textFieldDidChange(textField: UITextField) {
    //your code
}

Swift 2.2

textField.addTarget(self, action: #selector(YourViewController.textFieldDidChange(_:)), forControlEvents: UIControlEvents.EditingChanged)

а также

func textFieldDidChange(textField: UITextField) {
    //your code
}

Swift 3 & Swift 4.1

textField.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)

а также

func textFieldDidChange(_ textField: UITextField) {

}

Swift 4

@objc func textFieldDidChange(_ textField: UITextField) {

}

ОБЪЕКТИВ-С

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

и метод textFieldDidChange является

-(void)textFieldDidChange :(UITextField *) textField{
    //your code
}
566
Fawad Masud

Вы можете сделать это соединение в конструкторе интерфейсов.

  1. В раскадровке щелкните редактор-помощник вверху экрана (два кружка посередине) .  Assistant editor selected

  2. Ctrl + клик по текстовому полю в конструкторе интерфейсов.

  3. Перетащите из EditingChanged внутрь вашего класса контроллера представления в виде помощника .  Making connection

  4. Назовите свою функцию (например, «textDidChange») и нажмите «подключить»  Naming function

103
rmooney

Swift 3.0

textField.addTarget(self, action: #selector(textFieldDidChange(textField:)), for: .editingChanged)

и метод обработки:

func textFieldDidChange(textField: UITextField) { 

}

Swift 4.0

textField.addTarget(self, action: #selector(ViewController.textFieldDidChange(_:)),
                          for: UIControlEvents.editingChanged)

и метод обработки:

@objc func textFieldDidChange(_ textField: UITextField) {

}
41
Robert

То, как я справился с этим до сих пор: в UITextViewDelegate

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool
{
    // text hasn't changed yet, you have to compute the text AFTER the edit yourself
    let updatedString = (textField.text as NSString?)?.stringByReplacingCharactersInRange(range, withString: string)

    // do whatever you need with this updated string (your code)


    // always return true so that changes propagate
    return true
}

Версия Swift4 

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    let updatedString = (textField.text as NSString?)?.replacingCharacters(in: range, with: string)
    return true
}
19
Vinzzz

Свифт 3

 textField.addTarget(self, action: #selector(ViewController.textFieldDidChange(sender:)), for: UIControlEvents.editingChanged)
14
Alessandro Mattiuzzi

Swift 3.0.1+ (Некоторые другие ответы Swift 3.0 не актуальны)

textField.addTarget(self, action: #selector(ViewController.textFieldDidChange(_:)),
                          for: UIControlEvents.editingChanged)

func textFieldDidChange(_ textField: UITextField) {

}
7
aviran

textField (_: shouldChangeCharactersIn: replaceString :) работал для меня в Xcode 8, Swift 3, если вы хотите проверять каждое нажатие клавиши.

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

    // Whatever code you want to run here.
    // Keep in mind that the textfield hasn't yet been updated,
    // so use 'string' instead of 'textField.text' if you want to
    // access the string the textfield will have after a user presses a key

    var statusText = self.status.text
    var usernameText = self.username.text

    switch textField{
    case self.status:
        statusText = string
    case self.username:
        usernameText = string
    default:
        break
    }

    if statusText == "" && usernameText == "" {
        self.topRightButton.enabled = false
    } else {   
        self.topRightButton.enabled = true
    }

    //Return false if you don't want the textfield to be updated
    return true
}
5
radthemad4

Swift 4

Соответствует UITextFieldDelegate .

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    // figure out what the new string will be after the pending edit
    let updatedString = (textField.text as NSString?)?.replacingCharacters(in: range, with: string)

    // Do whatever you want here


    // Return true so that the change happens
    return true
}
5
drewster

Вы можете использовать этот метод делегата из UITextFieldDelegate. Он срабатывает при каждой смене персонажа.

(Objective C) textField:shouldChangeCharactersInRange:replacementString:
(Swift) textField(_:shouldChangeCharactersInRange:replacementString:)

Тем не менее, ЭТО ТОЛЬКО ОСТАЕТСЯПЕРЕДизменение сделано (действительно, изменение будет сделано только если вы вернете истину отсюда).

4
Abubakr Dar

Swift 4

textField.addTarget(self, action: #selector(textIsChanging), for: UIControlEvents.editingChanged)

@objc func textIsChanging(_ textField:UITextField) {

 print ("TextField is changing")

}

Если вы хотите внести изменение после того, как пользователь полностью ввел текст (оно будет вызвано, когда пользователь отклонит клавиатуру или нажмете клавишу ввода).

textField.addTarget(self, action: #selector(textDidChange), for: UIControlEvents.editingDidEnd)

 @objc func textDidChange(_ textField:UITextField) {

       print ("TextField did changed") 
 }
1
Anamika

Может быть, использовать RxSwift?

необходимость

pod 'RxSwift',    '~> 3.0'
pod 'RxCocoa',    '~> 3.0'

добавить импорт очевидно

import RxSwift
import RxCocoa

Итак, у вас есть textfield : UITextField

let observable: Observable<String?> = textField.rx.text.asObservable()
observable.subscribe(
            onNext: {(string: String?) in
                print(string!)
        })

У U есть 3 других метода.

  1. onError
  2. onCompleted
  3. onDisposed
  4. onNext
1
marlonpya

Вы должны следовать этим шагам:

  1. Сделать ссылку на аутлет на текстовое поле
  2. AssignUITextFieldDelegate для класса контроллера 
  3. Настройте yourTextField.delegate
  4. Реализовать любую функцию

Образец кода:

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet var yourTextFiled : UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()

        yourTextFiled.delegate = self
    }


    func textFieldDidEndEditing(_ textField: UITextField) {
        // your code
    }

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        // your code
    }

    .
    .
    .
}
1
M.Hazara
txf_Subject.addTarget(self, action:#selector(didChangeFirstText), for: .editingChanged)

@objc func didChangeText(textField:UITextField) {
    let str = textField.text
    if(str?.contains(" "))!{
        let newstr = str?.replacingOccurrences(of: " ", with: "")
        textField.text = newstr
    }
}

@objc func didChangeFirstText(textField:UITextField) {
    if(textField.text == " "){
        textField.text = ""
    }
}
1
Yogesh Tandel

Вот как вы можете добавить textField text change listener, используя Swift 3 :

Объявите свой класс как UITextFieldDelegate

override func viewDidLoad() {
    super.viewDidLoad()

    textField.delegate = self

    textField.addTarget(self, action: #selector(UITextFieldDelegate.textFieldShouldEndEditing(_:)), for: UIControlEvents.editingChanged)
}

Затем просто традиционно добавьте функцию textFieldShouldEndEditing:

func textFieldShouldEndEditing(_ textField: UITextField) -> Bool { // do stuff
        return true 
}
0
Satnam Sync