2015-02-08 3 views
141

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

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

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

ответ

393

СВИФТ

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

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

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

СВИФТ 2,2

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

и

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

СВИФТ 3

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

и

func textFieldDidChange(_ textField: UITextField) { 

} 

Свифта 4

@objc func textFieldDidChange(_ textField: UITextField) { 

} 

Objective-C

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

и textFieldDidChange метод

-(void)textFieldDidChange :(UITextField *) textField{ 
    //your code 
} 
+0

Вы добавили цель? –

+0

Нет, я этого не сделал, хотя сейчас я его сортирую, спасибо за помощь! –

+0

Это сбой для меня, и я не понимаю, почему. –

4

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

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

Однако ЭТО ТОЛЬКО ПОЖАРЫ ПЕРЕД производится изменение (на самом деле, изменение делается только если вы возвращаете истину здесь).

+1

Как это следует писать, так как я также пробовал этот метод и пришел к тому же решению, где он изменяется только после активации текстового поля, а не после изменения текста? –

+0

Когда вы реализуете вышеупомянутый метод делегата, он запускается каждый раз, когда вы меняете текст. Вам нужно только добавить этот код, self.textfield.delegate = self –

+0

Для меня этот метод не работал, потому что вы не могли проверить, было ли текстовое поле пустым внутри метода. Прежде всего потому, что он возвращает true/false в зависимости от IF, текстовое поле может измениться. Таким образом, событие срабатывает до того, как текстовое поле имеет шанс стать пустым. –

10

Как я уже обращался с этим до сих пор: в 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 
} 
+0

Это сработало для меня, спасибо! – Fengson

73

Вы можете сделать это соединение в Interface Builder.

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

  2. Ctrl + Нажмите на текстовое поле в построителе интерфейса.

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

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

+2

Это отличное решение, особенно если вы работаете с UITextField в tableViewCell, которым управляет отдельный источник данных. Такой подход позволяет viewController напрямую реагировать (таким образом, источник данных не должен отвечать и делегировать действие). – wuf810

+0

Отлично - простое решение проблемы раздражения. Вы можете, конечно, связать несколько текстовых полей –

+0

Отличное решение даже с Xcode 9 –

15

Swift 3

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

Это, как вы можете добавить 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 
} 
4

textField(_:shouldChangeCharactersIn:replacementString:) работал для меня в 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 
} 
29

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) { 

} 
5

Swift 3.0.1+ (Некоторые из других быстрых ответов 3.0 не в курсе)

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

func textFieldDidChange(_ textField: UITextField) { 

} 
1

Может использовать 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

быстры 4

В viewDidLoad():

//ADD BUTTON TO DISMISS KEYBOARD 

    // Init a keyboard toolbar 
    let toolbar = UIView(frame: CGRect(x: 0, y: view.frame.size.height+44, width: view.frame.size.width, height: 44)) 
    toolbar.backgroundColor = UIColor.clear 

    // Add done button 
    let doneButt = UIButton(frame: CGRect(x: toolbar.frame.size.width - 60, y: 0, width: 44, height: 44)) 
    doneButt.setTitle("Done", for: .normal) 
    doneButt.setTitleColor(MAIN_COLOR, for: .normal) 
    doneButt.titleLabel?.font = UIFont(name: "Titillium-Semibold", size: 13) 
    doneButt.addTarget(self, action: #selector(dismissKeyboard), for: .touchUpInside) 
    toolbar.addSubview(doneButt) 

    USDTextField.inputAccessoryView = toolbar 

Добавьте эту функцию:

@objc func dismissKeyboard() { 
     //Causes the view (or one of its embedded text fields) to resign the first responder status. 
     view.endEditing(true) 
    } 
1

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 
} 
Смежные вопросы