ios swift index 0 за пределами для пустого массива при вычислении высоты в представлении коллекции - PullRequest
0 голосов
/ 06 сентября 2018

Я хочу вычислить высоту ячейки представления коллекции в строке HTML. HTML строка преобразуется в строку по нижнему расширению. но при выполнении этой ошибки и вылет:

*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndexedSubscript:]: index 0 beyond bounds for empty array'

мой код:

extension String {
    var htmlToAttributedString: NSAttributedString? {
        guard let data = data(using: .utf8) else { return NSAttributedString() }
        do {
            return try NSAttributedString(data: data, options: [.documentType: NSAttributedString.DocumentType.html, .characterEncoding:String.Encoding.utf8.rawValue], documentAttributes: nil)
        } catch {
            return NSAttributedString()
        }
    }
    var htmlToString: String {
        return htmlToAttributedString?.string ?? ""
    }
}

в методе cellForItemAt:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    //let cell  = ....
    cell?.biographyTextView.text = artistModel?.biography?.htmlToString
}

и в методе sizeForItemAt

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    let htmlToString = artistModel?.biography?.htmlToString
    let size = CGSize(width: collectionView.frame.width, height: .greatestFiniteMagnitude)
    let attributes = [NSAttributedStringKey.font: UIFont.systemFont(ofSize: 15)]
    let estimatedFrame = NSString(string: htmlToString!).boundingRect(with: size, options: [.usesFontLeading, .usesLineFragmentOrigin], attributes: attributes, context: nil)
    return CGSize(width: collectionView.frame.width, height: estimatedFrame.height)
}

текст биографии, например:

<p>blahblah><br /><br/><li>asd</li>....

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Fixed. в соответствии с ответом @ Leo Dabus : https://stackoverflow.com/a/28132610/2303865

проблема исправлена ​​в основной теме. перед использованием расширения преобразуйте html в строку в sizeForItemAt. он должен конвертироваться в основной поток. спасибо всем

0 голосов
/ 06 сентября 2018

Убери это. Изменения:

let htmlToString = artistModel?.biography?.htmlToString

до:

guard let artist = artistModel, let biblio = artist.biography else {return a default size}

let htmlToString = biblio.htmlToString
...