Я научился использовать 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). Как это сделать?