Day: May 5, 2016

Swift:フィルタの検索(コンテンツブロック)

文字列の中に該当するフィルタが存在するかどうかチェックするメソッドを作りました。

このメソッドはヒットした最初の位置をNSRangeで戻します。NSRangeの配列になっている理由は、すべての文字列をスキャンするメソッドと整合を図るためです。

ポイントは次の通りです。

  • 正規表現チェックで得られたNSRegularExpression(ここではwX.rRegular)を利用する。
  • メイン側では、チェック範囲pRangeを更新する必要がある。つまり文字列の範囲は順次小さくなるべきで、そうでないとループする。
  • 蛇足になるが、メイン側では、当該フィルタの検索で得られた箇所(NSRange)の文字列に対して適切な処理をしないと、コンテンツブロックにならない。
  • rangeOfFirstMatchInString ヒットした最初のフィルタの範囲だけ抽出
  • matchesInString ヒットしたすべてのフィルタの範囲を抽出
  • 複数のフィルタをスキャンする場合、rangeOfFirstMatchInStringで回したほうが単純。

Screenshot 2016-05-05 15.05.02

Swift:正規表現のチェック

正規表現かどうか調べるメソッドを作成しました。

optionsの利用の仕方はこれでいいかどうか一抹の不安があります。一応、これでチェック機能が動いているようです。

戻り値は、エラーのとき、Boolで戻すようにしました。最初、NSRegularExpression()で調べていたのですが、これはnilでも引っかからず、エラーを判別できませんでした。

Screenshot 2016-05-05 14.29.43

Swift:pull down menuの設定

以前、整理したはずですが、またしても迷ってしまいました。

迷ったのは、️NSMenuの中の最初#00のNSMenuItemの取り扱いです。通常、用意するデータ(配列)は2番目#01以降のものになるのですが、#00を特別に付加する必要があります。

メニュの構成は、

  • NSPopUpButton➡️NSPopUpButton➡️NSPopUpButtonCell➡️NSMenu➡️NSMenuItem

になります。

Screenshot 2016-05-05 13.54.04

@IBOutlet var  xStaticCell:NSPopUpButtonCell!

var wFilterArray:[String] = []
var wInfoArray:[String] = []
var wHitCount:String = “”
wInfoArray.append(“”) //#00をsetする。
for inx in 0 ..< wFilterArray.count {
 << ここでMenuItemのtitleを作成 >>
wInfoArray.append(wHitCount) //配列にset。
}
xStaticCell!.removeAllItems() //pull down menuのクリア。
xStaticCell!.addItemsWithTitles(wInfoArray)   //pull down menuのtitleをset。
xStaticCell!.itemAtIndex(0)!.title = “🚩”  //表示用のmenuItem。
xStaticCell!.itemAtIndex(1)!.state  = NSOffState //チェックを外す。

元々、アイコンをxStaticCell!.imageに設定していて、上記ロジックにバグがあったため、表示されないという問題が起きていました。原因は、”🚩”をセットしている箇所でremoveAllItems()のあとにブランク” “を設定すればよかったのですが、そうしなかったことで、アイコンがどうしても表示できませんでした。NSImageをsaveしたり、いろいろやって、上記のような解決方法に至りました。

実際のメニュは、🚩をクリックしたとき、コンテンツブロックしたフィルタの個数とフィルタ名が次のように表示されます。もちろん、まだ、暫定版です。

Screenshot 2016-05-05 14.43.10