質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

Q&A

解決済

1回答

3015閲覧

Objective-CのWebビュー画面内のボタンに機能を加えたい。

Satochan24

総合スコア113

Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

0グッド

0クリップ

投稿2015/06/10 11:28

Objective-CでiPhoneアプリを作成していますが、
WebビューでPHPのソースを表示させるまではできましたが、
そこに表示されているWeb上のボタン、
「再更新」と「戻る」ボタンをそれぞれ、リロードと、Webビュー遷移前の画面に戻したいと思っています。
それぞれ、「再更新」が「app://reload」に、「戻る」が「app://close」というアドレスになっています。
Webビュー上にアプリのボタンを配置してリロードなどの処理ができるようですが、
すでにWeb画面上にあるボタンの場合は可能でしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

WebViewには、リンク先をクリックした時にそのURLに遷移するかチェックするデリゲートメソッドがあります。

そこで、予め決めていたURLか判定し、アプリ側で何か処理するといったことが可能です。

lang

1 2- (void)viewDidLoad 3{ 4 [super viewDidLoad]; 5 6 // デリゲートを設定 7 self.webView.delegate = self 8} 9 10- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 11{ 12 // URLが「app://~」であるかの判定 13 if ([request.URL.scheme isEqualToString:@"app"]) { 14 // ~のところの判定 15 if ([request.URL.host isEqualToString:@"reload"]) { 16 // リロード処理 17 [webView reload]; 18 } else if ([request.URL.host isEqualToString:@"close"]) { 19 // 戻る処理 20 [webView goBack]; 21 } 22 // アプリとの連携の場合はリンク先に飛ばないようにNOを返す 23 return NO; 24 } 25 26 return YES; 27}

投稿2015/06/10 14:22

okenProg

総合スコア153

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Satochan24

2015/06/11 08:52

回答、ありがとうございます。現在、検証中ですが、戻る処理について、 恐らくgoBackだと、前のWebView画面に戻る処理だと思います。 前の画面がWebViewではなく、ViewControllerの画面だった場合は戻ることが可能でしょうか?調べたのですがなかなか見つからない状況です。
okenProg

2015/06/11 09:48

そっち側の戻るでしたか。。。 ViewControllerを戻るにも2種類ありまして、そのViewControllerに移動するときに、下から画面が上がってきて表示された場合などであれば、 goBackを書いてる所を以下のように書き換えればよいです。 [self dismissViewControllerAnimated:YES completion:nil]; また、ナビゲーションコントロールを使っていて、右側からスライドして表示された場合であれば、 [self.navigationController popViewControllerAnimated:YES] で、前の画面が表示されます。
Satochan24

2015/06/11 10:23

回答ありがとうございました。ナビゲーションコントロールは使っていないので、 [webView goBack]; を [self dismissViewControllerAnimated:YES completion:nil]; に修正したのですが、 なぜか反応なしでした。原因調査中です。
Satochan24

2015/06/12 05:59

試しに、UIButtonをWeView画面上の別の位置に配置して、アクション接続で [self dismissViewControllerAnimated:YES completion:nil]; を実装したところ、UIButtonを押すと、前のViewControllerに戻れました。 やはり、原因は、WeBView上の戻るボタン(app://close)を認識できていないためでしょうか? 最悪、WebView上の戻るボタンの上にUIButtonを無色で配置して処理させるしかないかなぁと考えています。
okenProg

2015/06/12 09:56

まず、shouldStartLoadWithRequestは呼ばれていますか? NSLogを埋め込むか、ブレークポイント置くなどして確認してください。 呼ばれているのに画面が閉じられていない場合は、 HTMLから飛んできているURLがおかしいかもしれません。 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { NSLog(@"shouldStartLoadWithRequest In"); NSLog(@"URL=%@", request.URL); if ([request.URL.scheme isEqualToString:@"app"]) { NSLog(@"app In"); // ~のところの判定 if ([request.URL.host isEqualToString:@"reload"]) { NSLog(@"reload In"); [webView reload]; } else if ([request.URL.host isEqualToString:@"close"]) { NSLog(@"close In"); [self dismissViewControlleAniamted:YES completion:nil]; } NSLog(@"shouldStartLoadWithRequest Out"); // アプリとの連携の場合はリンク先に飛ばないようにNOを返す return NO; } NSLog(@"app Out"); return YES; } もしもHTMLでリンクをクリックしているのにshouldStartLoadWithRequestが呼ばれていない場合は、webViewにデリゲートが設定できていないです。 self.webViewに正しく値が入っているか確認して下さい。 - (void)viewDidLoad { [super viewDidLoad]; if self.webView == nil { NSLog(@"webViewが設定されていません。ストーリーボードでアウトレットを繋げて下さい"); } else { // デリゲートを設定 self.webView.delegate = self } }
Satochan24

2015/06/15 04:22

丁寧なご回答、ありがとうございました。すいません。返事頂いたのなかなか気づきませんでした。 無事、解決しました。やはり、メソッドが呼ばれていませんでした! その原因が・・・ メソッドのwebViewという名前の部分を全て、自分のUIWebViewプロパティ名に変えていたためでした。ここは変えてはいけない固定のメソッド名なんですね。2番目以降のwebViewは引数名なので変えてもいいと他の方からも言われました。 何度も大変お手数おかけしました。今後は、NSLogの設定なども追加し、呼ばれているかどうかもステップインなどの機能で確認するようにします。 有難うございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問