20

With Swift 4.2, getting following error, that was working fine with Swift 4.

Type 'NSNotification.Name' has no member 'UITextField'

Here is my error code.

NotificationCenter.default.addObserver(forName: NSNotification.Name.UITextField.textDidChangeNotification, object: textField, queue: OperationQueue.main) { (notification) in
            loginAction.isEnabled = textField.text != ""
        }

Full Code:

@IBAction func alertWithLogin(){

    let alertController = UIAlertController(title: "Please Enter Credential", message: nil, preferredStyle: .alert)

    // ADD ACTIONS HANDLER
    let loginAction = UIAlertAction(title: "Login", style: .default) { (_) in

        let loginTextField = alertController.textFields![0] as UITextField
        let passwordTextField = alertController.textFields![1] as UITextField

        // do something with after login
    }
    loginAction.isEnabled = false
    alertController.addAction(loginAction)

    let cancelAction = UIAlertAction(title: "Cancel", style: .cancel) { (_) in
        // do something
    }
    alertController.addAction(cancelAction)

    // ADD TEXT FIELDS
    alertController.addTextField { (textField) in
        textField.placeholder = "Email"
    }
    alertController.addTextField { (textField) in
        textField.placeholder = "Password"
        textField.isSecureTextEntry = true

        // enable login button when password is entered
        NotificationCenter.default.addObserver(forName: NSNotification.Name.UITextField.textDidChangeNotification, object: textField, queue: OperationQueue.main) { (notification) in
            loginAction.isEnabled = textField.text != ""
        }
    }

    // PRESENT
    present(alertController, animated: true)
}

enter image description here

Krunal
  • 77,632
  • 48
  • 245
  • 261

3 Answers3

53

textDidChangeNotification is a member of UITextField (and UITextView).

NotificationCenter.default.addObserver(
    self,
    selector: #selector(self.keyboardDidShow(notification:)),
    name: UITextField.textDidChangeNotification,
    object: nil)
rmaddy
  • 314,917
  • 42
  • 532
  • 579
6

I faced the same problem,

Here is the simplest solution:

Instead of using forName: NSNotification.Name.UITextField.textDidChangeNotification

Use like this in forName: Parameter:

NotificationCenter.default.addObserver(forName: UITextField.textDidChangeNotification, object: textField, queue: OperationQueue.main) { (notification) in
//Your code goes here...
        }
iHarshil
  • 739
  • 10
  • 22
1
        NotificationCenter.default.addObserver(forName: Notification.Name.UITextFieldTextDidChange, object: textField, queue: OperationQueue.main) { (notification) in
            //...
    }

In swift sdk, All notification name should be the extension of struct: Notification.Name

So when use Notification.Name, you should ignore Class name(exc.UITextField), input "Notification.Name." then input some of your name(like "TextF") and use esc to show autocomplete

Sven Shao
  • 45
  • 4
  • 1
    There is no such thing as `Notification.Name.UITextFieldTextDidChange` (at least as of Swift 4.2). Most notifications are *not* under `Notification.Name` (again, at least as of Swift 4.2). – rmaddy Jan 06 '19 at 17:56