Swift 我在CollectionViewCell中的回调不';我不能正常工作

Swift 我在CollectionViewCell中的回调不';我不能正常工作,swift,callback,closures,tableview,Swift,Callback,Closures,Tableview,我有一个简单的CollectionViewCell,其中包含PhoneNumberTextField和一个我想发送到服务器的回调 class PhoneNumberCollectionViewCell: UICollectionViewCell, NiBLoadable, UITextFieldDelegate { @IBOutlet weak var phoneLabel: UILabel! @IBOutlet weak var PhoneNumberTextField: UITextF

我有一个简单的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
}
}

我的CollectionView中还有我的ViewController,我无法在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))")
}

我在做什么?

是否已注册集合视图单元格并声明委托和数据源

 let flowLayout = UICollectionViewFlowLayout()

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

 return collectionView

您需要为textField设置代理,否则textField代理将无法工作

override func awakeFromNib() {
    super.awakeFromNib()
    Decorator.decorate(self)
    PhoneNumberTextField.delegate = self
}
旁注: 不要将变量和常量大写

编辑到第二个问题: 您可以(通过Xib)在值更改时调用
iAction
出口,或者:

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

这两个选项都将在每次键入或删除信件时调用委托函数。

您是否设置了
textfield
委托?它与collectionView
数据源
无关,textfield委托应在
UICollectionViewCell
中设置谢谢!但现在我有另一个问题。我应该经常点击来调用函数textfielddidediting!我有没有其他没有点击的方法???)你是说你必须在
textfielddidediting
触发器之前更改目标?为你编辑答案。