NSTextView, NSFontManager, and changeAttributes()



所以我正在编写这个应用程序,以熟悉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)
}

所以。。我的目标有两个:

  1. 了解这里发生了什么
  2. 让我在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要查找的名称。所以我只是将它们从旧名称复制到新名称并继续发送。这是一个很好的开始,但我可能会在添加属性之前删除旧键。

问题仍然存在,尽管。。这是正确的做事方式吗?

相关内容

  • 没有找到相关文章

最新更新