Krunal
Krunal

Reputation: 79656

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

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

Upvotes: 20

Views: 15227

Answers (3)

iHarshil
iHarshil

Reputation: 779

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...
        }

Upvotes: 7

Sven Shao
Sven Shao

Reputation: 45

        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

Upvotes: 1

rmaddy
rmaddy

Reputation: 318814

textDidChangeNotification is a member of UITextField (and UITextView).

NotificationCenter.default.addObserver(
    self,
    selector: #selector(self.keyboardDidShow(notification:)),
    name: UITextField.textDidChangeNotification,
    object: nil)

Upvotes: 55

Related Questions