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

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

新規登録して質問してみよう
ただいま回答率
85.50%
iOS

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

Xcode

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

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

3回答

942閲覧

いつViewControllerはインスタンス化されるのか(Swift, Xcode)

bell96

総合スコア13

iOS

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

Xcode

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

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

2クリップ

投稿2018/08/21 08:32

編集2018/08/21 08:44

イメージ説明
イメージ説明
Xcodeを使ったアプリ開発全体に言えるのですが、Main.storyboard上のViewControllerのコーディング画面は上記の画像のように①それを一つのクラスとして②そこで行う処理や情報をそのクラスの中に書いていくというプロセスを辿っていますよね。これに関して質問が二つあります。

1 このクラスはいつインスタンス化されるのか
入門書などで文法を解説したものを見ると、その多くが「まずはクラスを宣言して、それをインスタンス化して初めて実体として現れる」というようなことを書いていますが、この例ではクラスを宣言しただけでインスタンス化していませんよね。この処理はXcodeが裏でやっているのだと思うのですがそれはどのタイミングでしょうか。

2 メソッドはいつ呼び出されるのか
これも入門書では、「メソッドは定義しただけではダメでそれを呼び出さないといけない」と書いてありますが、この例ではそれもありません。いくつかサンプルアプリを作っていく中で、メソッドでも「ユーザーの特定の動作に対して自動的に呼び出されるもの」と「自分で呼び出してあげないといけないもの」の二種類があることがわかってきたのですが、その区別はどこでつければ良いのでしょうか。それぞれ暗記しても良いのですが、自分の知らない機能を搭載したアプリを作る機会はたくさんあると思いますし、その際は公式ドキュメントを見ながら使い方を覚えていくのだと思うのですが、公式ドキュメントを見てもどれが自動で呼び出されるのか、自分で呼び出す必要があるのかがわかりにくいです。みなさんはどうやって情報を仕入れているのでしょうか。

以上二つが質問になります。よろしくお願いいたします。

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

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

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

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

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

fuzzball

2018/08/21 08:41

「メソッドは定義しただけではダメでそれを宣言しないといけない」の意味が分かりません。「呼び出さないといけない」の間違いでしょうか?
bell96

2018/08/21 08:43

はい。「呼び出さないといけない」の間違いでした。訂正いたします。ご指摘ありがとうございました。
guest

回答3

0

iOSはよくわからないので1はパス

2ですが、とりあえずはDelegateパターンだけ。

委譲と呼ばれるこのパターンは定められた形式に従って委譲元が委譲先のメソッドを呼び出す方式です。
委譲とは簡単にいうと他の人に頼むことです。
UITableViewControllerは UITableViewDataSourceおよびUITableViewDelegateのふたつのDelegateに対応しています。

ここではUITableViewDataSourceだけ。

UITableViewは内容を表示しようとしたときUITableViewDataSourceに準拠したdataSourceに対しnumberOfSection(:in)メソッドを呼び出しセクションの数を取得します。
そのあともtableView(_:numberOfRowsInSection:)などのメソッドを次々に呼び出して自身が表示すべき内容を取得していきます。

つまり、UITableViewDataSourceのメソッドはあなたではなくUITableViewが呼び出しています。

UITableViewは表示内容を自身ではなく委譲先のdataSourceに頼んで取得しているのです。

これがDelegateパターンです。


このメソッドはいつ呼び出されるのかについてはそれを暗記するというよりも、上のような決まりを覚えるのが正解です。

決まりはAppleのドキュメントなり、ググるなりして調べます。

投稿2018/08/21 09:51

MasakiHori

総合スコア3384

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

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

bell96

2018/08/22 02:09

ありがとうございます。自動で呼び出されるメソッドはdelegateパターンということですね。
guest

0

ドキュメント読むのが近道でしょう。
https://developer.apple.com/jp/documentation/

ただし、読んで理解できるだけの実力は必要ですが。

今回の場合だと、とりあえずこの辺は必要かな。

  • iOS View Controller プログラミングガイド
  • iOS Table View プログラミングガイド

読んでもチンプンカンプンなら、ググって解説記事を読みまくりましょう。
そして手を動かしてコードを書きまくりましょう。

それぞれの質問にも(ざっくり)答えておきます。

1. このクラスはいつインスタンス化されるのか

  • StoryboardのInitial View Controllerが生成される
  • それに紐付いているToDoListViewControllerのインスタンスが生成される

という流れです。(コードしか書かれていないので予想ですが)

2. メソッドはいつ呼び出されるのか

そのコードにある、3つのメソッド全て勝手に呼ばれます。

  • ViewDidLoad()
  • numberOfRows(inSection:)
  • tableView(_:cellForRowAt:)

上に書いたドキュメントを読めば分かります。(たぶん)

投稿2018/08/21 09:18

編集2018/08/21 09:33
fuzzball

総合スコア16731

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

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

bell96

2018/08/22 02:19

質問に答えていただいた上、参照先まで教えてくださってありがとうございます。ドキュメント読みます。
guest

0

ベストアンサー

お二方がすでに充実した回答をされているので自分は少しだけ別視点から。

UIViewControllerには、ライフサイクルというものがあります。
いつViewを読み込むのかとかAutoLayoutはいつで制約を効かせるのかとか質問内容の様にViewControllerはいつインスタンス化するのかとかそんな感じのもの一式をライフサイクルと言います。よく見るのがviewDidLoad()ですね。他にはちょいちょい使われるviewWillAppear()とかもあります。

そしてそのviewDidLoad(),UIViewController.viewの子viewが全部読み込まれた後に呼ばれます。平たくいうとUIViewControllerがインスタンス化された直後に呼ばれます。なのでいつインスタンス化するのかという問いに関しての答えはザックリですがviewDidLoad()の直前という事でいいのではないでしょうか。

ライフサイクルに関しては割と大事なのでググるなりドキュメント読むなりするとスーパーのチラシなんかよりもお得です。

もうちょっと上に行くとmain関数っぽいものがどうとかありますがもうそこまで行くと最初からドキュメント読んでね、となってしまいます。

投稿2018/08/21 15:31

xAxis

総合スコア1349

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

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

bell96

2018/08/22 02:11

ライフサイクルという概念と関連しているということを教えてくださりありがとうございました。ドキュメントにライフサイクルのことが書いてあったので読みます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問