2017-04-05 105 views
0

我想抓住RxSwift,我需要驗證窗體,我做了沒有tableView的簡單驗證,但現在我的文本輸入字段在集合視圖,我想觀察變化文本輸入,文本框現在在可重複使用的電池,我不知道如何從中添加觀測並獲得流RxSwift與CollectionView/TableView輸入/ textfields

基本上我想要2路我的數據我的形式,其中輸入是動態的結合,如果這能幫助

這裏是我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 =自

下面做是我的形象屏幕

enter image description here

+0

我已經添加了所有的細節瞭解的問題,請在投票前閱讀問題,謝謝 –

+0

您是否將表數據綁定到tableview或者您是否使用普通的tableview代表?或RxDataSource? –

+0

我使用普通的tableview代理,單元格中有一個文本框,我想在該文本框中監聽用戶輸入 –

回答

1

首先給你的自定義單元格它自己處置袋的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) 
    }