A UITextField
является элементом input .Вам не нужно двухстороннее связывание с ним, потому что вы не должны динамически изменять его.Самое большее, что вы должны сделать, - это инициализировать его, и вам не нужна привязка для этого.
Вы не упоминаете, каким будет конечный результат для этого ввода, поэтому ответ может отличаться от приведенного ниже.Это конкретное решение предполагает, что вам нужно отправить все ответы в виде группы на сервер или в базу данных.Может быть, когда нажата кнопка.
Ниже приведено много кода, но он компилируется в том виде, в каком он есть (с соответствующим импортом.) Вы можете подписаться на ListViewModel.answers
, чтобы увидеть все ответы, собранные вместе.
class ViewController: UIViewController {
@IBOutlet weak var myTableView: UITableView!
let bag = DisposeBag()
override func viewDidLoad() {
super.viewDidLoad()
let answersSubject = PublishSubject<(PaletteID, String)>()
let viewModel = ListViewModel(answersIn: answersSubject.asObservable())
viewModel.paletteViewModels
.bind(to: myTableView.rx.items(cellIdentifier: "Cell", cellType: MyCell.self)) { index, element, cell in
cell.answerTextField.text = element.initialAnswer
cell.answerTextField.rx.text.orEmpty
.map { (element.id, $0) }
.bind(to: answersSubject)
.disposed(by: cell.bag)
}
.disposed(by: bag)
}
}
class MyCell: UITableViewCell {
@IBOutlet weak var answerTextField: UITextField!
let bag = DisposeBag()
}
struct ListViewModel {
let paletteViewModels: Observable<[PaletteViewModel]>
let answers: Observable<[PaletteID: String]>
init(answersIn: Observable<(PaletteID, String)>) {
paletteViewModels = Observable.just([])
answers = answersIn
.scan(into: [PaletteID: String]()) { current, new in
current[new.0] = new.1
}
}
}
struct PaletteViewModel {
let id: PaletteID
let initialAnswer: String
}
struct PaletteID: RawRepresentable, Hashable {
let rawValue: String
}