我有一个包含表单的表格视图,因此有文本字段的集合。 我正在使用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)
}
}
答案 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)
}
这是一个有趣的问题,我会考虑一下。