Swift - 创建没有 Storyboard initWithFrame 错误的 collectionView

Posted

技术标签:

【中文标题】Swift - 创建没有 Storyboard initWithFrame 错误的 collectionView【英文标题】:Swift - creating collectionView without Storyboard initWithFrame error 【发布时间】:2018-06-26 23:08:22 【问题描述】:

我正在创建一个没有情节提要的 collectionView - 从我的项目中删除它。

我在这里创建它,在 AppDelegate 中。我的页脚和页眉已正确出列,加载图像时显示的单元格为零,但我无法弄清楚该方法 initWithFrame 的调用位置!任何帮助表示赞赏。

不使用故事板

在应用代理内部调用

let window = UIWindow(frame: UIScreen.main.bounds)
let myTabBar = TabBarVC()
window.rootViewController = myTabBar
window.makeKeyAndVisible()
let homeVC = HomeVC(collectionViewLayout: UICollectionViewFlowLayout())
myTabBar.present(homeVC, animated: false)

这最终失败并出现以下错误:

2018-06-26 16:02:15.379473-0700 MMDH[62033:2946934] -[MMDH.HomeVC 
initWithFrame:]: unrecognized selector sent to instance 0x7fdcce82f400
2018-06-26 16:02:15.389976-0700 MMDH[62033:2946934] *** Terminating app due to 
uncaught exception 'NSInvalidArgumentException', reason: '-[MMDH.HomeVC 
initWithFrame:]: unrecognized selector sent to instance 0x7fdcce82f400

我的单元格、页脚、页眉都已出列。我不知道这是哪里出错了……下面是设置代码:

class HomeVC: UICollectionViewController, UICollectionViewDelegateFlowLayout, UIImagePickerControllerDelegate, UINavigationControllerDelegate 

var headerVC = HeaderView()
var footerVC = homeFooterView()

var photos = [Photo]()
var imageFetchOperationQueue = OperationQueue()
var infoOperationQueue = OperationQueue()

let width = UIScreen.main.bounds.width
let height = UIScreen.main.bounds.height
let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()

let cache = NSCache<NSString, UIImage>()

override func viewDidLoad() 
    super.viewDidLoad()

    layout.itemSize = CGSize(width: (width / 3), height: (width / 3))
    layout.sectionInset = UIEdgeInsets(top: 1, left: 1, bottom: 1, right: 1)
    layout.headerReferenceSize = CGSize(width: width, height: width / 2)
    layout.minimumInteritemSpacing = 1
    layout.minimumLineSpacing = 1

    if photos.count == 0 
        layout.footerReferenceSize = CGSize(width: width, height: width)
     else if photos.count < 9 
        layout.footerReferenceSize = CGSize(width: 0, height: 0)
     else 
        layout.footerReferenceSize = CGSize(width: 0, height: 0)
    
    collectionView!.collectionViewLayout = layout

    collectionView = UICollectionView(frame: self.view.frame, collectionViewLayout: layout)
    collectionView?.dataSource = self
    collectionView?.delegate = self

    collectionView?.register(HomeVC.self, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "homeVC")
    self.view.addSubview(headerVC)
    collectionView?.register(homeFooterView.self, forSupplementaryViewOfKind: UICollectionElementKindSectionFooter, withReuseIdentifier: "footerVC")
    self.view.addSubview(footerVC)
    collectionView?.register(HomePicCell.self, forCellWithReuseIdentifier: "Cell")




【问题讨论】:

【参考方案1】:

您的 viewDidLoad 方法存在一些问题。

    您的主要问题是将HomeVC 类注册为标题视图类型。你想使用HeaderView.self,而不是HomeVC.self。 不要将布局基于屏幕尺寸。您的收藏视图可能不会占据整个屏幕。布局基于集合视图的大小。另请注意,大小可能会发生变化。最好在viewWillTransition 方法中更新布局。 这是一个 UICollectionViewController。您不应该创建自己的UICollectionView。它会在调用viewDidLoad 之前为您完成。删除创建集合视图的三行并设置dataSourcedelegate

次要,但您的 homeFooterView 类应命名为 HomeFooterView。类名应以大写字母开头。

【讨论】:

嘿@rmaddy,我已经尝试了您的解决方案,但它仍然无法正常工作 - 得到同样的错误。我已按照此处的指南进行操作,并且可以正常工作(设置相同)。这可能是由于我尚未初始化的某些标签或 uiimageview 造成的吗?听起来 HomeVC 本身没有用框架初始化..? 所以你把collectionView?.register(HomeVC.self, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "homeVC")换成了collectionView?.register(HeaderView.self, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "homeVC")?如果您这样做了,但问题仍然存在,请使用显示崩溃发生位置的堆栈跟踪更新您的问题。 这些变化是在与 UICollectionReusableView 交互时发生的。除了这个,我已经让我所有的代码都可以工作了。我试过在这里添加方法:***.com/questions/33343367/… 对为什么会发生这种情况有任何想法吗?似乎无法让框架工作,这只是在我使用页眉/页脚时......它们也是空的 你没有回复我之前的评论。

以上是关于Swift - 创建没有 Storyboard initWithFrame 错误的 collectionView的主要内容,如果未能解决你的问题,请参考以下文章

如何将 ViewController.swift 连接到 Storyboard 中的 ViewController?

swift 创建一个新的viewController文件并使用storyboard附加swift文件

没有 Storyboard 的 Swift UITableViewCell 不使用自动布局

如何在没有 Storyboard 的情况下推送新视图 Swift

swift项目第五天:swift中storyBoard Reference搭建主界面

为iOS8创建Launch Screen.xib(... iOS11,Swift 4和LaunchScreen.storyboard)