Делегат возвращает ноль при вызове метода из didSet - PullRequest
0 голосов
/ 05 июня 2018

У меня есть подкласс UITextField, используемый для вызова двух методов после определенных событий textField.TextField вызывает методы в суперклассе textField с настройкой делегата / протокола.

class SearchTermCellTextField: UITextField {

    var searchTermCellTextFieldDelegate: SearchTermCellTextFieldDelegate?

    override var text: String? {
        didSet {
            searchTermCellTextFieldDelegate?.textFieldDidChange(self)
        }
    }

    override func deleteBackward() {
        super.deleteBackward()
        searchTermCellTextFieldDelegate?.textFieldReceivedDelete(self)
    }

}

protocol SearchTermCellTextFieldDelegate {

    func textFieldReceivedDelete(_ textField: UITextField)

    func textFieldDidChange(_ textField: UITextField)

}

Делегат инициализируется правильно, и textFieldReceivedDelete() вызывается без проблем.Однако каждый раз, когда вызывается textFieldDidChange()var text { didSet }), searchTermCellTextFieldDelegate имеет значение nil.

Я попытался поместить searchTermCellTextFieldDelegate?.textFieldDidChange() во вторичный метод, вызываемый didSet, чтобы увидеть, будет ли он иметьлюбой эффект, но все тот же.Я проверил его изнутри deleteBackward() - там, где он мне не нужен - и searchTermCellTextFieldDelegate? имеет ненулевое значение, как и ожидалось, и работает нормально.

Мое единственное предположение, что происходит нечто более сложноев текстовой переменной { get set }, которая вызывает проблему, но кроме этого я не знаю, с чего начать решение проблемы.

У кого-нибудь есть понимание?Заранее спасибо.

1 Ответ

0 голосов
/ 05 июня 2018

Причина - вы переопределили текст A textField, но функция textFieldDidChange, которую ОП хочет вызвать, основана на редактировании измененного управляющего события, таким образом, переопределение text в вашем случае не требовалось, так как текст не будет срабатывать при его значенииизменено или отредактировано

Итак, чтобы этот делегат класса работал, вам действительно нужно следить за редактированием элемента управления изменениями Event of TextField

Попробуйте это

import Foundation
import UIKit


class SearchTermCellTextField: UITextField {

    var TFDelegate : SearchTermCellTextFieldDelegate?

    /// Initialise class
    override init(frame: CGRect) {
        super.init(frame: frame)
        /// Need to add a target to notify class that text did changed
        self.addTarget(self, action: #selector(SearchTermCellTextField.editingChanged), for: .editingChanged)
    }

    /// Coder
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    /// You override Text Not its editing changed
    override var text: String? {
        didSet {
            TFDelegate?.textFieldDidChange(self)
        }
    }

    /// Handler which tells that editing has been changed
    @objc func editingChanged(){
        TFDelegate?.textFieldDidChange(self)
    }

    /// Its Working
    override func deleteBackward() {
        super.deleteBackward()
        TFDelegate?.textFieldReceivedDelete(self)
    }

}

protocol SearchTermCellTextFieldDelegate {

    func textFieldReceivedDelete(_ textField: UITextField)

    func textFieldDidChange(_ textField: UITextField)

}

Класс ViewController

import UIKit

class ViewController: UIViewController {
    private var myFirstTF : SearchTermCellTextField?
}

/// View Life cycles
extension ViewController
{
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        myFirstTF = SearchTermCellTextField()
        myFirstTF?.TFDelegate = self
        myFirstTF?.placeholder = "Enter Text"

        myFirstTF?.translatesAutoresizingMaskIntoConstraints = false
        self.view.addSubview(myFirstTF!)
        myFirstTF?.leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: 20).isActive=true
        myFirstTF?.trailingAnchor.constraint(equalTo: self.view.trailingAnchor, constant: 20).isActive=true
        myFirstTF?.topAnchor.constraint(equalTo: self.view.topAnchor, constant: 100).isActive=true
        myFirstTF?.heightAnchor.constraint(equalToConstant: 50)

    }
}

extension ViewController: SearchTermCellTextFieldDelegate
{    
    func textFieldReceivedDelete(_ textField: UITextField) {
        print("delete Recieved")
    }

    func textFieldDidChange(_ textField: UITextField) {
        print("Text:\(textField.text ?? "Empty")")
    }
}

Консольный вывод

enter image description here

...