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

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

ただいまの
回答率

90.49%

  • Xcode

    4199questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

  • iOS

    4078questions

    iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

  • Objective-C

    1198questions

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

  • iPhone

    997questions

    iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

storyBoardが使えないwebViewでgoBack/goForwardの実装

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 1,234

vrheiaohv

score 6

Xcodeのコードから作成したWebViewで戻る/進むボタンの実装を
考えています。

storyBoard上であればToolbarにアイコンを置き
controlボタンを押しながら、そのアイコンを引っ張って表示された
goBack/goForwardを利用すればいいのですが
それが使えません。

ホームボタンのコードを見てみると
私も使いこなせるわけではありませんが
毎回作成?(CGRect〜CGRectMake〜scalesPageToFitなどを)しているようです。

webViewがどういった挙動をしているのかわかりませんが
毎回webViewを作成しているのであれば
戻り先のURLなんて保持していないと思うのですがどうでしょうか?

調べてみると今、閲覧しているURLは
取得できるようですから、それをDBに保存
戻る場合は、そのDBに保存された値を読みつつ
新たに今見ていたURLを保存という風にするしかないと
考えています。

この方法以外に何か策はあるのでしょうか?
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

ホームボタンのコードというのがなんのことかわかりませんが、UIWebViewはナビゲーション状態を管理しており、戻り先のURLを保持しています。そして、goBack,goForwardというメソッドを呼び出せば行き来できます。
(参考)
https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIWebView_Class/#//apple_ref/occ/instm/UIWebView/goBack

storyboardを使わなくても、適当なボタンからそのメソッドを呼び出すだけで、戻る/進むボタンを実装できます。


(9/24追記)
コメントエリアでは回答を書きづらいので、追加回答でコメントに対する回答を入れます。

なんか、むちゃくちゃなことをしている印象ですが、たぶん、生成したUIWebViewを自分のViewControllerのプロパティに保持するということをしないでいろいろ試行錯誤しているため、どうしたらいいのかわからなくなっているのだと思います。もしプロパティのことを知らないなら、そこはちゃんと自分で勉強してください。

で、以下のようにしてください。
1. @property (strong, nonatomic) UIWebView *webView;をViewControllerのプロパティに追加する。
2. goHomeButtonメソッドの処理を全部ViewControllerviewDidLoadに移動する。
3. UIWebView *myWebWebView = [[UIWebView alloc]initWithFrame:rect];じゃなく_webView = [[UIWebView alloc]initWithFrame:rect];とし、その後のmyWebWebViewを全部_webViewに変更する。
そうすれば、ストーリーボードで生成したのと同じようにViewControllerに1個だけWebViewを作ることができます。
(今は、ホームボタンを押すたびに新しいWebViewを作り、今あるWebViewの上に重ね置きしています。
これだとホームボタンを押すたびにWebViewが増えていき、やがてメモリ不足になります)

そこまでできたら、戻るボタンを押したときに呼ばれるようにしているgoBackButtonを
以下のようにすればいいだけです。
- (IBAction)goBackButton:(id)sender {
    [_webView goBack];
}
あと、ホームボタンの処理は、
- (IBAction)goHomeButton:(id)sender {
    NSString* urlString = @"http://hoge.hoge";
    NSURL* hogeURL = [NSURL URLWithString: urlString];
    NSURLRequest* myRequest = [NSURLRequest requestWithURL: hogeURL];
    [_webView loadRequest:myRequest];
}
だけでいいです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/09/24 14:10

    コメントありがとうございます。
    参考先から「- (void)goBack」を利用すればいいとわかったので

    - (void)webViewDidFinishLoad:(UIWebView *)myWebWebView
    にならって
    - (void)goBack:(UIWebView *)myWebWebView{
    }
    と書いてみいましたがダメでした。

    ボタンからメソッドを呼び出すと書かれていたので
    - (IBAction)goBackButton:(id)sender {
    }
    として括弧の中に
     - (void)goBack

     - (void)goBack{}
    としてみたり


    ホームへ飛ぶボタンが
    - (IBAction)goHomeButton:(id)sender {
    CGRect rect = self.view.frame;
    UIWebView *myWebWebView = [[UIWebView alloc]initWithFrame:rect];
    UIScreen *screen = [UIScreen mainScreen];
    myWebWebView.frame = CGRectMake(0, 0, screen.applicationFrame.size.width, screen.applicationFrame.size.height);

    myWebWebView.scalesPageToFit = YES;
    myWebWebView.delegate = self;
    [self.view addSubview:myWebWebView];
    NSString* urlString = @"http://hoge.hoge";
    NSURL* hogeURL = [NSURL URLWithString: urlString];
    NSURLRequest* myRequest = [NSURLRequest requestWithURL: hogeURL];
    [myWebWebView loadRequest:myRequest];
    }

    となっていたので、それにならい

    - (IBAction)goBackButton:(id)sender {
    CGRect rect = self.view.frame;
    UIWebView *myWebWebView = [[UIWebView alloc]initWithFrame:rect];
    UIScreen *screen = [UIScreen mainScreen];
    myWebWebView.frame = CGRectMake(0, 0, screen.applicationFrame.size.width, screen.applicationFrame.size.height);

    myWebWebView.scalesPageToFit = YES;
    myWebWebView.delegate = self;
    [self.view addSubview:myWebWebView];
    [myWebWebView goBack];
    }

    などとしてみましたが成功しませんでした。
    すみませんが、どの様にしてメソッドを呼出せばいいのでしょうか?

    キャンセル

  • 2015/09/24 15:02

    追記です。
    http://iphone-tora.sakura.ne.jp/uiwebview.html
    の「// UIWebView例文」を見ると
    [wv goBack];
    に切り替えたらいけるみたいなので
    先のコメントで書きました
    [myWebWebView goBack];
    で間違いがなさそうなのにも関わらず動かないのは
    やはり毎回、webViewを作成しているからでしょうか?

    ちなみにホームボタンのコードというのは上記で書きました
    - (IBAction)goHomeButton:(id)sender {}
    の様なものが大量に記述されているイメージです。
    違いはメソッド名?とアドレス指定部分
    「NSString* urlString = @"http://hoge.hoge";」
    が異なるだけです。

    キャンセル

  • 2015/09/24 17:01

    コメントに対する返信を追加回答に入れておきました。

    キャンセル

  • 2015/09/24 17:49 編集

    再度のコメントありがとうございます。
    おっしゃる通り重ね置きしていると思います。

    初期はTakeOneさんがおっしゃっている通り
    1つのwebViewを使い回していたのですが
    別の処理を付け加える際に(+スキル不足)で
    現在の様に新しいwebViewを作り続ける様になったみたいです。

    [18:11分修正]
    あれから追記して頂いたものでも
    クラッシュしないように修正してみましたが
    どうもHTMLのソースをいじっているようで
    webViewDidFinishLoadまわりで問題が起きる様になりました。

    可能であれば他にバグが出ないとも限らないので
    現在の仕様で戻る・進むボタンを実行したいのですが
    毎度生成している状態では技術的に不可能でしょうか?

    キャンセル

  • 2015/09/24 21:20

    今のやり方を喩えて言えば、新しい仕事をするたびに毎回新しいアルバイト(UIWebView)を雇って、今まで雇っていたバイト君は契約解除も仕事依頼もせず社会保険料だけ払って放ったらかしにしているということですよね。それで、新しいバイト君にいきなり「前にやってた仕事をやってね」と言っても、そりゃ「はぁ?」ってなりますよね。
    何か明確な理由があって、毎回新しいアルバイトを雇うなら、新しいバイト君にこれまでやってきた仕事を引き継ぎ、元のバイト君はきちんと契約解除すればいいです。そこまでちゃんとやれば技術的に不可能ではないと思いますが、仕事の引き継ぎというのは結構面倒な話だと思います。
    UIWebViewは、ちゃんと前の仕事(前に表示したURL)を覚えていて、「前にやってた仕事をやってね」と言うだけでやってくれる賢いアルバイトです。だから、それを使えば簡単にできますよというのが今回のアドバイスです。
    webViewDidFinishLoadで問題が起きるなら、まずはなぜそこで問題が起きるのか原因を調査することが先決だと思います。それが古いバイトを使い続けることによるものであれば、新しいバイトを雇う明確な理由になるかもしれませんし、雇い方の問題ではなく、仕事の成果物の管理方法の問題なのであれば、その点を正して、アルバイトは1人のバイトに任せることで、今までより簡潔に仕事を整理できるかもしれません。
    あなたが作っているアプリの要件や状況は私にはわからないので、共通の認識が持てそうな喩えを使って説明してみました。

    キャンセル

  • 2015/09/24 22:57

    わかりやすい例え大変参考になりました。
    今のところ、
    - (void)webViewDidFinishLoad{}
    では問題が起きず
    - (void)webViewDidFinishLoad:(UIWebView *)webView{}
    では問題が起きる等、ある程度調べられたので
    別枠で質問したいと思います。

    何にせよgoBack関連の問題は
    一応、アルバイトの再雇用という形で落ち着いたので
    ベストアンサーにさせていただきました。

    ありがとうございました。

    キャンセル

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

  • ただいまの回答率 90.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Xcode

    4199questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

  • iOS

    4078questions

    iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

  • Objective-C

    1198questions

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

  • iPhone

    997questions

    iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。