0

我正在学习使用 RxSwift 和 RxDataSource 将业务逻辑与视图控制器分离(使用 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 操作)。怎么做?

4

1 回答 1

1

首先,viewModel 应该只包含特定视图显示的数据。所以我不确定 viewModel 是否应该包含有关您的视图行为的信息(在这种情况下,这意味着您的单元格有一些操作)。也许我会将这个逻辑封装到模型本身。我猜你从 API 中得到类似isBankAccountDefault. 如果您没有直接从 API 获取此属性,并且您需要一些逻辑来确定它。您可以在模型中创建计算属性并将 * cellIsNotDefault * 逻辑放在那里。

但是如果你坚持要在 viewModel 中拥有它,你可以在 viewModel 中创建 Bool 属性isBankAccountDefault。然后,您将把逻辑 * cellIsNotDefault * 放到格式化程序中,即创建该 viewModel 并将isBankAccountDefault值相应地设置为 * cellIsNotDefault * 逻辑。

于 2018-05-04T12:33:26.163 回答