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

时间:2017-04-05 09:23:13

标签: 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
}

并配置单元格

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
}

我想将Rx用于用户输入而不是委托模式,如以下行

所示
  

txt.delegate = self

以下是我的屏幕图像

enter image description here

1 个答案:

答案 0 :(得分:6)

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

import RxSwift

class YourCustomCell: UITableViewCell {

   var disposeBag = DisposeBag()

   @IBOutlet weak var textfield: UITextField!

    override func prepareForReuse() {
        super.prepareForReuse()

        disposeBag = DisposeBag()
    }
}

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

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)
    }