Как переместить логику для отображения UITableViewRowAction из метода делегата в View Model (архитектура MVVM) - PullRequest
0 голосов
/ 04 мая 2018

Я научился использовать RxSwift и RxDataSource для отделения бизнес-логики от View Controller (используя MVVM).

Предположим, я хочу создать табличное представление, как в приложении "Почта" в iOS, когда пользователь проводит пальцем влево, есть кнопка удаления и кнопка "Далее" .

В обычном MVC я должен реализовать метод делегата editActionsForRowAt.

public func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]?

        var swipeActions = [UITableViewRowAction]()
        let removeAction = UITableViewRowAction(style: .destructive, title: "Delete") { [weak self] (action, indexPath) in
            guard let strongSelf = self else { return }
            strongSelf.deleteBankAccountTrigger.onNext(indexPath)
            tableView.deleteRows(at: [indexPath], with: .fade)
        }
        swipeActions.append(removeAction)

        if *cellIsNotDefault* {
            let makeDefaultAction = UITableViewRowAction(style: .default, title: "Make Default") { [weak self] (action, indexPath) in
                guard let strongSelf = self else { return }
                strongSelf.makeBankAccountDefaultTrigger.onNext(indexPath)
            }

            makeDefaultAction.backgroundColor = UIColor.lightGray
            swipeActions.append(makeDefaultAction)
        }

        return swipeActions

Я не знаю, как переместить логику cellIsNotDefault из делегата во ViewModel. Потому что я думаю, что логика показать / скрыть кнопку SwipeAction должна быть во ViewModel.

Любые предложения приветствуются.

Спасибо.

Обновление:

Я пытался использовать RxDataSources, но до сих пор не понял, как настроить свое собственное движение. Для удаления, я могу использовать метод tableView.rx.itemDeleted, чтобы подписаться на него. Но если я хочу подписаться на пользовательское действие Swipe (например, мое действие Make Default). Как это сделать?

1 Ответ

0 голосов
/ 04 мая 2018

Прежде всего, viewModel должен содержать только данные, которые отображаются при конкретном просмотре. Поэтому я не уверен, должна ли viewModel содержать информацию о поведении вашего представления (в этом случае это означает, что в вашей ячейке есть какое-то действие). Может быть, я бы включил эту логику в саму модель. Я думаю, что вы получаете из API что-то вроде isBankAccountDefault. Если вы не получили этот атрибут напрямую из API и вам нужна логика для его определения. Вы можете создать вычисляемое свойство внутри вашей модели и поместить туда * cellIsNotDefault * logic.

Но если вы настаиваете на том, чтобы оно было в viewModel, вы можете создать свойство Bool isBankAccountDefault в viewModel. Затем вы поместите логику * cellIsNotDefault * в форматировщик, который создает эту viewModel, и установите значение isBankAccountDefault в соответствии с логикой * cellIsNotDefault *.

...