带CollectionView/TableView输入/文本字段的RxSwift

Ars*_*sim 2 ios swift rx-swift

我正在尝试掌握RxSwift,我需要验证表单,我已经完成了没有tableView的简单验证,但现在我的文本输入字段在集合视图中,我想观察文本输入的变化,因为textfields现在在可重用的单元格中,我不知道如何添加observable并从中获取流

基本上我想要将我的数据双向绑定到我的表单,其中输入是动态的,如果这有帮助的话

这是我的cellForItemAt函数的代码

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: RegisterCell.identifier, for: indexPath) as! RegisterCell
    var registerField = dataSource[indexPath.item]
    registerField.indexPath = indexPath
    registerField.text = viewModel.getText(indexPath: indexPath)
    let txt = cell.txtfield as UITextField
    txt.delegate = self
    cell.configureCell(registerField)
    return cell
}
Run Code Online (Sandbox Code Playgroud)

并配置单元格

func configureCell(_ fieldData: RegisterFields) {
    txtfield.placeholder = fieldData.placeholderText
    txtfield.isSecureTextEntry = fieldData.isSecureEntry
    txtfield.text = fieldData.text
    txtfield.tag = fieldData.indexPath.item
    imgIcon.image  = fieldData.image
    imgDropDown.isHidden = !fieldData.isDropDown
}
Run Code Online (Sandbox Code Playgroud)

我想将Rx用于用户输入而不是代理模式,如下面的行所示

txt.delegate = self

以下是我的屏幕图像

在此输入图像描述

Ocu*_*dee 7

首先给你的自定义单元格它自己的处理袋用于dealloc目的

import RxSwift

class YourCustomCell: UITableViewCell {

   var disposeBag = DisposeBag()

   @IBOutlet weak var textfield: UITextField!

    override func prepareForReuse() {
        super.prepareForReuse()

        disposeBag = DisposeBag()
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在你的控制器中,听取文本字段输入流:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
      guard let cell = cell as? YourCustomCell, textfield = cell.textfield else { return }

      textfield
            .rx.textInput.text.orEmpty
            .asDriver()
            .drive(onNext: { [unowned self] text in
               //do what you want here
            })
            .addDisposableTo(cell.disposeBag)
    }
Run Code Online (Sandbox Code Playgroud)