Как обрабатывать UICollectionView в UITableViewCell с MVVM - PullRequest
0 голосов
/ 18 мая 2018

Я работаю над приложением, которое имеет следующее представление иерархии:

ViewController -> содержит UITableView -> содержит CustomTableViewCell -> содержит UICollectionView -> содержит CustomCollectionViewCell

Теперь я создал ViewModel, соответствующий ViewController.ViewModel содержит объекты модели для CustomTableViewCells, т. Е. Количество CustomTableViewCells, которое нужно показать, и какое содержимое следует показывать в каждом CustomTableViewCell.

class ViewModel
{
    //MARK: Private Properties
    private var libraries = [Library](){
        didSet{
            self.reloadTableViewClosure?()
        }
    }

    //MARK: Internal Properties
    var reloadTableViewClosure: (()->())?
    var numberOfLibraries: Int{
        return self.libraries.count
    }

    //MARK: Internal Methods
    func getLibrary(at indexPath: IndexPath) -> Library
    {
        return self.libraries[indexPath.row]
    }

    //MARK: Initializer
    init()
    {
        self.fetchLibraryList()
    }

    //MARK: Private Methods
    private func fetchLibraryList()
    {
        if let path = Bundle.main.path(forResource: "LibraryList", ofType: "json")
        {
            if let libraryList = try? JSONDecoder().decode([Library].self, from: Data(contentsOf: URL(fileURLWithPath: path)))
            {
                self.libraries = libraryList
            }
        }
    }
}

Я хочу знать, как мне следует обращатьсяUICollectionView с MVVM?

  1. Должен ли я сделать основной ViewController делегатом и источником данных для обоих UITableView & UICollectionViews?

  2. Где мне хранить объекты модели для CustomCollectionViewCells?В том же ViewModel или я должен сделать другой?

1 Ответ

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

Что я могу выяснить в этой ситуации, как показано ниже,

Вы должны создать 3 ViewModels

  1. ViewModel для ViewController
  2. CustomTableViewCellViewModel для CustomTableViewCellView
  3. CustomCollectionViewCellViewModel для CustomCollectionViewCellView

А вот как ваш ViewModels долженвыглядит,

class ViewModel
{
    private var cellVMs = [CustomTableViewCellViewModel] = []

    var reloadTableViewClosure: (()->())?

    var numberOfLibraries: Int {
        return self.cellVMs.count
    }

    func getLibraryCellVM(at indexPath: IndexPath) -> CustomTableViewCellViewModel
    {
        return self.cellVMs[indexPath.row]
    }

    //MARK: Initializer
    init()
    {
        self.fetchLibraryList()
    }

    //MARK: Private Methods
    private func fetchLibraryList()
    {
        if let path = Bundle.main.path(forResource: "LibraryList", ofType: "json")
        {
            if let libraryList = try? JSONDecoder().decode([Library].self, from: Data(contentsOf: URL(fileURLWithPath: path)))
            {
                libraryList.forEach({
                    cellVMs.append(CustomTableViewCellViewModel(library: $0))
                })
                self.reloadTableViewClosure?()
            }
        }
    }
}

Ваш CustomTableViewCellViewModel будет выглядеть следующим образом,

class CustomTableViewCellViewModel {

        var booksVMs: [CustomCollectionViewCellViewModel] = []

        var library: Library!

        init(library: Library) {
            self.library = library

            // Initialize booksVMs
            library.books.forEach({
                booksVMs.append(CustomCollectionViewCellViewModel.init(book: $0))
            })
        }

        var numberOfBooks: Int {
            self.booksVMs.count
        }

        func bookViewModel(at indexPath: IndexPath) -> CustomCollectionViewCellViewModel {
            return self.booksVMs[indexPath.row]
        }
    }

и, наконец, CustomCollectionViewCellViewModel будет выглядеть следующим образом,

class CustomCollectionViewCellViewModel {

   var book: Book!

   init(book: Book) {
     self.book = book
   }

   var bookName: String? {
      return self.book.name
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...