Swiftで遷移元画面への戻り方!初心者向け12選のサンプルコード

Swiftのロゴと、画面遷移のアイコンが合成されているイメージSwift
この記事は約34分で読めます。

 

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

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

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

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

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

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

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

はじめに

Swiftのプログラミングにおいて、画面遷移は頻繁に行われるタスクの1つです。

特に、複数の画面間でのナビゲーションを実装する際には、画面間の遷移と遷移元画面への戻る動作は必須となります。

この記事を読めば、Swiftでの遷移元画面への戻り方をマスターすることができるようになります。

初心者の方でも安心して取り組めるよう、基礎から応用までをわかりやすく解説します。

●Swiftの画面遷移とは

アプリケーションを使っていると、1つの画面だけではなく、複数の画面が存在し、それらの間で移動することがよくあります。

例えば、メールアプリで受信トレイからメールの詳細、そして返信画面へと移動するのも、画面遷移の一例です。

○画面遷移の基本

画面遷移の基本として、まず遷移する前の画面と遷移後の画面、この2つを理解することが重要です。

遷移する前の画面を「遷移元」と呼び、遷移後の画面を「遷移先」と呼びます。

□遷移とは

遷移とは、アプリケーション内で1つの画面から別の画面へ移動することを指します。

ユーザーがボタンをタップしたり、特定のアクションを行うことで、新しい画面が表示されるのが一般的な遷移の形です。

□遷移元と遷移先

遷移元は、遷移する前の画面を指します。

これは、ユーザーが何らかのアクションを行う前の画面として表示されているものです。

一方、遷移先は、ユーザーがアクションを行った後に表示される新しい画面を指します。

この遷移先の画面は、情報の詳細や、新しい操作を提供するためのものとなります。

●Swiftでの遷移元画面への戻り方

Swiftにおけるアプリケーション開発では、多くの画面を持つことが一般的です。

ユーザーがスムーズにアプリを使用するためには、適切な画面遷移と、必要に応じて遷移元の画面へ戻ることが求められます。

Swiftには、この「戻る」動作を実現するための多彩な方法が提供されており、それぞれのシチュエーションに合わせて適切な方法を選択することが重要です。

ここでは、Swiftでの遷移元画面への戻り方を、具体的なサンプルコードを交えて解説します。

○サンプルコード1:基本的な戻る動作

Swiftの最も基本的な「戻る」動作は、Navigation Controllerを使用したものです。

ここでは、Navigation Controllerを使用して遷移元画面へ戻るためのサンプルコードを紹介します。

@IBAction func backButtonTapped(_ sender: UIButton) {
    self.navigationController?.popViewController(animated: true)
}

このコードでは、navigationControllerpopViewController(animated:)メソッドを使って、現在の画面を閉じ、遷移元の画面へ戻ります。

animated: trueとすることで、アニメーションを伴って戻る動作が実現されます。

実行すると、ボタンをタップするとアニメーション付きで一つ前の画面に戻ります。

○サンプルコード2:ナビゲーションコントローラを使った戻る動作

ナビゲーションコントローラは、多くの画面遷移を持つアプリケーションで非常に便利なツールです。

下記のサンプルコードは、ナビゲーションコントローラの戻るボタンをカスタマイズして、特定の動作を行った後に遷移元の画面へ戻る方法を表しています。

override func viewDidLoad() {
    super.viewDidLoad()

    self.navigationItem.leftBarButtonItem = UIBarButtonItem(title: "戻る", style: .plain, target: self, action: #selector(self.customBackAction))
}

@objc func customBackAction() {
    // 何らかのカスタム動作
    print("カスタム動作を実行")

    // 遷移元の画面へ戻る
    self.navigationController?.popViewController(animated: true)
}

このコードでは、navigationItem.leftBarButtonItemを使用して、戻るボタンをカスタマイズしています。

customBackActionメソッドが呼び出されると、カスタム動作としてprint関数が実行され、その後、遷移元の画面へ戻ります。

実行すると、ナビゲーションバーの戻るボタンをタップすると、「カスタム動作を実行」とコンソールに表示され、遷移元の画面へと戻ります。

○サンプルコード3:遷移元にデータを渡しながら戻る

画面遷移時に遷移先から遷移元へデータを渡すことは、アプリケーションの使い勝手を向上させるための重要な機能です。

例えば、設定画面からメイン画面に戻る際に、ユーザーが設定した内容を反映するようなケースが考えられます。

Swiftでは、このようなデータの受け渡しをスムーズに行うための方法がいくつか存在します。

ここでは、デリゲートパターンを用いて、遷移元にデータを渡しながら戻る方法を解説します。

□デリゲートパターンとは

デリゲートパターンは、一つのオブジェクトが特定のタスクや通知の責任を別のオブジェクトに委ねる設計パターンです。

SwiftのUIKitでは、このデリゲートパターンが頻繁に利用されており、特に画面遷移において、データの受け渡しやイベントのハンドリングに用いられます。

ここでは、デリゲートを使用して、遷移先から遷移元へデータを渡すためのサンプルコードを紹介します。

// 遷移元画面
class OriginViewController: UIViewController, DestinationDelegate {

    func dataReceived(data: String) {
        print("受け取ったデータ: \(data)")
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let destinationVC = segue.destination as? DestinationViewController {
            destinationVC.delegate = self
        }
    }
}

// 遷移先画面
protocol DestinationDelegate {
    func dataReceived(data: String)
}

class DestinationViewController: UIViewController {

    var delegate: DestinationDelegate?

    @IBAction func backButtonTapped(_ sender: UIButton) {
        delegate?.dataReceived(data: "サンプルデータ")
        self.dismiss(animated: true, completion: nil)
    }
}

上記のサンプルコードでは、DestinationDelegateというプロトコルを定義し、その中にdataReceived(data: String)というメソッドを宣言しています。

遷移先のDestinationViewControllerでは、このデリゲートを使用して、データを遷移元のOriginViewControllerに渡しています。

実行すると、DestinationViewControllerbackButtonTappedメソッドが呼び出されると、「受け取ったデータ: サンプルデータ」というメッセージがOriginViewControllerのコンソールに表示されます。

これにより、遷移元の画面で遷移先から受け取ったデータを利用することができます。

○サンプルコード4:モーダル遷移からの戻り方

Swiftにおけるモーダル遷移は、画面全体を覆う形で新しいビューコントローラが表示される遷移方法です。

モーダル遷移では、通常、遷移先の画面には「閉じる」や「キャンセル」などのボタンが配置され、これをタップすることで遷移元の画面へ戻ることができます。

下記のサンプルコードは、モーダル遷移を使用して遷移先の画面から遷移元の画面へ戻る方法を表しています。

class ModalDestinationViewController: UIViewController {

    @IBAction func closeButtonTapped(_ sender: UIButton) {
        self.dismiss(animated: true, completion: nil)
    }
}

このコードでは、dismiss(animated:completion:)メソッドを使って、モーダルで表示されているModalDestinationViewControllerを閉じ、遷移元の画面へ戻ります。

実行すると、ModalDestinationViewControllerに配置された「閉じる」ボタンをタップすると、アニメーションを伴って遷移元の画面へと戻ります。

○サンプルコード5:セグを使った戻り方

Swiftの開発環境であるXcodeには、画面遷移を容易にするためのツールとして「セグ(segue)」が提供されています。

セグはストーリーボード上での画面遷移を簡単に実装するための機能で、遷移先の画面への引き渡しや戻る動作もこれを利用して実現できます。

セグを利用した戻る方法には、unwind segueと呼ばれる特定のセグを使用します。

unwind segueは、特定の画面へ戻るためのセグで、画面遷移のチェーンを逆に辿って遷移元の画面に戻る動作を実現します。

□セグを使用して戻るための手順

  1. 遷移元のViewControllerに、@IBActionを持つメソッドを定義する。
  2. ストーリーボード上で、遷移先のViewControllerの「Exit」アイコンと、1で定義したメソッドを接続する。

ここでは、セグを使用して遷移元の画面へ戻るためのサンプルコードを紹介します。

// 遷移元のViewController
class SourceViewController: UIViewController {

    // セグを使って戻るためのアクション
    @IBAction func unwindToSource(segue: UIStoryboardSegue) {
        // 必要に応じて遷移先からのデータを受け取る処理を記述
    }
}

// 遷移先のViewController
class DestinationViewController: UIViewController {
    // ボタンアクションやその他のメソッドから直接戻る動作は不要
}

上記のサンプルコードでは、遷移元としてSourceViewControllerを、遷移先としてDestinationViewControllerを定義しています。

SourceViewController内にunwindToSourceという名前の@IBActionメソッドを定義しておき、このメソッドにセグを接続することで、DestinationViewControllerからSourceViewControllerへの戻り動作を実現しています。

実行すると、DestinationViewControllerからSourceViewControllerへの戻り動作が可能になります。

具体的には、DestinationViewControllerの任意のボタン等のUI部品のアクションからストーリーボード上でunwindToSourceセグをトリガーすることで、戻る動作が実行されます。

○サンプルコード6:プログラム上からの遷移戻り

プログラム的な操作で画面遷移を行う場合、具体的には、条件に応じて自動的に画面を戻したいといった場合に、コード上から遷移元への戻り動作を制御することが考えられます。

下記のサンプルコードは、プログラム上から遷移元の画面へ戻る方法を表しています。

class ProgrammaticallyReturnViewController: UIViewController {

    // 何らかの条件を満たした際の動作
    func someConditionMet() {
        // ナビゲーションコントローラを使用している場合の戻る動作
        self.navigationController?.popViewController(animated: true)

        // モーダル遷移を使用している場合の戻る動作
        self.dismiss(animated: true, completion: nil)
    }
}

このコードでは、ProgrammaticallyReturnViewController内のsomeConditionMetメソッドが条件を満たした際に、遷移元の画面へ戻る動作を実行しています。

ナビゲーションコントローラを使用している場合と、モーダル遷移を使用している場合の2つの戻り動作の方法を表しています。

実行すると、ProgrammaticallyReturnViewController内で何らかの条件が満たされた際に、遷移元の画面への戻り動作が自動的に実行されます。

このように、プログラム上からの操作で画面遷移を制御することで、柔軟なユーザーエクスペリエンスを提供することが可能となります。

○サンプルコード7:遷移元のビューを更新して戻る

Swiftの画面遷移では、遷移先の画面から遷移元の画面へ戻る際に、特定のデータや状態を更新したい場面が多々あります。

例えば、設定画面からメインの画面へ戻るときに、設定内容を反映させたいといったケースです。

そのための手法として、遷移元のビューを更新して戻る方法を解説します。

このコードでは、遷移元の画面へ戻る際に、デリゲートパターンを利用して遷移元のビューを更新する方法を示しています。

まず、遷移元のViewControllerにはデリゲートメソッドを定義します。

このメソッドは、遷移先のViewControllerから呼び出され、遷移元のビューの更新を行います。

// 遷移元のViewController
class OriginViewController: UIViewController, DataUpdateDelegate {

    func updateData(data: String) {
        // データを更新する処理
    }
}

protocol DataUpdateDelegate {
    func updateData(data: String)
}

次に、遷移先のViewControllerにはデリゲートプロパティを定義します。

遷移先で何らかの処理を行い、遷移元に戻る際にデリゲートを通じてデータを更新することができます。

// 遷移先のViewController
class DestinationViewController: UIViewController {

    var delegate: DataUpdateDelegate?

    // 何らかの処理の後、遷移元に戻るボタンのアクション
    @IBAction func returnButtonTapped() {
        delegate?.updateData(data: "新しいデータ")
        dismiss(animated: true, completion: nil)
    }
}

このコードを実行すると、DestinationViewController内でreturnButtonTappedメソッドが呼び出されると、デリゲートを通じてOriginViewControllerupdateDataメソッドが実行されます。

その結果、遷移元のOriginViewControllerのビューに新しいデータが反映され、画面が更新される動作を実現します。

○サンプルコード8:TabBarControllerの利用時の戻り方

Swiftの開発でよく利用されるコンポーネントの一つに、UITabBarControllerがあります。

複数の画面をタブで切り替える際に使用するこのコンポーネントを使用している場合、特定のタブに切り替えて画面を表示する方法を知っておくと便利です。

下記のサンプルコードでは、UITabBarControllerを使用して特定のタブに切り替える方法を表しています。

class SomeViewController: UIViewController {

    // 特定のタブに切り替えるアクション
    @IBAction func switchToTab() {
        // タブのインデックス番号を指定して切り替え(0が最初のタブ)
        self.tabBarController?.selectedIndex = 1
    }
}

このコードを実行すると、SomeViewController内のswitchToTabメソッドが実行される際に、指定したインデックス番号のタブが選択され、対応する画面が表示されます。

例えば、selectedIndex = 1と設定すると、2番目のタブが選択される動作を実現できます。

○サンプルコード9:スワイプ動作での戻り方

モバイルアプリケーションの操作性を向上させるために、スワイプ動作を用いて画面間の遷移を行う方法は非常に人気があります。

特に、SwiftでのiOSアプリ開発においても、この手法は頻繁に採用されています。

ここでは、スワイプ動作を使用して、遷移元の画面に戻る方法を具体的に解説します。

スワイプによる画面遷移は、主にUINavigationControllerと組み合わせて実現されます。

デフォルトで、ナビゲーションコントローラを使用すると、画面の左端からのスワイプ動作で前の画面に戻ることができます。

しかし、特定の条件下でこの動作をカスタマイズしたい場合も考えられます。

ここでは、スワイプ動作で前の画面に戻る動作をカスタマイズするサンプルコードを紹介します。

import UIKit

class CustomSwipeViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // スワイプジェスチャーの追加
        let swipeGesture = UISwipeGestureRecognizer(target: self, action: #selector(swipedScreen(_:)))
        swipeGesture.direction = .right  // 右方向のスワイプを検知
        self.view.addGestureRecognizer(swipeGesture)
    }

    @objc func swipedScreen(_ gesture: UISwipeGestureRecognizer) {
        if gesture.direction == .right {
            // スワイプ動作に応じて画面遷移
            self.navigationController?.popViewController(animated: true)
        }
    }
}

このコードで実装される機能は、特定の画面で右方向にスワイプした際、前の画面に戻るという動作です。

具体的には、UISwipeGestureRecognizerを使用して、右方向のスワイプ動作を検知し、その動作が発生した場合にpopViewController(animated:)メソッドを呼び出して画面を戻しています。

このコードを実行した際の動作は、CustomSwipeViewControllerが表示されている状態で、ユーザーが画面を右方向にスワイプすると、ナビゲーションスタックの前の画面に遷移するものです。

この方法により、スワイプ動作での画面遷移を簡単に実装できます。

○サンプルコード10:カスタムトランジションを使った戻り方

iOSアプリケーションのUIを豊かにするために、画面遷移時のアニメーションは非常に重要な役割を果たします。

Swiftでは、カスタムトランジションを使用して、独自のアニメーションを画面遷移に組み込むことができます。

ここでは、カスタムトランジションを使用して、特定のアニメーションで遷移元の画面に戻るサンプルコードを紹介します。

import UIKit

class CustomTransitionViewController: UIViewController, UIViewControllerTransitioningDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.transitioningDelegate = self
    }

    // 画面遷移のアニメーションをカスタマイズするメソッド
    func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        return CustomTransitionAnimator()
    }
}

class CustomTransitionAnimator: NSObject, UIViewControllerAnimatedTransitioning {

    func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
        return 0.5  // アニメーションの時間を0.5秒に設定
    }

    func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
        // アニメーションの具体的な内容を定義
        // 例: 画面をフェードアウトさせて前の画面に戻る
        let containerView = transitionContext.containerView
        let fromView = transitionContext.view(forKey: .from)!
        containerView.addSubview(fromView)
        UIView.animate(withDuration: transitionDuration(using: transitionContext), animations: {
            fromView.alpha = 0.0
        }) { _ in
            transitionContext.completeTransition(true)
        }
    }
}

このコードでは、CustomTransitionViewControllerに遷移する際、CustomTransitionAnimatorクラスで定義されたアニメーションが実行されます。

具体的には、画面をフェードアウトさせながら前の画面に戻る動作を行います。

この方法により、独自のアニメーションを用いた画面遷移を実現することができます。

○サンプルコード11:戻るボタンのカスタマイズ

Swiftでアプリ開発を行う際、画面遷移を容易に行うための一つのツールとして、戻るボタンがあります。

このボタンはデフォルトで提供されるものも便利ですが、アプリのデザインやユーザー体験を向上させるために、カスタマイズすることが多くあります。

ここでは、戻るボタンのカスタマイズ方法について、具体的なサンプルコードとともに詳しく説明します。

□戻るボタンのデザインを変更する

アプリの全体的なデザインやテーマに合わせて、戻るボタンの見た目を変更したい場合があります。

ここでは、戻るボタンのテキストとアイコンをカスタマイズするサンプルコードを紹介します。

import UIKit

class CustomBackButtonViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // 戻るボタンのカスタムテキストとアイコンの設定
        let backButton = UIBarButtonItem(title: "カスタムテキスト", style: .plain, target: self, action: #selector(backAction))
        backButton.image = UIImage(named: "custom_icon")  // 任意のアイコン画像を設定
        self.navigationItem.leftBarButtonItem = backButton
    }

    @objc func backAction() {
        self.navigationController?.popViewController(animated: true)
    }
}

このコードでは、UIBarButtonItemを使用して、戻るボタンのテキストとアイコンをカスタマイズしています。

具体的には、「カスタムテキスト」というテキストと、「custom_icon」という名前のカスタムアイコン画像を戻るボタンに設定しています。

このサンプルコードを利用した場合、戻るボタンの見た目が「カスタムテキスト」というテキストと指定したアイコン画像に変わります。

ユーザーがこのカスタムボタンをタップすると、前の画面に戻る動作が実行されます。

□戻るボタンの動作を変更する

アプリの要件に応じて、戻るボタンをタップした際の動作を変更したい場合も考えられます。

例えば、特定の条件を満たした場合だけ前の画面に戻るような動作を実装したい場合などです。

ここでは、戻るボタンの動作をカスタマイズするサンプルコードの一例を紹介します。

import UIKit

class CustomBackButtonActionViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let backButton = UIBarButtonItem(title: "戻る", style: .plain, target: self, action: #selector(customBackAction))
        self.navigationItem.leftBarButtonItem = backButton
    }

    @objc func customBackAction() {
        if someCondition() {  // 任意の条件を確認
            self.navigationController?.popViewController(animated: true)
        } else {
            // 条件を満たさない場合の処理(例: アラート表示)
            let alert = UIAlertController(title: "注意", message: "特定の条件を満たしていません。", preferredStyle: .alert)
            alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
            self.present(alert, animated: true, completion: nil)
        }
    }

    func someCondition() -> Bool {
        // ここに条件を記述(例: テキストフィールドが空でないか確認)
        return true
    }
}

このコードでは、戻るボタンをタップした際にcustomBackActionメソッドが実行され、someCondition関数で定義された条件が満たされている場合のみ前の画面に戻る動作が実行されます。

条件を満たしていない場合は、アラートが表示される仕組みになっています。

このように、Swiftでは戻るボタンの見た目や動作を容易にカスタマイズすることができます。

アプリの要件やデザインに合わせて、適切なカスタマイズを行うことで、ユーザーにとって使いやすいアプリを作成することができます。

○サンプルコード12:遷移元画面への戻りを拒否する方法

画面遷移を実装する際に、特定の条件下でユーザーが遷移元の画面に戻るのを拒否したい場合が考えられます。

例えば、入力フォームの途中で戻るボタンをタップした際に、入力内容が失われることを避けるために確認のアラートを表示するなどの実装が考えられます。

ここでは、遷移元の画面に戻るのを特定の条件で拒否するサンプルコードを紹介します。

import UIKit

class PreventBackViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    // 戻るボタンがタップされた際に呼ばれるメソッド
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)

        if self.isMovingFromParent {  // 戻る動作が行われた場合
            if shouldPreventGoingBack() {
                // アラートを表示して戻る動作を拒否
                let alert = UIAlertController(title: "確認", message: "入力内容が失われますが、よろしいですか?", preferredStyle: .alert)
                alert.addAction(UIAlertAction(title: "はい", style: .default, handler: nil))
                alert.addAction(UIAlertAction(title: "いいえ", style: .cancel) { _ in
                    // 戻る動作をキャンセル
                    self.navigationController?.popViewController(animated: false)
                })
                self.present(alert, animated: true, completion: nil)
            }
        }
    }

    // 戻る動作を拒否する条件をチェックする関数
    func shouldPreventGoingBack() -> Bool {
        // 例: テキストフィールドに入力がある場合はtrueを返す
        return true
    }
}

このコードでは、viewWillDisappearメソッド内で、遷移元の画面に戻る動作が行われたかどうかを確認しています。

shouldPreventGoingBack関数の条件を満たす場合、アラートが表示され、戻る動作が拒否されます。

このサンプルコードを適用すると、特定の条件下で遷移元の画面に戻るのをユーザーが拒否され、アラートが表示される動作が実現されます。

これにより、ユーザーが誤って画面を移動してしまうことを防ぐことができます。

●注意点と対処法

Swiftで画面遷移を実装する際、スムーズに動作させるための注意点や、発生しうる問題の対処法について知っておくことは非常に重要です。

ここでは、Swiftにおける画面遷移の際の主要な注意点とその対処法について詳しく解説します。

○多重に遷移した場合の戻り方

アプリ内で画面遷移を多重に行った場合、単純に前の画面に戻るだけでなく、複数の画面をスキップして特定の画面に戻ることが必要になることも考えられます。

例えば、A → B → Cという順番で画面遷移を行い、Cから直接Aに戻りたい場合のサンプルコードを見てみましょう。

import UIKit

class CViewController: UIViewController {

    @IBAction func backButtonTapped(_ sender: UIButton) {
        // navigationControllerのviewControllersには、スタックされている全てのViewControllerが入っています。
        for controller in self.navigationController!.viewControllers as Array {
            if controller.isKind(of: AViewController.self) {
                self.navigationController?.popToViewController(controller, animated: true)
                break
            }
        }
    }
}

このコードでは、navigationControllerviewControllersプロパティを利用して、スタックされている全てのViewControllerを取得しています。

そして、AViewControllerを見つけた場合、そのViewControllerまで戻る動作を実行しています。

○遷移先が変わった場合の戻り方

アプリケーションの要件変更や追加機能の実装により、画面遷移の先が変わることがあります。

このとき、遷移元から適切な遷移先への戻り方を実装することが求められます。

例として、A画面からB画面に遷移した後、B画面がC画面に変更された場合の戻り方を見てみましょう。

import UIKit

class CViewController: UIViewController {

    @IBAction func backButtonTapped(_ sender: UIButton) {
        let aViewController = AViewController()
        navigationController?.setViewControllers([aViewController], animated: true)
    }
}

このコードでは、setViewControllersメソッドを使用して、ナビゲーションスタックの中のViewControllerをAViewControllerのみに変更しています。

これにより、C画面から戻るボタンをタップすると、直接A画面に遷移する動作となります。

○メモリリークを防ぐための注意点

画面遷移を行う際、不適切な実装によりメモリリークが発生する可能性があります。

メモリリークとは、不要なオブジェクトがメモリ上に残り続けることで、アプリケーションのパフォーマンス低下やクラッシュの原因となることを指します。

特にSwiftにおけるクロージャの循環参照は、メモリリークの主な原因となり得ます。

下記のサンプルコードは、クロージャによる循環参照を防ぐための実装例です。

import UIKit

class SomeViewController: UIViewController {

    var someClosure: (() -> Void)?

    override func viewDidLoad() {
        super.viewDidLoad()

        someClosure = { [weak self] in
            // クロージャ内でselfを使用する場合
            self?.someMethod()
        }
    }

    func someMethod() {
        // 何らかの処理
    }
}

このコードでは、クロージャのキャプチャリストに[weak self]を指定することで、selfへの強参照を避け、循環参照を防ぐようにしています。

このような実装を意識することで、メモリリークを回避し、アプリケーションの安定性を高めることができます。

●カスタマイズ方法

Swiftを利用したアプリ開発では、画面遷移時のUIや動作をカスタマイズすることが多く求められます。

ここでは、Swiftでの遷移に関連するカスタマイズ方法を2つの主要な項目に分けて詳しく解説します。

○戻るボタンのデザイン変更方法

画面遷移の際、ナビゲーションバーに表示される「戻る」ボタンのデザインをカスタマイズする方法について説明します。

ボタンのテキストやアイコンを変更することで、アプリのブランドやテーマに合わせたデザインを実現することができます。

下記のサンプルコードは、戻るボタンのテキストとアイコンをカスタマイズする例を紹介します。

import UIKit

class CustomBackViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let backButton = UIBarButtonItem(title: "カスタムテキスト", style: .plain, target: self, action: #selector(backButtonTapped))
        backButton.image = UIImage(named: "customIcon") // カスタムアイコンの指定
        self.navigationItem.leftBarButtonItem = backButton
    }

    @objc func backButtonTapped() {
        navigationController?.popViewController(animated: true)
    }
}

このコードでは、UIBarButtonItemを使用して、戻るボタンのテキストとアイコンをカスタマイズしています。

指定したcustomIconという名前の画像ファイルをアプリのAssetsに追加することで、アイコンとして表示することができます。

○遷移アニメーションのカスタマイズ方法

デフォルトの遷移アニメーション以外に、独自の遷移アニメーションを実装することも可能です。

これにより、ユーザーにとって魅力的なUI/UXを提供することができます。

下記のサンプルコードは、独自の遷移アニメーションを実装する方法を表しています。

import UIKit

class CustomAnimationViewController: UIViewController, UINavigationControllerDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()
        self.navigationController?.delegate = self
    }
}

extension CustomAnimationViewController: UIViewControllerAnimatedTransitioning {
    func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
        return 0.5 // アニメーションの持続時間
    }

    func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
        guard let toVC = transitionContext.viewController(forKey: .to),
              let fromVC = transitionContext.viewController(forKey: .from) else {
            return
        }

        let containerView = transitionContext.containerView
        containerView.addSubview(toVC.view)
        toVC.view.alpha = 0

        UIView.animate(withDuration: transitionDuration(using: transitionContext), animations: {
            toVC.view.alpha = 1
            fromVC.view.alpha = 0
        }) { _ in
            transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
        }
    }
}

extension CustomAnimationViewController: UINavigationControllerDelegate {
    func navigationController(_ navigationController: UINavigationController, animationControllerFor operation: UINavigationController.Operation, from fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        return self
    }
}

上記のコードでは、遷移時にフェードイン・フェードアウトのアニメーションを実装しています。

具体的には、遷移先のViewControllerのalpha値を0から1に変更し、遷移元のViewControllerのalpha値を1から0に変更しています。

まとめ

Swiftを使用したアプリ開発では、画面間の遷移は非常に基本的な機能として頻繁に使用されます。

本記事では、Swiftでの遷移元画面への戻り方に関する様々な方法と、それらのカスタマイズ方法を詳しく解説しました。

Swiftの画面遷移は、初心者にとっては少し複雑に感じるかもしれませんが、一つ一つの機能や方法を理解し、適切に利用することで、ユーザビリティが高く、使いやすいアプリを作成することができます。

本記事が、Swiftでの画面遷移の実装やカスタマイズに関して、あなたのアプリ開発の助けとなることを願っています。