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

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

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

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

iOS

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

Q&A

解決済

2回答

1747閲覧

iOSで、viewDidLoadとNavigationControllerのbackボタン及びsegue

tunechan

総合スコア16

Objective-C

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

iOS

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

0グッド

0クリップ

投稿2018/10/12 04:35

iOSのプログラム開発初心者です。
分からないことがあるので教えて下さい。

複数の画面を順に遷移していく場合で、それぞれの画面にUIViewControllerを継承したクラスを紐付けたとき、それぞれのクラスのなかでviewDidLoadメソッドが作られています。このメソッドは各画面が生成されるときに一度だけ呼ばれる理解しておりました。
しかし、下のように画面遷移するプログラム作りで確認したところ、viewDidLoadは、segue で遷移するたびに呼ばれていることが分かりました(最初のViewControllerと2番目のViewController画面中央にあるボタン「Next_View」は次の画面へのsegueです)。ただし、NavigationControllerが勝手に作ってくれるbackボタンでは呼ばれません。
また、最後の画面の「to_Top」はUnwind Segueで、最初の画面に戻りますが、これでもviewDidLoadは呼ばれません。
「back」ボタンでは、メソッドviewWillAppearは呼ばれているようです。

そこで、質問です。
1.書籍を参考にBLE(Bluetooth Low Energy)関連のプログラムを作っています。viewDidLoad内で
self.centralManager = [[CBCentralManager alloc] initWithDelegate:self quece:nill] や
見つけたペリフェラルを入れていくために
self.peripherals = [[NSMutableArray array];
などとインスタンス化していますが、このようなことをするとメモリ上に同じようなインスタンスが、segueで遷移する
たびに作られるので、まずいことなのでしょうか。
2.そもそも、画面ができるときに viewDidLoadが1回だけ呼ばれると理解しておりましたが、segueするたびにviewDidLoad
が呼ばれるということは、そのたびに画面が出来ていくのでしょうか。それとも、アプリの起動時に画面はできており
(インスタンス化されており)、単純に約束事としてsegue遷移でviewDidLoadは呼ばれ、「back」ボタンでは呼ばれな
いだけでしょうか。

  トンチンカンなことを言っているかもしれませんがよろしくお願いいたします。イメージ説明

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

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

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

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

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

guest

回答2

0

おそらく、混乱の原因は3つの画面全てをViewControllerで処理しているからです。

Storyboard上の1個の画面に対して、1個のViewControllerをそれぞれ定義するのがノーマルです。もちろん複数紐付けることも可能ですが、メリットが薄く難度が上がるので、初学時は「普通やらない」と思って良いと思います。

FirstViewController
SecondViewController
ThirdViewController
を作れば、疑問は自ずと解消すると思います。

投稿2018/10/12 06:18

kosanai

総合スコア471

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

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

0

ベストアンサー

viewDidLoadが一度だけ呼ばれる、というのは正しいです。

segue で遷移するたびに呼ばれている

各ViewControllerごとに一度だけ呼ばれているので、おかしくはありません。(なお、「segueで」というのは関係ないです。コードで遷移しても同じです)

backボタンでは呼ばれません
Unwind Segueで、最初の画面に戻りますが、これでもviewDidLoadは呼ばれません

「戻る」というのは、現在のViewControllerを破棄して、元のViewControllerに戻るということです。新たに生成されるViewControllerはありませんので、どのviewDidLoadも呼ばれません。

まとめると、

  • AからBに遷移:Bを生成して遷移。Aは破棄されない。
  • BからAに戻る:Bを破棄してAに戻る。Aは新たに生成されるわけではない。

1については、これを読んだ上でまだ疑問があるようでしたら聞いて下さい。

投稿2018/10/12 04:56

編集2018/10/12 04:57
fuzzball

総合スコア16731

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

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

tunechan

2018/10/12 06:06

fuzzball 様 早速の回答ありがとうございます。 もう少し質問させて下さい。 最後の画面からunwind segue で、最初の画面に戻ったときはviewDidLoadは呼ばれておりませんので最初の画面は存在したままですよね。次にここから2番目の画面にsegueで遷移したとき、プログラムで確認したところ、viewDidLoadは呼ばれています。ということは、このとき2番目の画面は存在しなかったことになりますよね。unwindsegueで破棄されたということでしょうか。 また、NavigationControllerを使わず、A画面とB画面をsegueで遷移するようなプログラムを作ってみました。この場合、遷移のたびにviewDidLoadがよばれています。そのたび次々と新しい画面が出来ているのでしょうか。
fuzzball

2018/10/12 06:11

回答読みましたか? 前半の「もう少し質問させて下さい」については回答に書いてありますし、後半についても「遷移」と「戻る」の違いについて回答に書いています。
fuzzball

2018/10/12 06:35 編集

少し補足しておきます。 「遷移」するというのは、ViewControllerが上に積み重なっていくと思って下さい。(積み木のようなイメージでかまいません) 「戻る」というのは、重ねたViewControllerを取り除くということです。二つ前の画面に「戻る」ということは、上から二つのViewControllerを取り除く(破棄する)ということです。
tunechan

2018/10/12 06:47

fuzzball 様 ありがとうございます。 unwind segue は、「戻る」動作をするものなのですね。 また、NavigationControllerを使わず(「戻る」を使わず)、A画面とB画面をsegueで「遷移」させている場合は、A画面、B画面が積み上がっていくもの(このようなことは、やるべきでない)と理解します。
fuzzball

2018/10/12 07:04

NavigationControllerを使わない場合の「戻る」は、 コードだと dismiss(animated:completion:) を呼びます。 (「戻る」というよりは「閉じる」ですね)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問