如何使用MVVM处理UITableViewCell中的UICollectionView

时间:2018-05-18 09:17:41

标签: ios swift uitableview mvvm uicollectionview

我正在开发一款具有以下View Hierarachy的应用程序:

ViewController - >包含UITableView - >包含CustomTableViewCell - >包含UICollectionView - >包含CustomCollectionViewCell

现在我已经创建了与ViewModel对应的ViewControllerViewModel包含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
            }
        }
    }
}

我想知道如何使用MVVM处理UICollectionView

  1. 我是否应该让主要ViewController代表& UITableView&的数据源UICollectionViews

  2. 我应该在哪里保留CustomCollectionViewCells的模型对象?在同一ViewModel或我应该制作另一个?

1 个答案:

答案 0 :(得分:2)

在这种情况下我能弄清楚如下,

您应该创建3个ViewModels

  1. ViewController
  2. 的ViewModel {li> CustomTableViewCellView 的CustomTableViewCellViewModel {li> 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
       }
    }