[iPhone SDK] Avoid target="_blank" problem
これは,@norio_nomura氏のハック.
すばらしいハックです.
実は,UIWebViewのバックグラウンドでは,クリックされたりすることで,新しいウィンドウが生成される前に,UIWebViewWebViewDelegateというデリゲートオブジェクトに対して,webView:createWebViewWithRequest:というメソッドがコールされる.実は,UIWebViewが新しいウィンドウを開くtarget="_blank"のときにナビゲーションがうまくいかないのは,このメソッドが実装されていないためなのである.
このメソッドを,新しいウィンドウを自分自身に指定するようなメソッドをCで実装し,Objective-Cの動的結合を利用して,無理矢理,UIWebViewWebViewDelegateにねじ込む.
static id webViewcreateWebViewWithRequestIMP(id self, SEL _cmd, id sender, id request) { return [sender retain]; } + (void)installNewWindowDelegateHook { Class klass = objc_getClass( "UIWebViewWebViewDelegate" ); if( klass == nil ) return; // unfortunately, UIWebViewWebViewDelegate has gone... class_addMethod( klass, @selector(webView:createWebViewWithRequest:), (IMP)webViewcreateWebViewWithRequestIMP, "@@:@@" ); }
これで完成なのだ!!!
@norio_nomuraさん,ありがとうございました.