読み込み中...

SwiftのviewDidLoad解説!初心者でもわかる10選のサンプルコード

Swiftプログラム内のviewDidLoadメソッドのイメージ図 Swift
この記事は約26分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

本記事のサンプルコードを活用して機能追加、目的を達成できるように作ってありますので、是非ご活用ください。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を満たす現役のプログラマチームによって監修されています。

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

Swiftを学ぶ多くの開発者が直面するのが、viewDidLoadメソッドの理解と活用です。

このメソッドはiOSアプリの開発において、画面が読み込まれる際の初期設定を行うための重要なメソッドです。

しかし、初心者にとっては、その使い方や役割、さらには注意点などが一見複雑に見えることもあります。

本記事では、SwiftでのviewDidLoadメソッドの詳細な解説と、初心者でも容易に理解できる10選のサンプルコードを提供します。

Swiftの基本からviewDidLoadの応用まで、順を追ってじっくりと学んでいきましょう。

●Swiftとは

SwiftはAppleが開発したプログラミング言語で、iOS、macOS、watchOS、tvOSなどのAppleの製品向けのアプリケーション開発に使用されます。

Objective-Cの後継言語として2014年に発表され、安全性や効率、シンプルさを重視した設計がされています。

○Swiftの特徴

Swiftには次のような特徴があります。

  • 型安全:Swiftは、プログラムが実行される前に型の問題を検出・回避するための機能が豊富に備えられています。
  • 高速:最新のコンピュータアーキテクチャに最適化されており、Objective-CやPythonよりも高速に動作します。
  • モダンな構文:読みやすく、簡潔なコードを書けるように設計されています。

このコードではSwiftでの簡単な変数宣言と文字列の出力を行っています。

この例では文字列”Hello, Swift!”を出力しています。

let greeting = "Hello, Swift!"
print(greeting)

このサンプルコードを実行すると、”Hello, Swift!”という文字列がコンソールに出力されます。

○Swiftの基本構文

Swiftの基本的な構文には次のようなものがあります。

  • 変数と定数:Swiftではvarを用いて変数を、letを用いて定数を宣言します。

このコードでは数字の加算を行っています。

この例では5と3を加算して結果を出力しています。

let num1 = 5
let num2 = 3
let result = num1 + num2
print(result)

このサンプルコードを実行すると、8という数字がコンソールに出力されます。

●viewDidLoadとは

SwiftのiOSアプリケーション開発を行う際、UIViewControllerのライフサイクル内で特に重要な役割を持つメソッドがviewDidLoadです。

このメソッドは、ビューコントローラのライフサイクルにおける初期化のフェーズで呼び出されるものです。

具体的には、ビューコントローラのビューがメモリにロードされた直後に一度だけ呼び出されるものとなっています。

○viewDidLoadの役割と基本

viewDidLoadは、その名前の通り、ビューが完全にロードされた時点で呼び出されるメソッドです。

このメソッドの主な使い道は、次のようなケースが挙げられます。

  1. UIの初期設定:画面表示の前に行いたい初期化処理やUIコンポーネントの設定を行う際に利用されます。例としては、テーブルビューのデータソースやデリゲートの設定、初期表示のラベルテキストの設定などが該当します。
  2. リソースの読み込み:画像やデータベースの内容を読み込む際の初期化処理を行う場面でも使用されます。
  3. 外部ライブラリの設定:一部の外部ライブラリやフレームワークの初期化を行う場合、ここでの設定が求められることもあります。

viewDidLoad内で行うべきでない処理もあります。

その中で特に注意すべきは、ビューのサイズや位置に関わる処理です。

ビューのレイアウトが完全に決まっていないこのタイミングでサイズや位置に関する処理を行うと、予期しない動作や表示の崩れを引き起こす可能性があります。

このviewDidLoadメソッドがいつ、どのようにして呼び出されるのかを理解することは、SwiftのiOSアプリケーション開発において非常に重要です。

これにより、アプリケーションの動作を予測しやすくなり、効果的なコーディングを進めることができます。

●viewDidLoadの使い方

viewDidLoadは、UIViewControllerのインスタンスがそのviewをメモリにロードした後に呼び出されるメソッドです。

具体的には、ストーリーボードやXIBを使用して画面を設計した際、その画面が初めて表示される前に一度だけ呼び出されるのが特徴です。

viewDidLoadは初期化のロジックやUIの設定など、画面表示前の準備作業に最適なタイミングで実行されるコードを記述する場所として使用されます。

○サンプルコード1:viewDidLoadの基本的な使い方

下記のコードは、viewDidLoadの中でラベルのテキストを設定するシンプルな例を表しています。

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var label: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        // ラベルのテキストを設定
        label.text = "viewDidLoad内で設定されました"
    }
}

このコードではUILabelのインスタンスがviewDidLoad内でテキストを設定しています。

この例ではラベルに”viewDidLoad内で設定されました”という文字列を表示しています。

画面が表示されると、中央に「viewDidLoad内で設定されました」と表示されるラベルが確認できるでしょう。

○サンプルコード2:viewDidLoadでのラベル配置

viewDidLoadでは、UIの配置やスタイルの調整も行うことができます。

下記のコードは、viewDidLoadの中でラベルを動的に生成し、配置を行う例を表しています。

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // ラベルの生成
        let dynamicLabel = UILabel(frame: CGRect(x: 20, y: 100, width: 280, height: 40))
        dynamicLabel.text = "動的に生成されたラベル"
        dynamicLabel.backgroundColor = .yellow
        dynamicLabel.textAlignment = .center

        // viewにラベルを追加
        self.view.addSubview(dynamicLabel)
    }
}

このコードではCGRectを使ってラベルの位置とサイズを指定し、動的にラベルを生成しています。

この例では画面の上部から100ポイントの位置に、幅280、高さ40の黄色い背景のラベルを配置して、「動的に生成されたラベル」という文字列を表示しています。

アプリを起動すると、指定した位置に黄色い背景のラベルが表示され、「動的に生成されたラベル」という文字列が読めるはずです。

○サンプルコード3:viewDidLoadでのボタンアクション設定

SwiftにおけるviewDidLoadメソッドの中でボタンのアクションを設定する際の実例を、下記のサンプルコードで紹介します。

このコードでは、ボタンを生成し、タップ時のアクションを設定しています。

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // ボタンの生成
        let button = UIButton(frame: CGRect(x: 100, y: 100, width: 200, height: 50))
        button.setTitle("タップしてください", for: .normal)
        button.backgroundColor = .blue

        // ボタンのアクション設定
        button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)

        // ビューにボタンを追加
        self.view.addSubview(button)
    }

    // ボタンタップ時のアクション
    @objc func buttonTapped() {
        print("ボタンがタップされました。")
    }
}

このコードでは、まずUIButtonを生成しています。

その後、ボタンの見た目や位置の設定を行っています。

最も注目すべき部分は、addTargetメソッドを使用してボタンのタップ時のアクションを設定している点です。

#selector(buttonTapped)により、ボタンがタップされた際にbuttonTappedメソッドが呼ばれるようになっています。

実行すると、画面上に「タップしてください」と書かれた青色のボタンが表示されます。

このボタンをタップすると、コンソールに「ボタンがタップされました。」と表示されることが確認できます。

○サンプルコード4:viewDidLoad内での条件分岐

時々、viewDidLoadの中で特定の条件に基づいて処理を分岐させたい場面があります。

下記のサンプルコードでは、ユーザの設定に応じて異なるメッセージのラベルを表示しています。

import UIKit

class ViewController: UIViewController {

    var isUserPremium: Bool = false // ユーザがプレミアム会員かどうかを示すフラグ

    override func viewDidLoad() {
        super.viewDidLoad()

        let label = UILabel(frame: CGRect(x: 50, y: 50, width: 250, height: 50))

        // ユーザのプレミアム会員の有無による条件分岐
        if isUserPremium {
            label.text = "プレミアム会員です。"
        } else {
            label.text = "一般会員です。"
        }

        self.view.addSubview(label)
    }
}

この例では、isUserPremium変数を使用して、ユーザがプレミアム会員であるかどうかを判断しています。

その結果に応じて、UILabelのテキストを設定しています。

実行すると、画面上にユーザの会員ステータスに応じたメッセージが表示されることが確認できます。

○サンプルコード5:viewDidLoadでのアニメーション処理

viewDidLoad内でアニメーションを設定する場合の実例を紹介します。

この例では、画面上に表示されるラベルがフェードインするアニメーションを実装しています。

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let label = UILabel(frame: CGRect(x: 50, y: 50, width: 250, height: 50))
        label.text = "フェードインします。"
        label.alpha = 0 // 最初は透明に設定

        self.view.addSubview(label)

        // アニメーションの設定
        UIView.animate(withDuration: 2.0) {
            label.alpha = 1.0 // フェードイン
        }
    }
}

このコードでは、まずラベルを透明に設定してから、UIView.animateメソッドを使用してアニメーションを実行しています。

アニメーションの実行には2秒かかり、その間にラベルが徐々に表示されるようになっています。

実行すると、画面上に「フェードインします。」というメッセージのラベルが徐々に表示されることが確認できます。

●viewDidLoadの応用例

SwiftのviewDidLoadは非常に重要なライフサイクルメソッドの一つです。

初心者がSwiftのviewDidLoadを完全に理解するためには、基本的な使い方だけでなく、さまざまな応用例を知ることが必要です。

ここでは、viewDidLoadの応用例を2つのサンプルコードを通して詳しく解説していきます。

○サンプルコード6:viewDidLoadを使ったデータの取得と更新

通常、アプリケーションの初期化やデータの取得・更新などはviewDidLoad内で行うことが多いです。

下記のサンプルコードは、viewDidLoadを使用してデータを取得し、そのデータをもとにラベルのテキストを更新するシンプルな例です。

import UIKit

class ViewController: UIViewController {
    // ラベルのインスタンスを生成
    var label: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        // ラベルの初期設定
        label = UILabel(frame: CGRect(x: 0, y: 0, width: 200, height: 50))
        label.center = view.center
        view.addSubview(label)

        // データの取得と更新
        let data = fetchData()
        label.text = data
    }

    func fetchData() -> String {
        // 実際には外部からデータを取得するコードになるでしょう。
        // 今回はシンプルに文字列を返すだけのダミーコードとしています。
        return "取得したデータ"
    }
}

このコードでは、UILabelのインスタンスを作成して、viewDidLoad内でデータを取得するfetchDataメソッドを呼び出しています。

取得したデータは、ラベルのテキストとして表示されます。

実際にはfetchDataメソッドの中身を外部のAPIなどからデータを取得する処理に置き換えることができます。

このコードを実行すると、画面中央に「取得したデータ」という文字列が表示される結果となります。

○サンプルコード7:viewDidLoad内での複数コンポーネントの管理

一つの画面内で複数のコンポーネントを扱う場面も多いです。

viewDidLoad内でこれらのコンポーネントの初期設定や管理を行うことができます。

下記のサンプルコードでは、2つのボタンと1つのラベルをviewDidLoad内で設定しています。

import UIKit

class ViewController: UIViewController {
    var button1: UIButton!
    var button2: UIButton!
    var label: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        // ボタン1の設定
        button1 = UIButton(frame: CGRect(x: 50, y: 100, width: 100, height: 50))
        button1.setTitle("ボタン1", for: .normal)
        button1.addTarget(self, action: #selector(onButton1Clicked), for: .touchUpInside)
        view.addSubview(button1)

        // ボタン2の設定
        button2 = UIButton(frame: CGRect(x: 200, y: 100, width: 100, height: 50))
        button2.setTitle("ボタン2", for: .normal)
        button2.addTarget(self, action: #selector(onButton2Clicked), for: .touchUpInside)
        view.addSubview(button2)

        // ラベルの設定
        label = UILabel(frame: CGRect(x: 0, y: 250, width: view.bounds.width, height: 50))
        label.textAlignment = .center
        view.addSubview(label)
    }

    @objc func onButton1Clicked() {
        label.text = "ボタン1がクリックされました"
    }

    @objc func onButton2Clicked() {
        label.text = "ボタン2がクリックされました"
    }
}

このコードでは、ボタン1とボタン2が設置され、それぞれクリックされたときにラベルのテキストが更新されるようになっています。

ボタンをクリックすると、それに応じてラベルのテキストが「ボタン1がクリックされました」または「ボタン2がクリックされました」と表示される結果となります。

○サンプルコード8:viewDidLoadでの外部ライブラリ活用

Swiftのプログラムを実装する際、多くの場面で外部ライブラリの活用が考えられます。

例えば、画像のダウンロードやキャッシュ管理などを効率的に実装したい場合、外部ライブラリを活用することで劇的に開発速度や品質を向上させることができます。

ここでは、有名な画像ダウンロードライブラリ「SDWebImage」を利用して、viewDidLoad内で画像を非同期にダウンロードし表示するサンプルコードを紹介します。

まず、SDWebImageをプロジェクトに追加する必要があります。

この追加は、通常CocoaPodsやSwift Package Managerを利用して行います。

ここではviewDidLoad内でのSDWebImageの基本的な利用方法を表すコードを紹介します。

import UIKit
import SDWebImage

class ViewController: UIViewController {

    @IBOutlet weak var imageView: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // URLから画像を非同期にダウンロードし、imageViewにセットする
        let url = URL(string: "https://example.com/sample.jpg")
        imageView.sd_setImage(with: url, completed: nil)
    }
}

このコードでは、SDWebImageを使ってimageViewに非同期で画像をセットしています。

この例ではhttps://example.com/sample.jpgから画像をダウンロードし、imageViewに表示します。

外部ライブラリを使用する際の大きなメリットは、ライブラリが提供する多様な機能を手軽に利用できることです。

特にSDWebImageは、画像のキャッシュ管理やGIFのアニメーション対応など、多くの便利な機能を持っています。

○サンプルコード9:viewDidLoadを利用したAPI通信の実装

アプリケーション開発では、サーバとの通信を行いデータを取得することが多々あります。

viewDidLoadは、画面の初期化時に一度だけ呼び出されるメソッドであるため、このタイミングでAPI通信を行う場合もあります。

ここでは、viewDidLoad内でAPIを呼び出し、取得したデータを表示するサンプルコードを紹介します。

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var dataLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        // APIのURL
        let url = URL(string: "https://api.example.com/data")!

        // URLSessionを使用してAPIを呼び出す
        URLSession.shared.dataTask(with: url) { (data, response, error) in
            guard let data = data else { return }
            do {
                let result = try JSONDecoder().decode([String: String].self, from: data)
                DispatchQueue.main.async {
                    self.dataLabel.text = result["key"]
                }
            } catch {
                print("Error: \(error)")
            }
        }.resume()
    }
}

このコードでは、https://api.example.com/dataというAPIを呼び出し、取得したデータの中からkeyというキーの値をdataLabelに表示しています。

○サンプルコード10:viewDidLoad内での複雑なUI設定

viewDidLoadは、基本的に画面の初期化時に一度だけ呼び出されるメソッドです。

このため、ここでのUIの設定や初期値の設定は重要となります。

特に、多くのUIコンポーネントが存在する複雑な画面の場合、viewDidLoad内での設定が肝心となります。

下記のサンプルコードは、複数のUIコンポーネントを持つ画面のviewDidLoad内での設定方法を表しています。

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var tableView: UITableView!
    @IBOutlet weak var searchBar: UISearchBar!

    var data: [String] = []

    override func viewDidLoad() {
        super.viewDidLoad()

        // TableViewのデリゲートとデータソースの設定
        tableView.delegate = self
        tableView.dataSource = self

        // SearchBarのデリゲート設定
        searchBar.delegate = self

        // 初期データの設定
        data = ["Apple", "Orange", "Banana", "Grape"]
    }
}

extension ViewController: UITableViewDataSource, UITableViewDelegate {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return data.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        cell.textLabel?.text = data[indexPath.row]
        return cell
    }
}

extension ViewController: UISearchBarDelegate {
    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        data = data.filter { $0.contains(searchText) }
        tableView.reloadData()
    }
}

このコードでは、UITableViewUISearchBarを持つ画面を作成しています。

viewDidLoadで、TableViewのデリゲート、データソース、SearchBarのデリゲートを設定し、初期データもセットしています。

その後、UITableViewとUISearchBarの動作に関する処理をextensionを用いて実装しています。

●注意点と対処法

Swiftを学ぶ過程で、viewDidLoadに関する注意点とその対処法について深く知ることは非常に重要です。

特に初心者の方々が遭遇しやすい問題や、Swiftの実践で頻繁に直面するようなケースを中心に、サンプルコードとともに具体的に解説していきます。

○viewDidLoadが複数回呼び出される時の対処法

viewDidLoadは、ビューコントローラのビューがメモリ上にロードされた直後に1回だけ呼び出されるメソッドです。

しかし、場合によっては意図しないタイミングで複数回呼び出されることがあります。そのような場合の対処法について学びましょう。

このコードでは、viewDidLoadの呼び出し回数をカウントして、ラベルに表示しています。

この例では、viewDidLoadがいつ、どれだけの回数呼び出されるかを確認するためのデバッグ用のサンプルとなっています。

import UIKit

class ViewController: UIViewController {

    var loadCount = 0
    @IBOutlet weak var countLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        loadCount += 1
        countLabel.text = "viewDidLoadが呼ばれた回数: \(loadCount)"
    }
}

このサンプルコードの実行結果、viewDidLoadが1回しか呼ばれていなければ、ラベルには”viewDidLoadが呼ばれた回数: 1″と表示されます。

しかし、何らかの理由で複数回呼び出される場合、その回数が増加することを確認できます。

対処法としては、viewDidLoad内の処理を適切に分離し、状態の変化や更新に関する処理を他の適切なメソッド、例えばviewWillAppearviewDidAppearなどに移動させることを考慮してください。

○viewDidLoad内でのメモリ管理の注意点

viewDidLoad内での処理は、特にメモリの管理に関して注意が必要です。

不適切なメモリ管理は、アプリのパフォーマンス低下やクラッシュの原因となる可能性があります。

このコードでは、viewDidLoad内で大量のデータを取り扱う際のメモリの取り扱いを表しています。

この例では、大量の画像データを配列に格納し、それを表示する処理を行っています。

import UIKit

class ViewController: UIViewController {

    var images: [UIImage] = []

    override func viewDidLoad() {
        super.viewDidLoad()
        for _ in 1...10000 {
            if let image = UIImage(named: "sampleImage") {
                images.append(image)
            }
        }
    }
}

このサンプルコードの実行結果、大量のメモリを消費し、アプリが不安定になる恐れがあります。

対処法としては、使用しなくなったオブジェクトを適切に解放すること、または必要なデータのみをロードして、残りは必要に応じて取得するようにするなど、メモリ効率を考慮したプログラミングが求められます。

また、ARC(Automatic Reference Counting)を理解し、強参照、弱参照を適切に使い分けることも重要です。

●カスタマイズ方法

viewDidLoadメソッドは、UIViewControllerのライフサイクルの一部としてiOS開発において非常に重要な役割を果たしています。

しかし、標準の動作だけでなく、必要に応じてカスタマイズすることが求められる場面も少なくありません。

ここでは、viewDidLoadのカスタマイズ方法に関して、拡張方法とオーバーライドの場面と注意点をサンプルコードを交えて詳しく解説します。

○viewDidLoadの拡張方法

Swiftには、メソッドやプロパティを拡張する仕組みがあります。

これを使用して、viewDidLoadメソッドを拡張することで、機能を追加したり既存の機能を改良することが可能です。

例として、viewDidLoad内での初期化処理にログ出力を追加する拡張を考えます。

extension UIViewController {
    func viewDidLoadWithLog() {
        self.viewDidLoad() // 元のviewDidLoadメソッドを呼び出し
        print("viewDidLoadが呼び出されました")
    }
}

このコードでは、UIViewControllerを拡張し、新しいメソッドとしてviewDidLoadWithLogを追加しています。

この例では、元のviewDidLoadメソッドを呼び出し後、ログ出力を行っています。

このようにして、必要に応じたカスタマイズを容易に実現することができます。

○viewDidLoadをオーバーライドする場面と注意点

viewDidLoadメソッドは、オーバーライドすることが可能です。

しかし、オーバーライドする際にはいくつかの注意点が必要です。

  1. オーバーライドした場合でも、必ずsuperのviewDidLoadメソッドを呼び出すこと。これを怠ると、親クラスでの初期化処理が行われなくなり、思わぬバグの原因となる可能性があります。
  2. viewDidLoad内での重い処理は避けること。viewDidLoadは画面の表示前に呼ばれるため、重い処理を行うとアプリの動作が遅くなる可能性があります。
  3. オーバーライドする際には、既存の機能を破壊しないように注意深く実装すること。

まとめ

SwiftのviewDidLoadメソッドは、UIViewControllerのライフサイクルにおける中心的な役割を果たします。

このメソッドの正確な動作やカスタマイズ方法を理解することは、効果的なiOSアプリ開発にとって重要です。

今回の解説を通じて、viewDidLoadの基本的な使い方からカスタマイズのテクニックまでを学ぶことができたかと思います。

特に、拡張方法やオーバーライド時の注意点に関しては、日常の開発作業でのトラブルを防ぐためにも抑えておきたいポイントです。

Swift開発におけるviewDidLoadの知識を深め、より質の高いアプリケーションを作成していきましょう。