所以我正在编写这个应用程序,以熟悉Swift和OSX编程。这是一个记笔记的应用程序。注释窗口由一个NSTextView和一个按钮组成,该按钮将显示一个NSFontPanel。
更改字体效果很好。选择尺寸?没问题。想要更改字体的属性,如颜色、下划线等吗?我一点也不知道该怎么做。
其他来源(例如,这里和这里)似乎建议NSTextView应该是NSFontManager的目标,并且NSTextView有自己的changeAttributes()实现。然而,将NSTextView作为目标并没有起到任何作用。当我在NSTextView中选择文本并打开字体面板时,我在fontPanel中的第一个选择会导致取消选择文本。
使我的视图控制器成为NSFontManager的目标,并实现changeAttributes的存根,会产生一个NSFontEffectsBox类型的对象,我找不到任何好的文档。
问题是…我应该如何处理NSFontEffectsBox?如果在fontPanel中我选择带双下划线的蓝色文本,我可以在调试器中看到这些属性,但我无法用程序访问它们。
这是相关代码:
override func viewDidLoad() {
super.viewDidLoad()
loadNoteIntoInterface()
noteBody.keyDelegate = self // noteBody is the NSTextView
noteBody.delegate = self
noteBody.usesFontPanel = true
fontManager = NSFontManager.sharedFontManager()
fontManager!.target = self
}
用于更改字体的代码。这很好用。
override func changeFont(sender: AnyObject?) {
let fm = sender as! NSFontManager
if noteBody.selectedRange().length>0 {
let theFont = fm.convertFont((noteBody.textStorage?.font)!)
noteBody.textStorage?.setAttributes([NSFontAttributeName: theFont], range: noteBody.selectedRange())
}
}
changeAttributes:的存根代码
func changeAttributes(sender: AnyObject) {
print(sender)
}
所以。。我的目标有两个:
- 了解这里发生了什么
- 让我在fontPanel中所做的任何更改都反映在NSTextView所选文本中
谢谢。
所以我确实找到了某种答案。以下是我在程序中实现changeAttributes()的方法:
func changeAttributes(sender: AnyObject) {
var newAttributes = sender.convertAttributes([String : AnyObject]())
newAttributes["NSForegroundColorAttributeName"] = newAttributes["NSColor"]
newAttributes["NSUnderlineStyleAttributeName"] = newAttributes["NSUnderline"]
newAttributes["NSStrikethroughStyleAttributeName"] = newAttributes["NSStrikethrough"]
newAttributes["NSUnderlineColorAttributeName"] = newAttributes["NSUnderlineColor"]
newAttributes["NSStrikethroughColorAttributeName"] = newAttributes["NSStrikethroughColor"]
print(newAttributes)
if noteBody.selectedRange().length>0 {
noteBody.textStorage?.addAttributes(newAttributes, range: noteBody.selectedRange())
}
}
对sender调用convertAttributes()会返回一个属性数组,但这些名称似乎不是NSAttributedString要查找的名称。所以我只是将它们从旧名称复制到新名称并继续发送。这是一个很好的开始,但我可能会在添加属性之前删除旧键。
问题仍然存在,尽管。。这是正确的做事方式吗?