当我在代码中使用FlowLayout对象并在CollectionView对象上调用reloadData()时,我的应用程序会崩溃。当我使用标准FlowLayout (来自XCode的设置)时,我没有这样的异常。
这就是我如何使用FlowLayout计算节内嵌取决于设备的宽度。
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
let layout = UICollectionViewFlowLayout()
layout.itemSize = CGSize(width: itemWidth, height: itemWidth)
layout.minimumInteritemSpacing = minItemSpacing
layout.minimumLineSpacing = minItemSpacing
layout.headerReferenceSize = CGSize(width: 0, height: headerHeight)
let containerWidth = collectionView.bounds.width
if (containerWidth < 350) {
inset = 2
}
else if (containerWidth >= 350 && containerWidth < 400) {
inset = 10
}
else {
inset = 14
}
layout.sectionInset = UIEdgeInsets(top: minItemSpacing, left: inset, bottom: minItemSpacing, right: inset)
collectionView.collectionViewLayout = layout
}使用这样的代码,应用程序通常会启动,但是当我从另一个视图控制器转到使用CollectionView并调用collectionView.reloadData()的主视图时
@IBAction func saveMyObjects(segue:UIStoryboardSegue) {
if let myObjectsViewController = segue.sourceViewController as? MyObjectsViewController {
MyObjects.Objects.removeAll()
MyObjects.Objects.appendContentsOf(myObjectsViewController.MyObjects)
collectionView.reloadData()
}
}应用程序崩溃,除了下面的例外。
*终止应用程序由于未指定的异常'NSRangeException',原因:'* -__NSArrayM objectAtIndex::索引0超出了空数组的界限‘libc++abi.dylib:以NSException类型的未定义异常终止
如果我评论
// collectionView.collectionViewLayout = layout 使用XCode值的行,app毫无例外地工作。
附加代码:
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! ObjectCollectionViewCell
// Configure the cell
cell.imageView.image = UIImage(named: Groups[indexPath.section].Objects[indexPath.row].Image)
cell.label.text = Groups[indexPath.section].Objects[indexPath.row].Name
if (Groups[indexPath.section].Objects[indexPath.row].Image != "") {
cell.label.hidden = true
cell.imageView.hidden = false
}
else {
cell.imageView.hidden = true
cell.label.hidden = false
}
return cell
}发布于 2016-06-15 15:53:59
在多次检查代码之后,我认为您的问题是应该从viewDidLayoutSubviews()中删除代码并实现UICollectionViewDelegateFlowLayout上存在的方法以满足您的需要,
optional public func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize
optional public func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAtIndex section: Int) -> CGFloat
optional public func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAtIndex section: Int) -> CGFloat
optional public func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize
optional public func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAtIndex section: Int) -> UIEdgeInsets我认为如果您实现此方法并从viewDidLayoutSubviews()中删除您的代码,您的代码将根据您的需要工作,非常不鼓励使用您的方法;),我希望这可以帮助您
https://stackoverflow.com/questions/37817876
复制相似问题