diff --git a/Tusker/Views/ContentTextView.swift b/Tusker/Views/ContentTextView.swift index c485ed1b..e3c47c40 100644 --- a/Tusker/Views/ContentTextView.swift +++ b/Tusker/Views/ContentTextView.swift @@ -221,7 +221,9 @@ class ContentTextView: LinkTextView, BaseEmojiLabel { let charIndex = lineFragment.characterIndex(for: pointInLineFragment) var range = NSRange() - guard let link = lineFragment.attributedString.attribute(.link, at: charIndex, longestEffectiveRange: &range, in: lineFragment.attributedString.fullRange) as? URL else { + // sometimes characterIndex(for:) returns NSNotFound even for points that are in the line fragment's typographic bounds (see #183), so we check just in case + guard charIndex != NSNotFound, + let link = lineFragment.attributedString.attribute(.link, at: charIndex, longestEffectiveRange: &range, in: lineFragment.attributedString.fullRange) as? URL else { return nil } // lineFragment.attributedString is the NSTextLayoutFragment's string, and so range is in its index space