UICollectionView завершается с ошибкой: поток 1: EXC_BAD_ACCESS - PullRequest
0 голосов
/ 11 июня 2018

Первоначально мой 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 голосов
/ 12 июня 2018

Как отметили @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)

Теперь, когда вы получили требуемую ширину вашей метки, вы можете настроить размерэлемент, основанный на ширине этикетки.

Надеюсь, это поможет.Дайте мне знать, если вам нужна помощь.Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...