将RxSwift与包含texfields的Tableview一起使用可消除dataSource更新上的键盘

时间:2018-08-13 04:52:45

标签: ios swift keyboard tableview rx-swift

我有一个包含表单的表格视图,因此有文本字段的集合。 我正在使用RxSwift将数据与tableview绑定。当我尝试使用在文本字段中输入的数据更新dataSource时,整个表格视图将重新加载,问题出在哪里,而不是继续到下一个文本字段,键盘就关闭了。

任何建议都会有很大帮助。 这是示例代码

struct TableData {
  var name, value: String?
}

class TableRxViewController: UIViewController {

 var data: [TableData] = []
 let dataSource = BehaviorRelay<[TableData]>(value: [])
 var disposeBag = DisposeBag()

@IBOutlet weak var tableView: UITableView! {
    didSet {
        tableView.register(UINib(nibName: "RegisterCell", bundle: nil), 
        forCellReuseIdentifier: "RegisterCell")
        tableView.rowHeight = UITableViewAutomaticDimension
    }
}

override func viewDidLoad() {
    super.viewDidLoad()
    self.addTableData()
    self.dataSource.accept(self.data)
    self.rxTableView()
}

func addTableData() {
    data.append(TableData(name: "first", value: ""))
    data.append(TableData(name: "second", value: ""))
    data.append(TableData(name: "third", value: ""))
    data.append(TableData(name: "fourth", value: ""))
    data.append(TableData(name: "fifth", value: ""))
}



func rxTableView() {
    self.dataSource.asObservable()
        .bind(to: tableView.rx.items) {
            (tableView: UITableView, index: Int, element: TableData) in
            let cell = tableView.dequeueReusableCell(withIdentifier: 
            "RegisterCell") as! RegisterCell
            cell.loadCell(data: element)
            cell.textfield.rx
                .controlEvent([.editingDidEndOnExit, .editingDidEnd])
                .subscribe({ text in
                    var data = self.dataSource.value
                    data[index].value = cell.textfield.text ?? ""
                    self.dataSource.accept(data)
                })
                .disposed(by: cell.disposeBag)

            return cell
        }
        .disposed(by: self.disposeBag)
 }
}

1 个答案:

答案 0 :(得分:0)

我对这个答案不太满意,但这是我到目前为止提出的最好的答案:

override func viewDidLoad() {
    super.viewDidLoad()

    let textFields = [UITextField(), UITextField(), UITextField(), UITextField(), UITextField()]

    Observable.just(textFields).bind(to: tableView.rx.items(cellIdentifier: "MyCell")) { _, textField, cell in
        textField.frame = cell.contentView.bounds.insetBy(dx: 8, dy: 8) // size properly
        cell.contentView.addSubview(textField)
    }
    .disposed(by: bag)

    for fields in zip(textFields, textFields[1...]) {
        fields.0.rx.controlEvent(.editingDidEndOnExit)
            .subscribe(onNext: { fields.1.becomeFirstResponder() })
            .disposed(by: bag)
    }

    textFields.last!.rx.controlEvent(.editingDidEndOnExit)
        .map { textFields.map { $0.text ?? "" }}
        .subscribe(onNext: {
            print("input finished with values:", $0)
        })
        .disposed(by: bag)
}

这是一个有趣的问题,我会考虑一下。