swift - 我在 CollectionViewCell 中的回调无法正常工作

标签 swift callback closures tableview

我有一个简单的 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,但我无法将我的电话号码从单元格获取到 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 得到的内容时,我得到了 nil

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

我做错了什么???

最佳答案

您需要为文本字段设置委托(delegate),否则文本字段委托(delegate)将不起作用。

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

旁注: 不要将变量和常量大写。

编辑第二个问题: 您想要(通过 Xib)创建一个在值更改时调用的 IBAction 导出,或者:

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

每次键入或删除字母时,这两个选项都会调用委托(delegate)函数。

关于swift - 我在 CollectionViewCell 中的回调无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60183739/

相关文章:

swift - 如何将 UIActivityIndi​​catorView 添加到 UICollectionView 的页脚?

swift - 为什么导航 Controller 不使用 Swift 在回调中导航?

javascript - DOM 事件在事件队列中的优先级

scala - 最终在 Specs2 上尝试编写带有闭包的测试失败

ios - 如何在 Swift 中创建闭包从字符串中提取两个整数以执行计算

ios - UIWindow子类: Touches event not get fired

swift - 以某种方式将自定义 .colorNames 添加到 UIColor 中?

ios - 尽管使用较弱的委托(delegate)保留圈

javascript - 为什么在 jQuery 回调中检查变量是否存在会导致硬异常?

Groovy - 闭包与方法 - 区别