UICollectionView崩溃并出现错误:线程1:EXC_BAD_ACCESS

时间:2018-06-11 11:14:17

标签: ios swift uicollectionview uikit

最初我的CollectionView工作正常,但我想根据CollectionView中TextLabel的宽度调整CollectionView中项目的宽度,所以我添加了一些代码,然后在程序初始化时崩溃:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "OnedaySubTodoCell", for: indexPath) as! SubCell
    let width = 28 + cell.subNameLabel.bounds.size.width
    print("Width: \(width)")
    return CGSize(width: width, height: 20)
}

这是一个错误报告,显示在class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {

  

线程1:EXC_BAD_ACCESS(代码= 1,地址= 0x7a00b0018)

这是输出:

  

宽度:88.0   (LLDB)

我的班级继承了UICollectionViewDelegateFlowLayout,我想知道问题所在。

1 个答案:

答案 0 :(得分:0)

正如@rmaddy和@Prashant指出的那样,

  

您不应在cellForItemAt中使用sizeForItemAT因为   在初始化单元格之前调用sizeForItemAt   cellForItemAt

而且很可能这就是你崩溃的原因。走向解决方案。

我遇到了类似的问题(必须动态管理身高),我所做的就是

根据文字计算标签的估计宽度。使用以下字符串扩展名

//calculates the required width of label based on text. needs height and font of label
extension String {

 func width(withConstrainedHeight height: CGFloat, font: UIFont) -> CGFloat {

    let constraintRect = CGSize(width: .greatestFiniteMagnitude, height: height)
    let boundingBox = self.boundingRect(with: constraintRect, options: .usesLineFragmentOrigin, attributes: [.font: font], context: nil)

    return ceil(boundingBox.width)
  }
}

现在,在sizeForItemAt

    //put actual lblHeight here
    let lblHeight = Put_actual_label_height_here // e.g 30

    //put actual label font here
    let lblFont =   Put_actual_label_font_here  //e.g UIFont.boldSystemFont(ofSize: 20)

  //calculate required label width
    let lblRequiredWidth = yourLabel's_Text_String.width(withConstrainedHeight: lblHeight, font: lblFont)

    //you may want to return size now 
    let height = yourItemsHeight
    return CGSize(width: lblRequiredWidth, height: height)

现在您已获得所需的标签宽度,您可以根据标签的宽度调整项目的大小。

希望有所帮助。如果您需要任何帮助,请告诉我。感谢