быстрое расширение UITextFieldDelegate - PullRequest
0 голосов
/ 10 марта 2019

Я довольно новичок в swift и не могу понять следующую ситуацию. Я пытаюсь расширить класс UIViewController с помощью нескольких функций UITextFieldDelegate ...

class ViewController: UIViewController{
    @IBOutlet weak var textField: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()
        textField.delegate = self

В другом файле, если я определяю функцию с распакованным параметром, функция не вызывается ...

extension UIViewController: UITextFieldDelegate{

    internal func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
        print("Text Field Should Begin Editing called")
        return true
    }

но если я разверну параметр, он будет работать.

    internal func textFieldShouldBeginEditing(_ textField: UITextField!) -> Bool 

Не могли бы вы помочь мне понять, почему? спасибо

swift 4.2

Ответы [ 2 ]

0 голосов
/ 10 марта 2019

В вашем файле расширения вы должны расширять ваш класс ViewController, а не класс UIViewController. Вам не нужна развернутая сила. Так должно выглядеть так:

extension UIViewController: UITextFieldDelegate{
    func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
         print("Should begin editing!")   
    }
}
0 голосов
/ 10 марта 2019

Поскольку Objective-C не дает никаких гарантий того, что объект не равен nil, Swift делает все классы в типах аргументов и возвращаемых типах необязательными в импортированных API Objective-C. Прежде чем использовать объект Objective C, убедитесь, что он не пропущен.

Если вы используете _ textField: UITextField, параметр может иметь значение NULL, следовательно, делегат не вызывает метод, так как ищет ненулевое значение в сигнатуре метода, т. Е. internal func textFieldShouldBeginEditing(_ textField: UITextField!) -> Bool

...