TableViewCells изменяется при прокрутке Rxwift - PullRequest
0 голосов
/ 08 апреля 2020

моя ячейка просмотра таблицы при прокрутке вниз. Я использую rxswift, чтобы связать табличное представление с наблюдаемыми. Как я могу гарантировать, что ячейки имеют реальные значения и не изменяются при прокрутке?

Вот мой код: let observableItems = viewModel.getShoppingList (). AsObservable ()

    observableItems.bind(to: tableViewShoppingList.rx.items(cellIdentifier: "shoppingListCell", cellType: ShoppingListTableViewCell.self)) { (row, element, cell) in
        print(row)
        cell.nameTextField.text = element.title


        cell.amountLabel.isHidden = true

        //Check if Amount is nil
        if element.amount == "" {
            cell.amountTextField.placeholder == "Menge"
        } else {
            cell.amountTextField.text = element.amount
        }

        //Amount TextField
        cell.amountTextField
                       .rx
                       .controlEvent([.editingDidEnd])
                       .withLatestFrom(cell.amountTextField.rx.text)
                       .subscribe(onNext: {[weak self] (text) in
                           if text == "" {
                               //DO NOTHING
                           } else {
                               guard let text = text else { return }
                               let data = ShoppingListData(_id: element.id, title: element.title, amount: text, status: element.status, position: element.position)
                               self?.viewModel.updateShoppingListItem(data: data)
                           }
                       })
                           .addDisposableTo(cell.bag)

        //Check Status
        if element.status == true {
            cell.checkMarcButton.isSelected = true
        } else {
            cell.checkMarcButton.isSelected = false
        }

        //Checkmarc Button
        cell.checkMarcButton.rx.tap.asDriver()
            .drive(onNext: { [weak self] in
                if cell.checkMarcButton.isSelected {
                    cell.checkMarcButton.isSelected = false
                    let data = ShoppingListData(_id: element.id, title: element.title, amount: element.amount, status: false, position: element.position)
                    self?.viewModel.updateShoppingListItem(data: data)
                } else {
                    cell.checkMarcButton.isSelected = true
                    let data = ShoppingListData(_id: element.id, title: element.title, amount: element.amount, status: true, position: element.position)
                    self?.viewModel.updateShoppingListItem(data: data)
                }
            }).disposed(by: cell.bag)


    //TableView Style
    cell.selectionStyle = UITableViewCell.SelectionStyle.none
    }.addDisposableTo(disposeBag)

1 Ответ

0 голосов
/ 15 апреля 2020

Я думаю, что проблема возникает с вашим cell.bag, потому что UITableViewCell можно использовать повторно, поэтому код этой части будет реализован много раз

//Amount TextField
        cell.amountTextField
                       .rx
                       .controlEvent([.editingDidEnd])
                       .withLatestFrom(cell.amountTextField.rx.text)
                       .subscribe(onNext: {[weak self] (text) in
                           if text == "" {
                               //DO NOTHING
                           } else {
                               guard let text = text else { return }
                               let data = ShoppingListData(_id: element.id, title: element.title, amount: text, status: element.status, position: element.position)
                               self?.viewModel.updateShoppingListItem(data: data)
                           }
                       })
                           .addDisposableTo(cell.bag)

В этом случае вы должны позволить ваш cell.bag должен быть var, и каждый раз, когда вы устанавливаете значение, инициализируйте bag.

Я предлагаю вам добавить одну строку в закрытие

cell.bag = DisposeBag()

, и все будет в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...