gpt4 book ai didi

ios - 快速线程1 : Fatal error: init(coder:) has not been implemented (Calling super solution doesn't work)

转载 作者:行者123 更新时间:2023-12-01 18:05:08 27 4
gpt4 key购买 nike

嘿伙计们,我已经四处寻找,但仍然找不到解决我的问题的方法。我这里有一个自定义类:

import UIKit

/**
DatasourceController is simply a UICollectionViewController that
allows you to quickly create list views.

In order to render our items in your list, simply provide it with a
Datasource object.
*/
open class DatasourceController: UICollectionViewController,
UICollectionViewDelegateFlowLayout {

open let activityIndicatorView: UIActivityIndicatorView = {
let aiv = UIActivityIndicatorView(activityIndicatorStyle: .whiteLarge)
aiv.hidesWhenStopped = true
aiv.color = .black
return aiv
}()

open var datasource: Datasource? {
didSet {
if let cellClasses = datasource?.cellClasses() {
for cellClass in cellClasses {
collectionView?.register(cellClass, forCellWithReuseIdentifier: NSStringFromClass(cellClass))
}
}

if let headerClasses = datasource?.headerClasses() {
for headerClass in headerClasses {
collectionView?.register(headerClass, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: NSStringFromClass(headerClass))
}
}

if let footerClasses = datasource?.footerClasses() {
for footerClass in footerClasses {
collectionView?.register(footerClass, forSupplementaryViewOfKind: UICollectionElementKindSectionFooter, withReuseIdentifier: NSStringFromClass(footerClass))
}
}

collectionView?.reloadData()
}
}

public init() {
super.init(collectionViewLayout: UICollectionViewFlowLayout())
}

required public init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

let defaultCellId = "lbta_defaultCellId"
let defaultFooterId = "lbta_defaultFooterId"
let defaultHeaderId = "lbta_defaultHeaderId"

override open func viewDidLoad() {
super.viewDidLoad()
collectionView?.backgroundColor = .white
collectionView?.alwaysBounceVertical = true

view.addSubview(activityIndicatorView)
activityIndicatorView.anchorCenterXToSuperview()
activityIndicatorView.anchorCenterYToSuperview()

collectionView?.register(DefaultCell.self, forCellWithReuseIdentifier: defaultCellId)
collectionView?.register(DefaultHeader.self, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: defaultHeaderId)
collectionView?.register(DefaultFooter.self, forSupplementaryViewOfKind: UICollectionElementKindSectionFooter, withReuseIdentifier: defaultFooterId)
}

override open func numberOfSections(in collectionView: UICollectionView) -> Int {
return datasource?.numberOfSections() ?? 0
}

override open func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return datasource?.numberOfItems(section) ?? 0
}

//need to override this otherwise size doesn't get called
open func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return CGSize(width: view.frame.width, height: 50)
}

override open func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

let cell: DatasourceCell

if let cls = datasource?.cellClass(indexPath) {
cell = collectionView.dequeueReusableCell(withReuseIdentifier: NSStringFromClass(cls), for: indexPath) as! DatasourceCell
} else if let cellClasses = datasource?.cellClasses(), cellClasses.count > indexPath.section {
let cls = cellClasses[indexPath.section]
cell = collectionView.dequeueReusableCell(withReuseIdentifier: NSStringFromClass(cls), for: indexPath) as! DatasourceCell
} else if let cls = datasource?.cellClasses().first {
cell = collectionView.dequeueReusableCell(withReuseIdentifier: NSStringFromClass(cls), for: indexPath) as! DatasourceCell
} else {
cell = collectionView.dequeueReusableCell(withReuseIdentifier: defaultCellId, for: indexPath) as! DatasourceCell
}

cell.controller = self
cell.datasourceItem = datasource?.item(indexPath)
return cell
}

override open func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {

let reusableView: DatasourceCell

if kind == UICollectionElementKindSectionHeader {
if let classes = datasource?.headerClasses(), classes.count > indexPath.section {
reusableView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: NSStringFromClass(classes[indexPath.section]), for: indexPath) as! DatasourceCell
} else if let cls = datasource?.headerClasses()?.first {
reusableView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: NSStringFromClass(cls), for: indexPath) as! DatasourceCell
} else {
reusableView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: defaultHeaderId, for: indexPath) as! DatasourceCell
}
reusableView.datasourceItem = datasource?.headerItem(indexPath.section)

} else {
if let classes = datasource?.footerClasses(), classes.count > indexPath.section {
reusableView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: NSStringFromClass(classes[indexPath.section]), for: indexPath) as! DatasourceCell
} else if let cls = datasource?.footerClasses()?.first {
reusableView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: NSStringFromClass(cls), for: indexPath) as! DatasourceCell
} else {
reusableView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: defaultFooterId, for: indexPath) as! DatasourceCell
}
reusableView.datasourceItem = datasource?.footerItem(indexPath.section)
}

reusableView.controller = self

return reusableView
}

open func getRefreshControl() -> UIRefreshControl {
let rc = UIRefreshControl()
rc.addTarget(self, action: #selector(handleRefresh), for: .valueChanged)
return rc
}

@objc open func handleRefresh() {

}

open var layout: UICollectionViewFlowLayout? {
get {
return collectionViewLayout as? UICollectionViewFlowLayout
}
}

}

这是我的 Storyboard中 UICollectionView Controller 的父类。我在这里为它创建了一个 Controller 类:

import LBTAComponents

class homeView: DatasourceController {

override func viewDidLoad() {
super.viewDidLoad()
}

required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

}

问题我得到线程 1: fatal error :运行此代码时尚未实现 init(coder:) 我已经尝试过解决方案:

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

这不起作用。还有其他建议吗?如果您想亲自看看,我从 cocoapod 库中获取了这个框架:

pod“LBTAComponents”

我怀疑这个问题与 Collection View 和 Storyboard有关,但我无法弄清楚。

最佳答案

每当 ViewController 初始化 Storyboard/XIB 时,它都会通过 init(coder: )

您的基类DatasourceController覆盖初始化程序

public init() {
super.init(collectionViewLayout: UICollectionViewFlowLayout())
}

required public init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

因此,当您在 HomeController 中调用 super.init(coder:...) 时,它实际上会调用 fatalError("init(coder:) has not be Implemented") 似乎是谁写的类,不是一个伟大的 Storyboard/xib 爱好者。

您可以删除DatasourceController中的两个初始化程序,但请确保在 Storyboard中设置流布局。或者你可以将它们更改为调用 super。

如果您无法更改基类,则无法从 Storyboard 加载 VC。

关于ios - 快速线程1 : Fatal error: init(coder:) has not been implemented (Calling super solution doesn't work),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48192909/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com