Objective-Cのsenderを完全解説!15選のサンプルコードで学ぶ

Objective-Cのsenderを図解したイメージObjctive-C
この記事は約19分で読めます。

 

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

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

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

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

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

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

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

はじめに

Objective-Cは、AppleのiOSやmacOSアプリケーション開発に使用されるプログラミング言語です。

この言語の中で非常に便利な要素として「sender」が存在します。

特にイベントハンドリングの際に、発生源やその情報を取得するために頻繁に利用されるのがこの「sender」です。

今回は、Objective-Cのsenderについて徹底的に解説していきます。記事の中で、初心者の方でも理解しやすいように、15のサンプルコードを交えながら詳しく学んでいきましょう。

●Objective-Cのsenderとは

Objective-Cにおけるsenderは、イベントが発生した際の発生源や、その情報を持っているオブジェクトを指します。

例えば、ボタンをクリックした際やスライダーの値が変更された時など、UIの変更をトリガーとして何らかの処理を行いたい場面で頻繁に利用されます。

多くの場面で、同じメソッドを複数のUI要素に対して適用したいときがあります。

この時、どのUI要素からのイベントなのかを判別するために、senderを利用することができます。

○senderの基本的な役割

senderは、イベントが起こった際の発生源となるオブジェクト自体を指します。

具体的には、UIButtonやUITextFieldなど、さまざまなUI部品がsenderとして機能することができます。

これにより、一つのアクションメソッド内で複数のUI部品からのイベントを取得し、その内容に応じて処理を分岐させることが可能となります。

また、senderを利用することで、イベントが発生した際の具体的なUI部品の状態や属性にアクセスすることができます。

これにより、動的なUIの変更や、ユーザーからの入力内容に基づく処理の実行が簡単に行えるようになります。

例えば、複数のボタンが配置されている画面において、どのボタンが押されたのかを識別するためにsenderを利用します。

ボタンごとに異なるアクションメソッドを設定する代わりに、一つのメソッドを全てのボタンに適用し、その中でsenderを用いて処理を分岐させることができます。

●senderの使い方

Objective-Cでのプログラミングを進める中で、イベントの発生源を知る必要が出てきます。

ここで「sender」というキーワードが非常に役立ちます。

senderはイベントが発生したオブジェクト自身を指します。

例えば、ボタンがクリックされたときやテキストフィールドでの入力が完了したときなど、さまざまなシチュエーションでのsenderの取得や活用方法を紹介します。

○サンプルコード1:ボタンクリックでsenderを取得する方法

このコードでは、ボタンがクリックされた際に発生したイベントのsenderを取得しています。

取得したsenderを利用して、ボタンのタイトルを表示することができます。

- (IBAction)buttonClicked:(id)sender {
    UIButton *clickedButton = (UIButton *)sender;
    NSLog(@"クリックされたボタンのタイトル: %@", clickedButton.titleLabel.text);
}

この例では、buttonClicked:メソッドがボタンのクリックイベントに対応しています。

メソッドの引数senderUIButton型にキャストすることで、クリックされたボタンの情報を取得します。

最後に、取得したボタンのタイトルをログに出力しています。

実際に上記のコードを実行すると、クリックされたボタンのタイトルがログに表示されます。

○サンプルコード2:senderの型を調べる方法

Objective-Cのsenderはid型であり、どのようなオブジェクトでも取り扱うことができます。

しかし、特定の操作を行う前に、senderの型を確認することが重要です。

- (IBAction)elementAction:(id)sender {
    if ([sender isKindOfClass:[UIButton class]]) {
        NSLog(@"senderはUIButton型です");
    } else if ([sender isKindOfClass:[UITextField class]]) {
        NSLog(@"senderはUITextField型です");
    } else {
        NSLog(@"senderの型は不明です");
    }
}

このコードでは、isKindOfClass:メソッドを使ってsenderの型を調べています。

この例では、senderがUIButton型であるか、UITextField型であるかを判別しています。

上記のコードを実行した場合、senderの型に応じて対応するメッセージがログに表示されます。

○サンプルコード3:senderからデータを取得する方法

ボタンやテキストフィールドなど、さまざまなUI要素からデータを取得する際にもsenderが役立ちます。

- (IBAction)textFieldDidEndEditing:(id)sender {
    UITextField *textField = (UITextField *)sender;
    NSLog(@"入力されたテキスト: %@", textField.text);
}

このコードでは、テキストフィールドの編集が終了したときに発火するtextFieldDidEndEditing:メソッド内で、編集が終了したテキストフィールドのテキストを取得しています。

上記のコードを実行すると、テキストフィールドに入力されたテキストがログに表示されます。

●senderの応用例

Objective-Cにおいて、senderは非常に多様なシナリオでのアプリケーションを持ちます。

今回は、このsenderの応用例をサンプルコードを交えて詳しく紹介していきます。

○サンプルコード4:複数のボタンで異なるアクションを行う

このコードでは、複数のボタンそれぞれに異なるアクションを割り当て、クリックされたボタンによって適切な処理を行うコードを表しています。

この例では、senderの情報を使って、どのボタンがクリックされたかを判断し、それに対応する処理を実行しています。

- (IBAction)buttonClicked:(id)sender {
    UIButton *clickedButton = (UIButton *)sender;
    if (clickedButton.tag == 1) {
        NSLog(@"ボタン1がクリックされました。");
    } else if (clickedButton.tag == 2) {
        NSLog(@"ボタン2がクリックされました。");
    } else {
        NSLog(@"その他のボタンがクリックされました。");
    }
}

ボタンがクリックされたとき、buttonClicked:メソッドが呼ばれ、クリックされたボタンの情報がsenderとして渡されます。

そして、各ボタンのtagプロパティを利用して、どのボタンがクリックされたかを識別します。

このコードを実行すると、それぞれのボタンをクリックした際に、対応するログメッセージが表示される結果となります。

○サンプルコード5:senderを利用してテキストフィールドの内容を取得

このコードでは、テキストフィールドから入力された内容を取得するコードを表しています。

この例では、ボタンをクリックすると、テキストフィールドの内容を取得して表示します。

- (IBAction)showText:(id)sender {
    UITextField *textField = (UITextField *)sender;
    NSString *inputText = textField.text;
    NSLog(@"入力されたテキスト: %@", inputText);
}

ボタンがクリックされると、showText:メソッドが呼ばれます。

そして、senderUITextFieldとしてキャストし、テキストフィールドの内容を取得します。

このコードを実行すると、テキストフィールドに入力された内容がログに表示される結果となります。

○サンプルコード6:テーブルビューでのセル選択時のsenderの活用法

テーブルビューは、iOSアプリの中でも頻繁に使用されるUIコンポーネントの一つです。

Objective-Cを用いてテーブルビューを実装する際、セルの選択時に何らかのアクションを実行したい場合があります。

この時、セルの情報を取得するためにsenderを活用することができます。

このコードでは、テーブルビューでセルを選択した際の情報を取得する方法を表しています。

この例では、セルをタップすることでセルのテキスト情報をログに出力しています。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    NSLog(@"選択されたセルのテキスト:%@", cell.textLabel.text);
}

上記のコードにおいて、didSelectRowAtIndexPath:メソッドは、セルが選択された際に呼ばれるデリゲートメソッドです。

その中で、cellForRowAtIndexPath:メソッドを使用して、選択されたセルのオブジェクトを取得しています。

そして、セルのテキストラベルのテキストをログに出力しています。

テーブルビューのセルをタップした場合、ログには選択されたセルのテキスト情報が出力され、これにより、どのセルがタップされたのかを確認することができます。

○サンプルコード7:senderを使ってスライダーの値を取得する

スライダーは、ユーザーが値を調整する際に使用されるUIコンポーネントです。

スライダーの値が変更された際に、その変更された値を取得したい場面があるでしょう。

senderを利用することで、その値を簡単に取得できます。

このコードでは、スライダーの値が変更された時にその値をログに出力する方法を表しています。

この例では、スライダーを動かすとその値を取得し、ログに表示しています。

- (IBAction)sliderValueChanged:(UISlider *)sender {
    NSLog(@"スライダーの現在の値:%f", sender.value);
}

上記のコードでは、sliderValueChanged:メソッドがスライダーの値が変更される度に呼ばれます。

そして、senderをUISliderとして受け取ることで、valueプロパティからスライダーの現在の値を取得しています。

スライダーを動かすことで、ログにはスライダーの現在の値が出力されます。

このように、senderを利用することで、UIコンポーネントの情報を簡単に取得することができます。

○サンプルコード8:senderを使ったセグメントコントロールの値の取得

セグメントコントロールは、複数の選択肢から一つを選択するためのUIコンポーネントです。

選択されたセグメントのインデックスやテキスト情報を取得したい場合があります。

この場面でも、senderを活用することで簡単にその情報を取得できます。

このコードでは、セグメントコントロールで選択されたセグメントの情報を取得する方法を表しています。

この例では、セグメントが選択されるとそのセグメントのテキスト情報をログに出力しています。

- (IBAction)segmentChanged:(UISegmentedControl *)sender {
    NSInteger selectedIndex = sender.selectedSegmentIndex;
    NSString *selectedText = [sender titleForSegmentAtIndex:selectedIndex];
    NSLog(@"選択されたセグメント:%ld, テキスト:%@", (long)selectedIndex, selectedText);
}

上記のコードでは、segmentChanged:メソッドがセグメントが選択される度に呼ばれます。

そして、senderをUISegmentedControlとして受け取り、selectedSegmentIndexプロパティで選択されたセグメントのインデックスを取得しています。

また、titleForSegmentAtIndex:メソッドを使用して選択されたセグメントのテキスト情報も取得しています。

セグメントコントロールでセグメントを選択すると、ログにはそのセグメントのインデックスとテキスト情報が出力されます。

●注意点と対処法

Objective-Cでのプログラミングにおいて、senderを利用する際には、いくつかの注意点が存在します。

これらを知っておくことで、より安全かつ効果的にsenderを活用することができます。

ここでは、senderの使用時の主な注意点と、それに対する対処法をサンプルコードを交えて説明します。

○サンプルコード9:senderの型が不明確な時のキャスト方法

senderの型は、呼び出し元のオブジェクトによって異なるため、型が不明確な場合があります。

具体的には、ボタンやテキストフィールド、スライダーなど様々なUI要素から同じメソッドが呼び出される場合、senderの型を正確に把握するのが難しくなります。

このコードでは、senderの型がUIButtonであるかどうかを確認して、UIButtonであればそのボタンのタイトルをログに出力するコードを表しています。

この例では、ボタンが押されたときに、そのボタンのタイトルを取得して出力しています。

- (IBAction)buttonPressed:(id)sender {
    if ([sender isKindOfClass:[UIButton class]]) {
        UIButton *button = (UIButton *)sender;
        NSLog(@"ボタンのタイトルは: %@", button.titleLabel.text);
    }
}

このサンプルコードの実行時に、UIButtonのインスタンスが押された場合、ボタンのタイトルがコンソールに出力されます。

例えば、”OK”というタイトルのボタンが押された場合、コンソールには”ボタンのタイトルは: OK”と表示されます。

○サンプルコード10:senderを誤用すると生じる問顔とその対処法

senderの誤用は、アプリケーションの不具合やクラッシュの原因となる可能性があります。

例として、senderをキャストする際に、間違った型へのキャストを行ってしまうと、ランタイムエラーが発生する可能性があります。

このコードでは、senderUILabelとしてキャストしているが、実際にはsenderUIButtonのインスタンスである場合のコードを表しています。

この例では、キャスト時のエラーを捕捉して、エラーメッセージを出力しています。

- (IBAction)buttonPressed:(id)sender {
    @try {
        UILabel *label = (UILabel *)sender;
        NSLog(@"ラベルのテキストは: %@", label.text);
    }
    @catch (NSException *exception) {
        NSLog(@"エラー: 正しい型にキャストしてください。");
    }
}

このサンプルコードの実行時に、UIButtonのインスタンスが押された場合、コンソールには”エラー: 正しい型にキャストしてください。”というメッセージが出力されます。

これにより、キャストのエラーが発生したことがわかるため、デバッグが容易になります。

●カスタマイズ方法

Objective-Cでのsenderの活用法は多岐にわたりますが、カスタマイズの方法も非常に豊富です。

senderにカスタムデータを追加したり、外見や動作を変更したり、アニメーションを追加したりすることができます。

これから、それぞれのカスタマイズ方法について詳しく説明していきます。

○サンプルコード11:senderにカスタムデータを追加する方法

このコードではUIButtonのインスタンスに関連するカスタムデータを追加するために、連想オブジェクトを利用しています。

この例では、ボタンに関連付けられたカスタムデータを保存・取得しています。

#import <objc/runtime.h>

// キーの作成
static char associatedKey;

// カスタムデータのセット
- (void)setCustomData:(NSString *)data toButton:(UIButton *)button {
    objc_setAssociatedObject(button, &associatedKey, data, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

// カスタムデータの取得
- (NSString *)getCustomDataFromButton:(UIButton *)button {
    return (NSString *)objc_getAssociatedObject(button, &associatedKey);
}

このコードを使用することで、特定のUIButtonインスタンスに独自のデータを関連付けることができるようになります。

実際には、ボタンをタップした際に、関連付けられたカスタムデータを取得するシナリオが考えられます。

○サンプルコード12:senderの外見や動作をカスタマイズする方法

このコードでは、UIButtonのインスタンスの外見や動作をカスタマイズする方法を表しています。

この例では、ボタンの背景色とタイトルを変更しています。

UIButton *customButton = [UIButton buttonWithType:UIButtonTypeCustom];
customButton.frame = CGRectMake(100, 100, 150, 50);

// ボタンの背景色を設定
customButton.backgroundColor = [UIColor blueColor];

// ボタンのタイトルを設定
[customButton setTitle:@"カスタムボタン" forState:UIControlStateNormal];

このように、UIButtonのプロパティを変更するだけで、外見や動作を簡単にカスタマイズすることができます。

実際には、アプリのデザインや機能に合わせて、さまざまなカスタマイズが可能です。

○サンプルコード13:senderにアニメーションを追加する方法

このコードでは、UIButtonのインスタンスにアニメーションを追加する方法を表しています。

この例では、ボタンをタップしたときに、ボタンが回転するアニメーションを実装しています。

- (void)buttonTapped:(UIButton *)sender {
    [UIView animateWithDuration:0.5 animations:^{
        sender.transform = CGAffineTransformRotate(sender.transform, M_PI);
    }];
}

UIButtonのインスタンスに対して、UIViewクラスのアニメーションメソッドを使用してアニメーションを追加することができます。

このコードを実行すると、ボタンをタップするたびに、ボタンが180度回転するアニメーションが再生されます。

このようなアニメーションは、ユーザーの操作にフィードバックを与えるためや、アプリの使いやすさを向上させるために利用できます。

●senderを使った実践的な例

Objective-Cにおけるsenderは多様なシチュエーションでの活用が考えられます。

ここでは、特に実践的な状況を取り上げて、senderの役立ちを具体的に示します。

○サンプルコード14:ショッピングカートの数量変更時にsenderを活用する方法

一般的なショッピングカートでは、商品の数量を変更することが頻繁に行われます。

この時、どの商品の数量が変更されたのかを特定するためにsenderを利用することができます。

- (IBAction)quantityChanged:(id)sender {
    UITextField *quantityField = (UITextField *)sender;
    int quantity = [quantityField.text intValue];
    NSLog(@"数量が %d に変更されました。", quantity);
    // ここで他の処理、例えば価格の再計算などを行う
}

このコードでは、UITextFieldの値が変更された際に呼び出されるメソッドを表しています。

senderをUITextFieldとしてキャストし、入力された数量を取得しています。

この例では、数量が変更された際のログ出力を行っています。

このような実装を行うことで、商品の数量変更時に、どの商品の数量が変わったのかを特定し、その数量に基づいて必要な処理を行うことができます。

実際に上記のコードを実行すると、数量を変更するたびにコンソールに「数量が {変更後の数量} に変更されました。」というログが出力されます。

○サンプルコード15:タイマーを使って定期的にsenderの状態を確認・更新する方法

アプリケーションにおいて、特定のコンポーネントの状態を定期的に監視し、必要に応じて更新を行うシチュエーションが考えられます。

ここでは、NSTimerを使用して、定期的にsenderの状態を確認・更新する方法を紹介します。

NSTimer *timer;

- (void)viewDidLoad {
    [super viewDidLoad];
    timer = [NSTimer scheduledTimerWithTimeInterval:5.0
                                             target:self
                                           selector:@selector(updateSenderState:)
                                           userInfo:nil
                                            repeats:YES];
}

- (void)updateSenderState:(id)sender {
    NSLog(@"senderの状態を更新");
    // ここでsenderの状態を確認・更新する処理を行う
}

このコードでは、5秒ごとにupdateSenderState:メソッドが呼び出されるようにNSTimerを設定しています。

このメソッドの中で、senderの状態の確認や更新を行うことができます。

NSTimerを利用することで、アプリケーションの特定のコンポーネントの状態を定期的に確認・更新するといった処理を簡単に実装することができます。

上記のコードを実行すると、5秒ごとに「senderの状態を更新」というログがコンソールに出力され、このタイミングでsenderの状態の確認・更新が行われることが確認できます。

まとめ

Objective-Cにおけるsenderは、イベント駆動型のプログラミングにおいて非常に役立つ要素です。

特に、ユーザーのインタラクションに応じてどのコンポーネントからの入力かを判断する際や、コンポーネントの状態を監視・更新する場面などでその有効性を発揮します。

今回紹介したショッピングカートの数量変更やタイマーを用いた定期的な状態の確認・更新などの実践的な例を通じて、senderの活用方法の一端を学ぶことができたかと思います。

日々のプログラミングの中で、これらのテクニックを取り入れることで、より効率的で拡張性のあるコードの実装が可能となります。