提问者:小点点

从UIView类使用pushViewController的自定义委托


我试图从UIView类中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: $0)
    })
}
}

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()
}
}

请引导。 希望我把我的问题说清楚了,如果不是可以随便问。 谢谢


共2个答案

匿名用户

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
}

匿名用户

您需要用所有必需的参数初始化HomeCategCollectionView,因此在本例中为CategViewModelCoder。 下面的方法可以奏效。

let viewHomeCategories = HomeCategCollectionView(categViewModel: nil)

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