経緯
該当画面はUIWebViewで表示した際、「閉じる」ボタンが効かなかった。
ボタン押下時は閉じるのではなく、一画面戻したかった為、方法を探った。
方法
jsを書き換える為のファイルを用意、プロジェクト内に格納:
JS_WebViewController.txt
window.close = function () {
history.back();
};
window.close()
をhistory.back()
で書き換えているだけ、シンプル。
次、
webViewDidFinishLoad
で先のファイルを読込、書き換え:
WebViewController.m
// URL読込後
- (void)webViewDidFinishLoad:(UIWebView *)webView {
NSError *error = nil;
NSString *jsFromFile = [NSString stringWithContentsOfURL:[[NSBundle mainBundle]
URLForResource:@"JS_WebViewController" withExtension:@"txt"]
encoding:NSUTF8StringEncoding error:&error];
__unused NSString *jsOverrides = [webView
stringByEvaluatingJavaScriptFromString:jsFromFile];
}
応用
urlスキーマ使えば、objC側でもっと自由にやれる:
JS_WebViewController.txt
window.close = function () {
open("native://close");
};
同じくwebViewDidFinishLoad
で書き換える:
WebViewController.m
- (void)webViewDidFinishLoad:(UIWebView *)webView {
NSError *error = nil;
NSString *jsFromFile = [NSString stringWithContentsOfURL:[[NSBundle mainBundle]
URLForResource:@"JS_WebViewController" withExtension:@"txt"]
encoding:NSUTF8StringEncoding error:&error];
__unused NSString *jsOverrides = [webView stringByEvaluatingJavaScriptFromString:jsFromFile];
}
-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
NSString *scheme = [request.URL.scheme stringByAppendingString:@":"];
scheme = [scheme stringByAppendingString:request.URL.resourceSpecifier];
if ([scheme isEqualToString:@"native://close"]) {
/*
*
* Do Something!!!!!!!!!!!!!!!!!!
*
*/
[self dismissViewControllerAnimated:YES completion:nil];
return NO;
} else {
return YES;
}
}
スキーマはrequest.URL.scheme
とrequest.URL.resourceSpecifier
で取得して判定してる