Реализация шаблона проектирования MVVM - PullRequest
0 голосов
/ 14 апреля 2020

Я прошу реализацию MVVM Шаблон проектирования, поэтому здесь у меня есть HomeViewController

, который содержит HomeViewModel , HomeViewController имеет tableView и некоторые другие компоненты UIKit в MVVM Я прочитал, что у каждого UIView должен быть свой собственный ViewModel, поэтому для ячеек UITableView (HomeTableViewCell) каждый должен иметь свой собственный ViewModel, поэтому должен ли HomeViewModel содержать коллекцию SubViewModel для ячеек, которые будут переданы в каждую ячейку, или какова его правильная реализация, лучший сценарий?

extension HomeViewController : UITableViewDelegate , UITableViewDataSource{
    public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return viewModel?.articlesCount ?? 0
    }

    public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {


    }


}

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

я читал, что у каждого UIView должен быть свой собственный ViewModel

Вы правы, но помните, что все более и более глубоко наблюдать MVVM для всех UIKit компонентов может быть сложно и это получает много времени! поэтому я всегда советую учитывать ситуацию и сроки проекта.

также я предлагаю вам стиль кода . читайте о них, например, в ваших кодах заметили, что имя вашего класса начинается со строчной буквы myCell, что не часто встречается.


ответьте на ваш вопрос:

запомните это: UITableViewCell не должен быть доступен для модели.

Добавить новую модель представления для MyCell:

Это базовая c модель представления для обработки пользовательских таблиц ViewViewCell logi c и данных.

class MyCellViewModel {
    private let model: CellModel
    init(model: CellModel) {
        self.model = model
    }
}

// properties TableViewCell needs.
extension MyCellViewModel {
    var title: Any {
        return model.title
    }

    var someImage: Any {
        return model.image
    }
    // add variables or functions...

}

Обновление пользовательского UITableViewCell, MyCell:

добавление необязательной переменной для хранения viewModel, а при просмотре модели didSet - обновление представлений.

class myCell: UITableViewCell {
    var viewModel: MyCellViewModel? {
        didSet {
            guard let viewModel = viewModel else { return }

            // just an example
            titleLabel.text = viewModel.title
        }
    }
}

Добавление в просмотр модели HomeViewController:

Теперь нам нужно передать модель представления пользователя UITableViewCell из модели представления контроллера.

func viewModelForCell(atIIndexPath: IndexPath) -> MyCellViewModel {
        return MyCellViewModel(model: articles[indexPath.row])
}

Эта базовая c реализация предназначена только для показа MVVM концепция избегания представления для доступа к модели и обработки всех логических процедур в View Model, конечно. Вы можете улучшить ее и адаптировать ее к своим потребностям, счастливое кодирование!

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

Я думаю, что вы спрашиваете о модели клеток. Вы можете написать простую структуру для вашей модели ячейки.

struct CellModel {
   let data: Any
}

Тогда ваша модель контроллера может быть

let controllerData = [DataForCellModels]() 

в базовом c случае.

Тогда вы подкласс TableViewCell

class myCell: UITableViewCell {
    let model: CellModel {
       didSet {
           updateCell()
       }
    }
}

Чтобы затем управлять вашими ячейками, вам нужно реализовать ячейки по cellID.

Я надеюсь, что это может дать вам представление о том, как реализовать это, но для подробнее я рекомендую вам поискать полное руководство.

Желаем удачи в вашем проекте!

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