Objective-CのSegueの使い方を解説!初心者向け15選

Objective-CのSegueを使用したアプリ画面遷移のサンプル画面Objctive-C
この記事は約28分で読めます。

 

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

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

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

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

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

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

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

はじめに

Objective-Cを用いたiOSアプリ開発の中で、アプリ内での画面遷移は不可欠です。

これを実現するためには、Segue(セグウェイ)がキーテクノロジーとなっています。

この記事では、Objective-Cを使用したSegueの基本的な使い方から、さまざまな応用方法やカスタマイズのテクニック、よくある問題点とその対処法まで、初心者向けに15の具体的なコード例を元に詳しく解説します。

iOSアプリ開発の入門者から中級者まで、Segueの使い方をしっかりと理解し、実際のアプリ開発に活かしていただける内容となっています。

●Objective-CとSegueの基本概念

Objective-CとSegueは、iOSアプリ開発において欠かせない要素です。

Objective-Cはアプリの基盤を形成する言語として、Segueは画面遷移の制御として使用されます。

それぞれの概要と特徴を理解することで、iOSアプリ開発の理解が深まります。

○Objective-Cの概要

Objective-Cは、C言語をベースにしたオブジェクト指向プログラム言語です。

1980年代にアメリカのNeXT社で開発され、その後、AppleによってMac OS XやiOSの開発言語として広く採用されました。

Objective-Cは、C言語のシンタックスを継承しつつ、Smalltalk風のメッセージパッシング機能を持ち合わせています。

これにより、動的なオブジェクト操作が可能となっており、iOSアプリ開発における多様な機能実現に貢献しています。

Segueに関しても、その基本的な役割と使い方について深く掘り下げていきます。

○Segueとは

Segueは、iOSアプリにおける画面間の遷移を管理するための技術です。

具体的には、ある画面から別の画面へ移動する際の振る舞いや、データの受け渡しを制御することができます。

Storyboard上でビジュアル的にSegueを設定することができ、遷移先のViewControllerやデータの受け渡しの設定など、画面遷移に関連する多くの要素を簡単に設計することができます。

Segueの実装方法は多岐にわたり、基本的な画面遷移から、複雑なデータの受け渡しやカスタムアニメーションを伴う遷移まで、幅広いシチュエーションに対応可能です。

●Segueの使い方

Segueは、Storyboard上でビューコントローラ間の遷移を定義するためのものです。

遷移は、あるビューコントローラから別のビューコントローラへの移動を意味します。

Segueを使用することで、アニメーション付きの画面遷移や、次の画面にデータを渡すといった高度な遷移も簡単に実現できます。

○サンプルコード1:基本的な画面遷移

このコードでは、Storyboard上でButtonをドラッグして遷移先のビューコントローラに接続することで、画面遷移を定義しています。

この例では、Buttonをタップすると次の画面に遷移する動作を表しています。

// ViewController.m
- (IBAction)transitionButtonTapped:(id)sender {
    [self performSegueWithIdentifier:@"NextViewSegue" sender:self];
}

// Prepare for segueの中で、遷移前の処理を記述することもできます。
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"NextViewSegue"]) {
        // 例: 遷移先のビューコントローラにデータを渡すなどの処理
    }
}

このコードを実行すると、Buttonをタップすると指定したSegueが実行され、次の画面に遷移します。

○サンプルコード2:値を渡しながらの画面遷移

画面遷移時に、遷移元のビューコントローラから遷移先のビューコントローラにデータを渡す場合のコードを紹介します。

この例では、テキストフィールドの入力値を次の画面に表示する動作を行っています。

// ViewController.m
- (IBAction)sendDataButtonTapped:(id)sender {
    [self performSegueWithIdentifier:@"ShowDataSegue" sender:self];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"ShowDataSegue"]) {
        NextViewController *nextVC = segue.destinationViewController;
        nextVC.receivedData = self.textField.text;
    }
}

次の画面のViewController(NextViewController)では、受け取ったデータをラベルに表示する動作を行います。

// NextViewController.m
- (void)viewDidLoad {
    [super viewDidLoad];
    self.dataLabel.text = self.receivedData;
}

このコードを実行すると、テキストフィールドに入力したテキストが次の画面のラベルに表示されます。

○サンプルコード3:ナビゲーションコントローラーを使用した遷移

Navigation Controllerは、画面遷移をスタックのように管理することで、順序だった画面遷移を実現するコントローラです。

このコードでは、Navigation Controllerを使って次の画面に遷移する方法を表しています。

#import "ViewController.h"
#import "SecondViewController.h"

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
}

// ボタンがタップされた時のアクション
- (IBAction)moveToNextPage:(id)sender {
    SecondViewController *secondVC = [self.storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
    [self.navigationController pushViewController:secondVC animated:YES];
}

@end

このコードでは、ViewControllerからSecondViewControllerへの画面遷移を行っています。

moveToNextPageメソッド内で、Storyboard上のIdentifierを指定してSecondViewControllerのインスタンスを作成し、Navigation ControllerのpushViewController:animated:メソッドを使って画面遷移を行っています。

遷移後には、Navigation Controllerのヘッダー部分に「戻る」ボタンが自動で追加されます。

これにより、ユーザーは前の画面に戻ることができるようになります。

○サンプルコード4:タブバーコントローラーを使用した遷移

Tab Bar Controllerは、画面下部にタブバーを持ち、タブをタップすることで異なるビューコントローラーに遷移することができるコントローラです。

このコードでは、Tab Bar Controllerを使った画面遷移の例を紹介します。

// AppDelegate.m
#import "AppDelegate.h"
#import "FirstTabViewController.h"
#import "SecondTabViewController.h"

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    FirstTabViewController *firstVC = [[FirstTabViewController alloc] init];
    SecondTabViewController *secondVC = [[SecondTabViewController alloc] init];

    UITabBarController *tabBarController = [[UITabBarController alloc] init];
    tabBarController.viewControllers = @[firstVC, secondVC];
    self.window.rootViewController = tabBarController;

    [self.window makeKeyAndVisible];
    return YES;
}

@end

このコードでは、アプリ起動時にFirstTabViewControllerSecondTabViewControllerの2つのビューコントローラーをTab Bar Controllerにセットしています。

これにより、アプリの画面下部に2つのタブが表示され、タブをタップすることで各ビューコントローラーに切り替えることができます。

○サンプルコード5:モーダル表示での遷移

モーダル表示は、現在の画面上に新しい画面を重ねて表示する方法です。

このコードでは、ボタンをタップすると新しい画面をモーダル表示しています。

#import "ViewController.h"
#import "ModalViewController.h"

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
}

- (IBAction)showModalView:(id)sender {
    ModalViewController *modalVC = [self.storyboard instantiateViewControllerWithIdentifier:@"ModalViewController"];
    [self presentViewController:modalVC animated:YES completion:nil];
}

@end

このコードでは、showModalViewメソッド内で、Storyboard上のIdentifierを指定してModalViewControllerのインスタンスを作成し、presentViewController:animated:completion:メソッドを使ってモーダル表示を行っています。

モーダル表示された画面は、通常、閉じるためのボタンやジェスチャーを持つ必要があります。

そのため、ModalViewControllerの中には、適切な方法でモーダルを閉じる処理を実装する必要があります。

●Segueの応用例

Objective-CにおけるiOSアプリ開発では、様々なシチュエーションで画面遷移を行います。

Segueを使うことで、複雑な画面遷移や遷移時のデータの受け渡しもスムーズに行えます。

ここでは、テーブルビューやコレクションビューからの遷移など、Segueの応用例を見ていきましょう。

○サンプルコード6:テーブルビューからの詳細画面への遷移

テーブルビューは一覧データを表示するためのUIコンポーネントであり、一般的には各行をタップすることで詳細画面へ遷移することが多いです。

この遷移をSegueを用いて実現する方法を見ていきます。

// ViewController.m
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [self performSegueWithIdentifier:@"showDetailSegue" sender:self];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"showDetailSegue"]) {
        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        DetailViewController *detailVC = segue.destinationViewController;
        detailVC.data = self.dataArray[indexPath.row];
    }
}

このコードでは、テーブルビューの行がタップされた際にshowDetailSegueというIdentifierを持つSegueを実行するように指示しています。

そして、prepareForSegue:sender:メソッド内で選択された行のデータを詳細画面のビューコントローラーに渡しています。

実行すると、テーブルビューの各行をタップすると、該当のデータを持った詳細画面に遷移することが確認できます。

○サンプルコード7:コレクションビューからの遷移

コレクションビューもテーブルビューと同様、一覧データを表示するUIコンポーネントですが、より自由度の高いレイアウトでデータを表示することができます。

ここでは、コレクションビューのアイテムをタップした際の画面遷移をSegueで実現する方法を解説します。

// CollectionViewController.m
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
    [self performSegueWithIdentifier:@"showItemDetailSegue" sender:self];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"showItemDetailSegue"]) {
        NSIndexPath *indexPath = [self.collectionView indexPathsForSelectedItems].firstObject;
        ItemDetailViewController *itemDetailVC = segue.destinationViewController;
        itemDetailVC.item = self.itemArray[indexPath.item];
    }
}

このコードでは、コレクションビューのアイテムがタップされた際にshowItemDetailSegueというIdentifierを持つSegueを実行しています。

そして、prepareForSegue:sender:メソッドで選択されたアイテムのデータを詳細画面のビューコントローラーに渡しています。

実行すると、コレクションビューのアイテムをタップすると、そのアイテムに関連する詳細情報を表示する画面に遷移することが確認できます。

○サンプルコード8:遷移時のアニメーションのカスタマイズ

Objective-Cを使用したiOSアプリ開発において、画面遷移時のアニメーションをカスタマイズすることで、よりユーザーフレンドリーなアプリを作成することができます。

このコードでは、Objective-CのSegueを使用して、画面遷移時のアニメーションをカスタマイズする方法を表しています。

#import "ViewControllerA.h"
#import "ViewControllerB.h"

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"toViewControllerB"]) {
        ViewControllerB *vcB = (ViewControllerB *)segue.destinationViewController;
        vcB.transitioningDelegate = self;
    }
}

- (id<UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source {
    return [[CustomTransitionAnimation alloc] init];
}

このコードでは、prepareForSegue:sender:メソッドを使用して、遷移先のビューコントローラーにトランジションデリゲートを設定しています。

また、animationControllerForPresentedController:presentingController:sourceController:メソッドで、カスタムトランジションアニメーションを返しています。

この例では、ViewControllerAからViewControllerBへの遷移時に、カスタムトランジションアニメーションを適用しています。

○サンプルコード9:コードベースでのSegue呼び出し

Storyboardを使用せずに、コードベースでSegueを呼び出す場合もあります。

このコードでは、Objective-Cを使用して、コードベースでSegueを呼び出す方法を表しています。

#import "ViewControllerA.h"
#import "ViewControllerB.h"

- (IBAction)transitionButtonTapped:(id)sender {
    ViewControllerB *vcB = [self.storyboard instantiateViewControllerWithIdentifier:@"ViewControllerB"];
    [self presentViewController:vcB animated:YES completion:nil];
}

このコードでは、ボタンのアクションメソッドtransitionButtonTapped:で、ViewControllerBをインスタンス化し、presentViewController:animated:completion:メソッドを使用して画面遷移を行っています。

この例では、ViewControllerAのボタンをタップすることで、ViewControllerBへ遷移します。

○サンプルコード10:条件を満たす場合のみ遷移

アプリの動作をカスタマイズするために、特定の条件を満たす場合のみ画面遷移を実行する場合もあります。

このコードでは、Objective-Cを使用して、条件を満たす場合のみ画面遷移を行う方法を表しています。

#import "ViewControllerA.h"
#import "ViewControllerB.h"

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"toViewControllerB"] && [self isConditionMet]) {
        ViewControllerB *vcB = (ViewControllerB *)segue.destinationViewController;
    }
}

- (BOOL)isConditionMet {
    // ここに条件を記述
    return YES; // 条件が満たされている場合はYESを、そうでない場合はNOを返す
}

このコードでは、prepareForSegue:sender:メソッド内で、isConditionMetメソッドを呼び出して、特定の条件が満たされているかどうかを判定しています。

条件が満たされている場合のみ、Segueによる画面遷移が実行されます。

この例では、特定の条件を満たしている場合のみ、ViewControllerAからViewControllerBへ遷移します。

●注意点と対処法

Objective-Cを使用してiOSアプリの開発を進める際、Segueに関するいくつかの注意点や対処法があります。

ここでは、特に初心者の方がつまづきやすい点や、開発中に出てくる一般的なエラー、それに対する対処法を取り上げます。

詳細なサンプルコードを交えて解説していきますので、これを参考に安全かつ効果的なアプリ開発を進めてください。

○Segue使用時のよくあるエラー

Segueを使用する際には、いくつかの典型的なエラーが出ることがあります。

特に、Identifierが正しく設定されていない、またはStoryboard上での接続が間違っているなどが考えられます。

例として、Storyboard上でSegueを接続する際に、正しくIdentifierを設定しなかった場合のエラーメッセージとその対処法を紹介します。

// ViewController.m
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"toDetailViewController"]) {
        DetailViewController *detailVC = segue.destinationViewController;
        detailVC.data = self.selectedData;
    }
}

このコードでは、”toDetailViewController”というIdentifierを使って、DetailViewControllerへの遷移を準備しています。

この例では、選択されたデータを遷移先のDetailViewControllerに渡しています。

しかし、Storyboard上でこのIdentifierが正しく設定されていないと、アプリはクラッシュします。

このようなエラーが発生した場合、まずはStoryboard上でSegueのIdentifierが正しく設定されているか確認してください。

Identifierが間違っているか、未設定の場合は正しく設定することで、このエラーは解消されます。

○メモリリークの回避

Objective-Cの開発では、メモリリークが問題となることがあります。

Segueを使用して画面遷移を繰り返す際、適切にメモリを解放しないと、アプリのパフォーマンスが低下したり、クラッシュの原因となることがあります。

メモリリークを回避するためには、ARC(Automatic Reference Counting)を有効にすることで多くのリークを防ぐことができます。

しかし、弱参照(weak reference)やブロック内でのstrong self参照など、ARCが対応しきれないケースも存在します。

これに関する対処法を紹介します。

// ViewController.m
__weak typeof(self) weakSelf = self;
[self setCompletionBlock:^{
    [weakSelf doSomething];
}];

このコードでは、ブロック内でselfを弱参照として取り扱っています。

これにより、ブロック内で循環参照が発生するのを防ぐことができます。

○遷移のキャンセル方法

時には、ある条件を満たさないときに画面遷移をキャンセルしたいケースが考えられます。

そのような場合の対処法を紹介します。

// ViewController.m
- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender {
    if ([identifier isEqualToString:@"toDetailViewController"] && !self.canGoToDetail) {
        return NO;
    }
    return YES;
}

このコードでは、”toDetailViewController”というIdentifierのSegueが呼び出される際、canGoToDetailプロパティがNOの場合、遷移がキャンセルされます。

●カスタマイズ方法

Objective-CでiOSアプリケーションを開発する中で、遷移先のビューやボタンなどのUIをカスタマイズする方法について解説します。

ここでは、Segueを利用した画面遷移時に遷移先のビューの背景色やフォントを変更する方法や、戻るボタンのカスタマイズ方法を中心に取り上げます。

○サンプルコード11:遷移先のビューの背景色やフォントを変更

Objective-Cを使用して、Segueで遷移する先の画面の背景色やフォントを変更する方法を見ていきます。

遷移先のViewControllerにて、viewDidLoadメソッド内で設定を行います。

- (void)viewDidLoad {
    [super viewDidLoad];

    // 背景色を赤色に設定
    self.view.backgroundColor = [UIColor redColor];

    // ラベルのフォントと文字色を設定
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 200, 50)];
    label.text = @"Objective-CのSegue";
    label.font = [UIFont boldSystemFontOfSize:20];
    label.textColor = [UIColor whiteColor];
    [self.view addSubview:label];
}

このコードでは、遷移先のビューの背景色を赤色に設定しています。

また、ラベルを作成し、そのフォントと文字色をカスタマイズしています。

この例では、ラベルのフォントを太字の20ポイントに、文字色を白色に設定しています。

遷移してこの画面が表示されると、赤い背景の上に「Objective-CのSegue」という白い文字のラベルが表示されることになります。

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

iOSのナビゲーションバーには、標準で「戻る」ボタンが表示されますが、このボタンの表示名やスタイルをカスタマイズすることも可能です。

下記のサンプルコードでは、戻るボタンの表示名を「Back」から「戻る」に変更し、その色を青色に設定しています。

- (void)viewDidLoad {
    [super viewDidLoad];

    // 戻るボタンのカスタマイズ
    UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"戻る" style:UIBarButtonItemStylePlain target:nil action:nil];
    backButton.tintColor = [UIColor blueColor];
    self.navigationItem.backBarButtonItem = backButton;
}

このコードでは、新しくUIBarButtonItemを作成し、そのタイトルを「戻る」に設定しています。

また、tintColorプロパティを使用して、ボタンの色を青色に変更しています。

最後に、navigationItemのbackBarButtonItemプロパティに、作成したボタンをセットすることで、ナビゲーションバー上の戻るボタンがカスタマイズされます。

この設定を適用した後、ナビゲーションバーの戻るボタンをタップすると、青色の「戻る」という文字が表示されるボタンが見えることになります。

○サンプルコード13:複数のSegueを同じトリガーで呼び出す

画面遷移を実装する際、同じボタンやアクションをトリガーとして、複数のSegueを呼び出したい場合があります。

このようなケースでの実装方法を紹介します。

// ViewController.m
- (IBAction)triggerMultipleSegues:(id)sender {
    [self performSegueWithIdentifier:@"segueIdentifier1" sender:self];
    [self performSegueWithIdentifier:@"segueIdentifier2" sender:self];
}

このコードでは、triggerMultipleSegues:メソッドが呼び出されると、segueIdentifier1segueIdentifier2の2つのSegueが順に呼び出される仕組みを表しています。

この例では、1つのトリガーから複数の画面遷移を実行しています。

このような実装を行う場合、遷移先のビューコントローラが同時に表示されることはなく、最初に呼び出されたSegueの遷移先が表示され、その後に呼び出されたSegueの遷移先が表示されることに注意が必要です。

○サンプルコード14:アニメーションを加えたSegueのカスタマイズ

Segueを使用しての画面遷移は、標準的なアニメーションが適用されますが、独自のアニメーションを加えたい場合もあります。

ここでは、独自のアニメーションを加えて画面遷移を行う方法の一例を紹介します。

// CustomSegue.m
- (void)perform {
    UIViewController *sourceViewController = (UIViewController*)[self sourceViewController];
    UIViewController *destinationViewController = (UIViewController*)[self destinationViewController];

    // 独自のアニメーションを定義
    [UIView transitionWithView:sourceViewController.view duration:0.5 options:UIViewAnimationOptionTransitionFlipFromRight animations:^{
        [sourceViewController.view addSubview:destinationViewController.view];
    } completion:^(BOOL finished) {
        [destinationViewController.view removeFromSuperview];
        [sourceViewController presentViewController:destinationViewController animated:NO completion:nil];
    }];
}

このコードでは、UIViewtransitionWithView:duration:options:animations:completion:メソッドを使用して、画面が右からフリップするアニメーションで遷移する仕組みを表しています。

この例では、独自のアニメーションを加えた画面遷移を実現しています。

○サンプルコード15:複数のビューコントローラーを跨ぐSegue

時として、1つのSegueで複数のビューコントローラを跨ぐ必要が出てきます。

ここでは、複数のビューコントローラを跨ぐSegueの実装例を紹介します。

// ViewController.m
- (IBAction)crossMultipleViewControllers:(id)sender {
    [self performSegueWithIdentifier:@"toThirdViewController" sender:self];
}

// In UIStoryboardSegue subclass
- (void)perform {
    UIViewController *sourceViewController = (UIViewController *)self.sourceViewController;
    UIViewController *destinationViewController = (UIViewController *)self.destinationViewController;
    UINavigationController *navController = sourceViewController.navigationController;

    NSMutableArray *viewControllers = [navController.viewControllers mutableCopy];
    [viewControllers removeLastObject];
    [viewControllers addObject:destinationViewController];

    [navController setViewControllers:viewControllers animated:YES];
}

このコードでは、crossMultipleViewControllers:メソッドが呼び出されると、現在のビューコントローラをスキップして、次の次のビューコントローラへ遷移する仕組みを表しています。

この例では、一度に複数のビューコントローラを跨ぐ画面遷移を実現しています。

ここでの実装では、UINavigationControllerviewControllersプロパティを利用して、現在のビューコントローラの配列から現在のビューコントローラを取り除き、遷移先のビューコントローラを追加しています。

これにより、複数のビューコントローラを跨ぐSegueが可能となります。

Objective-CのSegueの使い方:初心者向け15選

まとめ

iOSアプリ開発におけるObjective-Cを使用した画面遷移の手法として、Segueは欠かせない存在となっています。

この記事では、初心者の方でも簡単に理解できるように、Segueの基本的な使い方から応用、カスタマイズ方法まで、15の具体的なコード例を交えて解説しました。

特に、複数のSegueを同じトリガーで呼び出す方法や、アニメーションを加えたSegueのカスタマイズ、さらには複数のビューコントローラーを跨ぐSegueの使い方など、より実践的な内容も紹介しました。

これらのコード例を参考に、独自のアプリ開発の中での画面遷移をスムーズに実現することができます。

Objective-CとiOSアプリ開発の道は深く、幅広い内容がありますが、この記事がSegueを利用したアプリ開発の第一歩として役立つことを願っています。

最後まで読んでいただき、ありがとうございました。

今後のアプリ開発の成功を心よりお祈りしております。