Swift

Swift:NSTableViewの文字列の色付け

なるほど。NSAttributeStringを使えば、文字属性を制御できますね。

ずっと前からNStableViewの中の文字列に色をつけたり、文字サイズを変更したりするにはどうすればいいのか、不思議に思っていました。

特定文字列に色をつけたり、boldにできれば、視認性が高まるし、検索した用語であれば一発でどこにあるか探し出せます。表自体をcell basedからview basedに変更しないとできないというようなブログを見かけたので、少し前にview basedに変更しようとしていたのですが、力尽き、そのうち忘却してしまいました。

それで、昨夜からカラム幅の制御と検索機能を追加したいといろいろ調べていたら、不思議なことに何回もNSAttributedStringと出会いました。あまり関係ないことの検索をしていたのですけどね。

仮に一部のStringをNSAttributedStringに変更し、属性を赤い文字にしてみました。OKです。ただし、この変更に伴い、従来、Stringでハンドリングしていた箇所をNSAttributedStringからStringに変更するプロセスをワンクッション入れないといけません。Screenshot 2016-01-28 13.16.49

コードはいたって簡単ですが、呼び出し側からフォント、色などの属性指定ができるようにする方が便利だと思い次のようにしました。まだ、完全にテストしていないのですが、次の場合、wAtt?.stringが元々のStringの内容である“target object”になります。カラム内の文字検索などを行う場合、wAtt.stringに直してから文字列のハンドリングをする必要があります。フォント名、サイズ、カラーはユーザーが指定できるようにするべきで、呼び出し側の処理はいろいろ必要なので、面倒ですが受け渡しパラメタは長くなりました。

let wFont:NSFont = NSFont(name:”Times-Roman”, size:10)!
let wAtt = ExecSetAttribute(“target object”, pFont:wFont, pAlignment:”Left”, pColor:NSColor.redColor())

func ExecSetAttribute(pString:String, pFont:NSFont, pAlignment:String, pColor:NSColor) -> NSAttributedString? {
let wStyle = NSParagraphStyle.defaultParagraphStyle().mutableCopy() as! NSMutableParagraphStyle
if pAlignment == “Center” { wStyle.alignment = NSTextAlignment.Center }
else if pAlignment == “Right” { wStyle.alignment = NSTextAlignment.Right  }
else { wStyle.alignment = NSTextAlignment.Left   }
let wAttribute = [ NSForegroundColorAttributeName:pColor, NSFontAttributeName:pFont, NSParagraphStyleAttributeName:wStyle]
return NSAttributedString(string:pString, attributes: wAttribute)
}

調べているうちにお腹いっぱいになりました。検索機能とカスタムツールバーを追加しないといけないのですが、冒頭に書いた通り、この色付けは長い間懸案事項になっていただけに、わかってしまうと、すぐにお腹いっぱいになりました。歳をとると、毎回毎回、たくさん食べられません。

参考:SwiftでNSAttributedStringを使って文字列を装飾する(UILabelに画像を表示する)

Categories: Swift, 技術