NSTextView,NSFontManager和changeAttributes()

时间:2015-10-30 14:44:23

标签: swift macos nstextview nsfontmanager nsfontpanel

所以我有这个应用程序,我正在编写,以熟悉Swift和OSX编程。这是一个笔记应用程序。注释窗口包含一个NSTextView和一个显示NSFontPanel的按钮。

更改字体效果很好。选择尺码?没问题。想要更改字体的属性,如颜色,下划线等?我完全不确定如何让它发挥作用。

其他来源(例如Regenerate evolution scripts in play 2here)似乎暗示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)
}

所以..我的目标是两个:

  1. 了解这里发生了什么
  2. 我在fontPanel中做出的任何更改都会反映在NSTextView所选文本中。
  3. 谢谢。

1 个答案:

答案 0 :(得分:1)

所以我确实找到了各种答案。以下是我在程序中实现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正在寻找的。所以我只是将它们从旧名称复制到新名称并发送给他们。这是一个好的开始,但我可能会在添加属性之前删除旧密钥。

问题仍然存在,那......这是正确的做事方式吗?