Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NSAttributedString initialization throws NSRangeException

I wrote a simple extension to decode the html entities:

extension String {
    func htmlDecode() -> String {
        if let encodedData = self.data(using: String.Encoding.unicode) {
            let attributedString = try! NSAttributedString(data: encodedData, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: String.Encoding.unicode], documentAttributes: nil)
            return attributedString.string
        }
        return self
    }
}

Now it throws an error on the line if let attributedString …:

*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 4 beyond bounds [0 .. 2]'

And self is not nil or something, just a String like this:

self = (String) "...über 25'000 Franken..."

Where is this strange NSArray-exception coming from?

like image 443
Fabio Poloni Avatar asked Apr 07 '15 04:04

Fabio Poloni


2 Answers

A shot in the dark: do you ensure that the initialization happens on the main thread?

I had exactly the same problem. I noticed that in my case the exception occurs under reproducible conditions (animations in a UICollectionViewController), but I was unable to find the actual cause. My best guess is that it's a framework bug, so I'd too suggest you file a radar.

I ended up pre-rendering my HTML formatted strings into a cache (aka array) at a time where it works, and then load the NSAttributedStrings from it on demand.

Note though that this solution may not fit your use case, since I only have to deal with a limited amount of formatted strings at a time and hence know the expense of rendering them in advance.

like image 120
ahaese Avatar answered Oct 21 '22 17:10

ahaese


In my case, this was happening because I was trying to instantiate a NSAttributedString from within a UICollectionViewCell that was in detached state (before it was inserted in the parent UICollectionView).

like image 42
Blago Avatar answered Oct 21 '22 16:10

Blago