WebViewでFlashサイトを見ると異常終了する
2009.9.21
Drag&Drop対応のクラス群の為のサンプルコードを準備中
CoreDataを使うアプリケーションでDrag&Dropに簡単に対応できるように作ったクラス群なので、サンプルプログラムもCoreDataらしいものにしたいところです。それなりに件数がたくさんあって、自由に利用できるデータには何があるだろうか?と考えて、青空文庫に目を付けました。青空文庫で公開されている書籍データを取り込んで、選択された書籍のウェブページを表示するというサンプルプログラムです。
とりあえずこんな感じで動いています。
初めて使うWebView
サンプルプログラムの目的はDrag&Dropに対応させる為のクラスをどう使えばよいかを示す事なので、WebViewは本質とは関係ありません。しかし選んだ書籍の中身が見れないのでは、アプリケーションとしては意味のないものになります。
WebViewは初めて使うのですが、本格的なウェブブラウザを作るわけではないので、その範囲内なら大して手間はかからないのではないかと思っていました。参考にした書籍にはバインディングの設定だけで、コードを一切書かずに使えると書いてあります。ところが書かれた通りにやろうとしても、そもそもbind to:の対象にWebViewが現れません。検索してみると、どうやらTigerではWebViewがビューでありながらコントローラ的な役割も果たしていたのでバインディング設定ができたのですが、LeopardではそのようなModel-View-Controllerの枠組みを壊すような事はやめたらしいのです。しかたがないので、ちょっとだけコードを書きました。
配列コントローラのselectedObjectsをキー値監視を使って監視します。選択されている書籍が変更されたら以下のコードでページを更新します。estimatedURL:は書籍データからURLを推定して返すメソッドです。同じ作品IDの複数のレコードが存在するのに対してウェブページは一つしかないので、その辺りを解決する為に実際はもう少し複雑なコードなのですが、話が脇道にそれてしまうので省略します。
- (void)windowControllerDidLoadNib:(NSWindowController *)windowController
{
[super windowControllerDidLoadNib:windowController];
[self bind:@"worksSelections"
toObject:works
withKeyPath:@"selectedObjects"
options:nil];
}
- (NSArray *)worksSelections {return nil;}
- (void)setWorksSelections:(NSArray *)newSelections
{
Work *selection;
if([newSelections count] != 1) return;
selection = [newSelections objectAtIndex:0];
[[webView mainFrame] loadRequest:
[NSURLRequest requestWithURL:
[NSURL URLWithString:[self estimatedURL:selection]]]];
}
青空文庫のトップページにいくと異常終了する
とりあえずコンソールに表示されるエラーメッセージを検索してみたところ、以下のページにたどりつきました。
何と、はた迷惑な事にFlash 10(ベータ版ではなく正式版です)がデバッガを呼び出すコードを含んでいるというのです。Adobeの誰かがFlash Playerのコード中に"Debugger()"を置き忘れたという事なのでしょう。だからXcodeで実行中にFlashを含むウェブページを表示しようとすると、そこで強制停止するわけです。これ、知らなければちょっと原因が分からないのではないでしょうか?
対策はXcodeの「実行」メニューの中にある「Debugger()/DebugStr()で停止」のチェックを外す事です。


HOME
前のページへ