我正在继承NSTextStorage
做一些链接突出显示,我已经尽可能多地阅读了这个 主题。在我输入表情符号之前,一切正常。
我的子类:
private let ims = NSMutableAttributedString()
override var string: String {
return ims.string
}
override func attributesAtIndex(location: Int, effectiveRange range: NSRangePointer) -> [String : AnyObject] {
return ims.attributesAtIndex(location, effectiveRange: range)
}
override func replaceCharactersInRange(range: NSRange, withString str: String) {
ims.replaceCharactersInRange(range, withString: str)
self.edited(.EditedCharacters, range: range, changeInLength:(str as NSString).length - range.length)
}
override func setAttributes(attrs: [String : AnyObject]?, range: NSRange) {
ims.setAttributes(attrs, range: range)
self.edited(.EditedAttributes, range: range, changeInLength: 0)
}
没什么复杂的。然后,当输入臭名昭著的角色时,它会出于某种随机原因切换到 Courier New:
现在我正在挑选这个角色,还有其他人也导致了这种疯狂。我在输入时查询了字体,它来自 System > Apple Emoji > Courier New。
我还尝试设置processEditing()
半解决问题的字体,它会导致添加额外的空间(虽然不是在模拟器中)。而且我正在硬编码一个值==不好。
终极问题:
我究竟做错了什么?我没有看到其他人的实现存在这个问题,我确信开发人员已经继承了 NSTextStorage。
注意:我可以确认在objc.io 的演示应用程序中存在相同的问题。