Feb 1, 2008

NSTextViewの代わりにWebViewを使う

アプリの中にはテキストを表示するものが多くあります. メールアプリのメール本文, 辞書表示アプリの辞書内容表示部分など. これらの表示部分にはNSTextViewが利用されている事が多いです. フォントや色の変更も自由ですし画像も張り込めますしなんら問題ないのですが, WebViewを代わりに使おうと思って調べてみました.技術的に面白そうという事もありますし, HTMLで自由にレイアウト変更ができるので, 楽になるんじゃないかな? という事もあります. (※NSTextViewはHTMLを読み込めます). 題材としては, 辞書ビューワのコトノコを使います.

通常, NSTextViewをビューワとして使う場合には, 表示するテキストを成形して setAttributedString:で設定という流れです. 一方, WebViewを使う場合には, URLを設定して(正確には NSURLRequestをWebViewに送って)その内容をWebViewが表示するという流れになります.

あらかじめ, HTMLファイルがある場合は file: プロトコルでファイルを直接指定すれば良いのですが, 辞書内容等を全部HTMLで書き出すのは現実的ではありません. そこで, eb: というプロトコルを新たに定義してそれを指定します. そしてそのプロトコルを処理するのが, NSURLProtocolです.

ここでは, NSURLProtocolのサブクラスとしてEBProtocolを作成します. eb:/(辞書ID)/(辞書内の位置) というURLで辞書の位置を指定し, 内容を返します.

NSURLProtocolのサブクラスが実装すべき関数はcanInitWithRequest:, canonicalRequestForRequest:, startLoading:, stopLoaing:の4つ. まず, canInitWithRequestは対応しているプロトコルスキームであればYESを返します.

canonicalRequestForRequest:は requestをそのまま返せばいいですし, stopLoaing:は何もする必要はありません.最も大事なのは startLoadingです. ここで辞書中身を返します. (通信等は発生しないのでこの関数で一気に処理します)

コトノコ

NSTextViewをWebViewに置き換えただけのコトノコ. フォントや色の設定がされていないのでNSTextViewより見にくい表示になってしまっています.

No comments:

Post a Comment