мой обратный вызов в CollectionViewCell не работает правильно - PullRequest
0 голосов
/ 12 февраля 2020

У меня есть простой CollectionViewCell с PhoneNumberTextField и обратный вызов, который я хочу отправить на мой сервер

class PhoneNumberCollectionViewCell: UICollectionViewCell, NiBLoadable, UITextFieldDelegate {



@IBOutlet weak var phoneLabel: UILabel!
@IBOutlet weak var PhoneNumberTextField: UITextField!
@IBOutlet weak var SecurityLabel: UILabel!

var returnValue: ((_ value: String) -> ())?

override func awakeFromNib() {
    super.awakeFromNib()
    Decorator.decorate(self)

}

func setPhoneLabelText(text: String) {
    phoneLabel.text = text
}

func setSecurityLabel(text: String) {
    SecurityLabel.text = text
}

func textFieldDidEndEditing(_ textField: UITextField) {
    returnValue?(PhoneNumberTextField.text ?? "") // Use callback to return data
}

}

, и у меня также есть мой ViewController с моим CollectionView, и я не могу получить свой phoneNumber из ячейки в переменную в ViewController. Вот код

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let models = model[indexPath.row]

    switch models {
    case .phoneNumber:
        if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: PhoneNumberCollectionViewCell.name, for: indexPath) as? PhoneNumberCollectionViewCell {

            cell.setSecurityLabel(text: "_ALLYOURDATAISINSECUREDAREA")
            cell.setPhoneLabelText(text: "_YOURPHONENUMBER")
            cell.PhoneNumberTextField.text = phoneNumber

            cell.returnValue = { value in
                self.phoneNumber = value
            }
            return cell
        }

, и когда я печатаю то, что получил от textField, я получаю ноль

   @objc func sendPhoneNumber() {     
    print("PHONE NUMBER IS - \(String(describing: self.phoneNumber))")
}

что я не так делать ???

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

Вам необходимо установить делегат для textField, или делегаты textField не будут работать.

override func awakeFromNib() {
    super.awakeFromNib()
    Decorator.decorate(self)
    PhoneNumberTextField.delegate = self
}

Примечание: не используйте заглавные буквы для переменных и констант.

Изменить на дополнительный вопрос : Вы либо хотите (через Xib) создать IBAction выход, который вызывается при изменении значения, либо:

textField.addTarget(self, action: #selector(textFieldValueChanged), for: .editingChanged)

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

0 голосов
/ 12 февраля 2020

Вы зарегистрировали свою ячейку представления коллекции и объявили делегат и источник данных?

 let flowLayout = UICollectionViewFlowLayout()

 let collectionView = UICollectionView(frame: .zero, collectionViewLayout: flowLayout)
 collectionView(PhoneNumberCollectionViewCell.self, forCellWithReuseIdentifier: PhoneNumberCollectionViewCell.name)
 collectionView.delegate = self
 collectionView.dataSource = self

 return collectionView
...