我正在开发一款具有以下View Hierarachy的应用程序:
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
}
}
}
}
我想知道如何使用MVVM处理UICollectionView
?
我是否应该让主要ViewController
代表& UITableView
&的数据源UICollectionViews
我应该在哪里保留CustomCollectionViewCells
的模型对象?在同一ViewModel
或我应该制作另一个?
答案 0 :(得分:2)
在这种情况下我能弄清楚如下,
您应该创建3个ViewModels
ViewController
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
}
}