当我试图将属性应用到子字符串时,有时会出现以下代码崩溃:
// Dummy strings
let originalString = "Some example string"
let searchSubString = "exam"
// Get range of sub-string for which new attributes are to be set.
let rangeOfSubString: NSRange = (originalString.lowercaseString as NSString).rangeOfString(searchSubString.lowercaseString)
// Apply new attributes to the sub-string in original string and show it in UILabel.
let attributedOriginalString = NSMutableAttributedString(string: originalString, attributes: [NSForegroundColorAttributeName : UIColor.blueColor()])
attributedOriginalString.addAttribute(NSFontAttributeName, value: UIFont.systemFontOfSize(14.0), range: rangeOfSubString)
attributedOriginalString.addAttribute(NSForegroundColorAttributeName, value: UIColor.redColor(), range: rangeOfSubString)
self.textLabel.attributedText = attributedOriginalString下面是堆栈跟踪:
Thread : Fatal Exception: NSRangeException
0 CoreFoundation 0x26cbefef __exceptionPreprocess
1 libobjc.A.dylib 0x35362c8b objc_exception_throw
2 CoreFoundation 0x26cbef35 -[NSException initWithCoder:]
3 Foundation 0x2793ac3b -[NSRLEArray objectAtIndex:effectiveRange:]
4 Foundation 0x27954b2d -[NSConcreteMutableAttributedString addAttribute:value:range:]我无法复制它,但是我通过crashlytics获得了这个崩溃日志。。
崩溃日志似乎表明,rangeOfSubString originalString**,超出了originalString**,的范围,但我认为它永远不会发生。
谁能告诉我坠机的原因是什么?
发布于 2016-02-03 16:11:07
如果其他人遇到这样的问题,请张贴我的答案:
替换
let rangeOfSubString: NSRange = (originalString.lowercaseString as NSString).rangeOfString(searchSubString.lowercaseString)使用
let rangeOfSubString: NSRange = (originalString as NSString).rangeOfString(searchSubString, options: .CaseInsensitiveSearch)第一种计算子字符串范围的方法是错误的,原因是:
还请参阅苹果的文档:
lowercaseString: Case转换不一定是对称的,也不能产生与原始字符串长度相同的字符串。 lcString = myString lowercaseString; 可能不等于这一说法: lcString = [myString uppercaseString lowercaseString]; 例如,在德语中,大写形式为“SS”,因此将“Stra e”转换为大写,然后将小写转换为以下字符串序列: “Stra-e” “街” “街”
https://stackoverflow.com/questions/35174261
复制相似问题