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

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

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

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

iOS

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

Xcode

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

iPhone

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

Q&A

解決済

1回答

2607閲覧

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

vrheiaohv

総合スコア12

Objective-C

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

iOS

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

Xcode

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

iPhone

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

0グッド

1クリップ

投稿2015/09/17 06:48

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

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

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

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

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

この方法以外に何か策はあるのでしょうか?

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

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

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

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

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

guest

回答1

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を
以下のようにすればいいだけです。

Objective

1- (IBAction)goBackButton:(id)sender { 2 [_webView goBack]; 3} 4

あと、ホームボタンの処理は、

Objective

1- (IBAction)goHomeButton:(id)sender { 2 NSString* urlString = @"http://hoge.hoge"; 3 NSURL* hogeURL = [NSURL URLWithString: urlString]; 4 NSURLRequest* myRequest = [NSURLRequest requestWithURL: hogeURL]; 5 [_webView loadRequest:myRequest]; 6} 7 8```だけでいいです。

投稿2015/09/18 11:36

編集2015/09/24 08:00
TakeOne

総合スコア6299

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

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

vrheiaohv

2015/09/24 05: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]; } などとしてみましたが成功しませんでした。 すみませんが、どの様にしてメソッドを呼出せばいいのでしょうか?
vrheiaohv

2015/09/24 06:02

追記です。 http://iphone-tora.sakura.ne.jp/uiwebview.html の「// UIWebView例文」を見ると [wv goBack]; に切り替えたらいけるみたいなので 先のコメントで書きました [myWebWebView goBack]; で間違いがなさそうなのにも関わらず動かないのは やはり毎回、webViewを作成しているからでしょうか? ちなみにホームボタンのコードというのは上記で書きました - (IBAction)goHomeButton:(id)sender {} の様なものが大量に記述されているイメージです。 違いはメソッド名?とアドレス指定部分 「NSString* urlString = @"http://hoge.hoge";」 が異なるだけです。
TakeOne

2015/09/24 08:01

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

2015/09/24 09:22 編集

再度のコメントありがとうございます。 おっしゃる通り重ね置きしていると思います。 初期はTakeOneさんがおっしゃっている通り 1つのwebViewを使い回していたのですが 別の処理を付け加える際に(+スキル不足)で 現在の様に新しいwebViewを作り続ける様になったみたいです。 [18:11分修正] あれから追記して頂いたものでも クラッシュしないように修正してみましたが どうもHTMLのソースをいじっているようで webViewDidFinishLoadまわりで問題が起きる様になりました。 可能であれば他にバグが出ないとも限らないので 現在の仕様で戻る・進むボタンを実行したいのですが 毎度生成している状態では技術的に不可能でしょうか?
TakeOne

2015/09/24 12:20

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

2015/09/24 13:57

わかりやすい例え大変参考になりました。 今のところ、 - (void)webViewDidFinishLoad{} では問題が起きず - (void)webViewDidFinishLoad:(UIWebView *)webView{} では問題が起きる等、ある程度調べられたので 別枠で質問したいと思います。 何にせよgoBack関連の問題は 一応、アルバイトの再雇用という形で落ち着いたので ベストアンサーにさせていただきました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問