自定义委托以使用来自 UIView 的 pushViewController class

Custom delegate to use pushViewController from UIView class

我正在尝试从 UIView class 中使用 pushViewController,因此使用了自定义委托来使用 pushViewController。以下是错误:

Cannot invoke initializer for type 'HomeCategCollectionView' with no arguments

代码如下:

// ViewController

override func viewDidLoad() {
    super.viewDidLoad()

    let viewHomeCategories = HomeCategCollectionView() // here error comes
    viewHomeCateg.delegate = self
}

// UIView class

private func showCategDetails(indexPath: IndexPath) {
    delegate?.pushToListingButton()

}

更新:HomeCategCollectionView

class HomeCategCollectionViewModel {
var categViewVMs: [HomeCategCellViewModel]?

init(categModels: [GVMHomeCateg]?) {
    self.categViewVMs = categModels?.map({
        HomeCategCellViewModel(categ: [=13=])
    })
}
}

protocol ListingDelegate : class {
    func pushToListingButton()
}


class HomeCategCollectionView: UIView {

// MARK: Initialization and view setup

init(categViewModel: HomeCategCollectionViewModel?) {
    self.viewModel = categViewModel
    super.init(frame: .zero)
    setup()
}

required init?(coder: NSCoder) {
    super.init(coder: coder)
    setup()
}
}

请指导。希望我把我的问题说清楚了,如果没有,请随时提问。 谢谢

您需要使用所有必需参数初始化 HomeCategCollectionView,因此在本例中为 categViewModelcoder。以下将起作用。

let viewHomeCategories = HomeCategCollectionView(categViewModel: nil)

当然理想情况下你不传递 nil 而是应该使用的视图模型实例。

HomeCategCollectionView 的初始化程序是 init(categViewModel: HomeCategCollectionViewModel?) 因此您需要使用所有参数调用它:

// ViewController
override func viewDidLoad() {
    super.viewDidLoad()

    let data: [GVMHomeCateg] = // Your data
    let viewModel = HomeCategCollectionViewModel(categModels: data)
    let viewHomeCategories = HomeCategCollectionView(categViewModel: viewModel)
    viewHomeCateg.delegate = self
}

或者

override func viewDidLoad() {
    super.viewDidLoad()

    let viewHomeCategories = HomeCategCollectionView(categViewModel: nil)
    viewHomeCateg.delegate = self
}