将@paul-patterson 的代码移植到 Swift 3:
override func controlTextDidChange(_ obj: Notification) {
guard let fieldEditor = self.tokenField.currentEditor() as? NSTextView,
let layoutManager = fieldEditor.layoutManager
else { return }
func countAttachments(attributedString: NSAttributedString) -> Int {
let string = attributedString.string as NSString
let maxIndex = string.length - 1
var counter = 0
for i in 0..<maxIndex {
if string.character(at: i) == unichar(NSAttachmentCharacter) {
counter += 1
}
}
return counter
}
let currentCount = countAttachments(attributedString: layoutManager.attributedString())
// cache count or act on it directly
}
奇怪的是,以下在 Swift 中不会产生预期的结果:
layoutManager.attributedString().string
.split(by: Character(UnicodeScalar(NSAttachmentCharacter)!)).count
相反,当用户不键入时它返回 0,而当正在编辑标记时它返回 1。
let isEditing = layoutManager.attributedString().string
.split(by: Character(UnicodeScalar(NSAttachmentCharacter)!)).count == 1
结合这两种方法,您可以使用状态机编写自定义的“添加/删除令牌”回调。(不过,我认为这不是一种非常安全的实现方式。)
- 使用 跟踪令牌计数
countAttachments(attributedString:)
。
- 用于
isEditing
检查...
- 如果用户开始添加新注释(新计数 > 旧计数 && isEditing == true)
- 如果用户开始编辑现有笔记(新计数 == 旧计数 && isEditing == true)
- 如果用户完成了一个令牌(oldIsEditing == true && newIsEditing == false)