Тип «NSNotification.Name» не имеет члена «UITextField» - PullRequest
0 голосов
/ 14 сентября 2018

С Swift 4.2, получая следующую ошибку, которая работала нормально с Swift 4.

Тип «NSNotification.Name» не имеет члена «UITextField»

Вот мой код ошибки.

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

Полный код:

@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

Ответы [ 4 ]

0 голосов
/ 27 июня 2019

Я столкнулся с той же проблемой,

Вот самое простое решение:

Вместо использования forName: NSNotification.Name.UITextField.textDidChangeNotification

Используйте вот так в forName: Параметр:

NotificationCenter.default.addObserver(forName: UITextField.textDidChangeNotification, object: textField, queue: OperationQueue.main) { (notification) in
//Your code goes here...
        }
0 голосов
/ 14 сентября 2018
        NotificationCenter.default.addObserver(forName: Notification.Name.UITextFieldTextDidChange, object: textField, queue: OperationQueue.main) { (notification) in
            //...
    }

В swift sdk, Все уведомления должны быть расширением struct: Notification.Name

Поэтому, когда вы используете Notification.Name, вы должны игнорировать имя класса (exc.UITextField) и вводить «Notification.Name». затем введите часть своего имени (например, «TextF») и используйте esc, чтобы показать автозаполнение

0 голосов
/ 15 октября 2018

При миграции на 4.2 -

NSNotification.Name.UITextFieldTextDidEndEditing

NSNotification.Name.UITextFieldTextDidBeginEditing

0 голосов
/ 14 сентября 2018

textDidChangeNotification является членом UITextFieldUITextView).

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