Objective-CのUIPickerViewを完全活用する10選の方法

Objective-CのUIPickerViewを活用するイラストObjctive-C
この記事は約26分で読めます。

 

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

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

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

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

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

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

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

はじめに

Objective-CはAppleが開発したプログラミング言語で、iOSやmacOSのアプリケーション開発に広く使用されています。

近年はSwiftが主流となってきましたが、Objective-Cもまだ多くの既存プロジェクトで活躍しており、その知識は非常に価値があります。

この記事では、Objective-Cの中でも特にUIPickerViewに焦点を当て、その使い方からカスタマイズ方法、そして注意点までを網羅的に解説していきます。

Objective-CのUIPickerViewを活用することで、アプリケーションに多彩な選択機能を取り入れることができます。

その活用方法として、今回は特に10の方法をピックアップして紹介します。

それぞれの方法には具体的なサンプルコードとその実行結果も併せて解説しますので、最後までじっくりとご覧ください。

●Objective-Cとは?

Objective-Cは、C言語をベースにSmalltalkのオブジェクト指向機能を取り入れたプログラミング言語です。

AppleのNeXTステップOSと共に開発が進められ、後にiOSやmacOSのアプリケーション開発言語として主流となりました。

○Objective-Cの基本的な特徴

  1. オブジェクト指向:Objective-Cはフルオブジェクト指向言語であり、継承、ポリモーフィズム、カプセル化などのオブジェクト指向の3大要素をサポートしています。
  2. 動的タイピング:変数の型を実行時に決定する動的タイピングをサポートしており、柔軟なコーディングが可能です。
  3. メッセージ送信:Objective-Cの中核的な特徴の一つに、メソッド呼び出しの代わりにメッセージ送信という概念があります。これにより、実行時に呼び出すメソッドを動的に変更することもできます。
  4. カテゴリ:既存のクラスに新しいメソッドを追加することができるカテゴリという機能があります。これにより、ライブラリのソースコードを変更することなく機能を拡張することができます。

Objective-Cのこれらの特徴は、iOSやmacOSのアプリケーション開発において大きな強みとなっています。

特にUIPickerViewのようなUIコンポーネントを活用する際に、Objective-Cの動的な特性が役立ちます。

●UIPickerViewとは?

UIPickerViewは、Objective-Cで使用されるiOSのUIコンポーネントの一つで、ユーザーが複数の選択肢から1つを選択するためのツールです。

ユーザーがカテゴリーや日付、時刻などを簡単に選択できるようにデザインされています。

iOSの日常的なアプリでよく見かけるのが、日付の入力や都道府県の選択などでの使用です。

UIPickerViewは回転するホイールのようなデザインで、中心にある目盛りの部分で表される項目が選択される仕組みとなっています。

これにより、ユーザーが選択肢を素早くスクロールして目的の項目を探し出すことができます。

○UIPickerViewの基本的な特徴

  1. 複数のコンポーネント:UIPickerViewは1つだけでなく、複数のコンポーネントを持つことができます。これにより、都道府県と市町村のように関連する複数の選択肢を一つのUIPickerViewで表示することができます。
  2. デリゲートとデータソース:UIPickerViewの動作や表示内容は、それぞれデリゲートとデータソースのメソッドを通じて制御されます。これにより、表示するデータの数や内容、選択された項目に応じたアクションを実装することができます。
  3. 可変性:UIPickerViewの行の高さやフォント、テキストの色など、外観や動作はカスタマイズ可能です。これにより、アプリのデザインやユーザーのニーズに合わせて調整することができます。
  4. アクセシビリティ対応:VoiceOverなどのスクリーンリーダー機能との連携も考慮されており、視覚障害のあるユーザーでも操作が容易です。

UIPickerViewは、そのシンプルさと柔軟性から、Objective-Cを使用したiOSアプリ開発において、ユーザー入力のための主要なツールとして広く採用されています。

●UIPickerViewの使い方

UIPickerViewは、iOSアプリケーションにおいて、ユーザーがリストから項目を選択できるような回転するホイールを提供するUIコンポーネントです。

例えば、日付や都市、商品などのリストからユーザーが選択する場合に使用されます。

○サンプルコード1:UIPickerViewの基本的な表示

まずは、UIPickerViewを画面に表示する基本的なコードから見ていきましょう。

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UIPickerViewDataSource, UIPickerViewDelegate>

@property (weak, nonatomic) IBOutlet UIPickerView *pickerView;
@property (nonatomic, strong) NSArray *data;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.data = @[@"項目1", @"項目2", @"項目3", @"項目4"];
    self.pickerView.dataSource = self;
    self.pickerView.delegate = self;
}

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
    return 1; // 1列のピッカー
}

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
    return self.data.count; // データの数だけ行を表示
}

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
    return self.data[row]; // 各行のタイトルを設定
}

@end

このコードでは、UIPickerViewを使って4つの項目を持つピッカーを表示しています。

この例では、ViewControllerがUIPickerViewのデータソースとデリゲートを担当しており、numberOfComponentsInPickerView:メソッドとpickerView:numberOfRowsInComponent:メソッドでピッカーの列と行の数を設定しています。

また、pickerView:titleForRow:forComponent:メソッドで各行のタイトルを設定しています。

実行すると、ピッカーが画面に表示され、”項目1″から”項目4″までの項目を選択できるようになります。

○サンプルコード2:UIPickerViewで複数の列を表示

次に、UIPickerViewで複数の列を表示する方法を見ていきましょう。

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
    return 2; // 2列のピッカー
}

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
    if (component == 0) {
        return self.data1.count; // 1列目のデータの数だけ行を表示
    } else {
        return self.data2.count; // 2列目のデータの数だけ行を表示
    }
}

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
    if (component == 0) {
        return self.data1[row]; // 1列目の各行のタイトルを設定
    } else {
        return self.data2[row]; // 2列目の各行のタイトルを設定
    }
}

このコードでは、UIPickerViewに2列を表示しています。

numberOfComponentsInPickerView:メソッドで列の数を2に設定し、pickerView:numberOfRowsInComponent:メソッドとpickerView:titleForRow:forComponent:メソッドを使用して、各列の行の数とタイトルを設定しています。

実行すると、2列のピッカーが画面に表示され、それぞれの列で異なる項目を選択できるようになります。

○サンプルコード3:UIPickerViewで選択した値を取得

最後に、UIPickerViewで選択した値を取得する方法を紹介します。

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
    NSString *selectedValue = self.data[row];
    NSLog(@"選択された値: %@", selectedValue);
}

このコードでは、pickerView:didSelectRow:inComponent:メソッドを使用して、ピッカーで選択された行の値を取得しています。

選択された値はNSLogでコンソールに表示されます。

実行すると、ピッカーで項目を選択すると、その項目の値がコンソールに表示されるようになります。

●UIPickerViewの応用例

UIPickerViewは単なる選択ツール以上のものとして活用できる強力なUIコンポーネントです。

ここでは、UIPickerViewの応用例をいくつか紹介します。

○サンプルコード4:UIPickerViewで日付や時刻を表示

日付や時刻をUIPickerViewで表示するには、UIDatePickerを使用します。

UIDatePickerはUIPickerViewのサブクラスで、日付や時刻を選択するための専用コンポーネントです。

// ViewController.h
#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

@property (strong, nonatomic) UIDatePicker *datePicker;

@end

// ViewController.m
#import "ViewController.h"

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    // UIDatePickerの初期化
    self.datePicker = [[UIDatePicker alloc] init];
    self.datePicker.frame = CGRectMake(0, 100, self.view.bounds.size.width, 200);
    // モードの設定
    self.datePicker.datePickerMode = UIDatePickerModeDate;
    // Viewに追加
    [self.view addSubview:self.datePicker];
}

@end

このコードではUIDatePickerを使って日付を選択するコードを表しています。

この例では日付選択モードを指定し、画面上部に配置しています。

実行すると、アプリ画面上部に日付選択のピッカーが表示され、ユーザーは日付をスクロールして選択できます。

○サンプルコード5:UIPickerViewとUITableViewの連携

UIPickerViewとUITableViewを連携させることで、ピッカーで選択した内容をテーブルビューに表示するなどの機能を実現できます。

// ViewController.h
#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UIPickerViewDelegate, UIPickerViewDataSource, UITableViewDataSource, UITableViewDelegate>

@property (strong, nonatomic) UIPickerView *pickerView;
@property (strong, nonatomic) UITableView *tableView;
@property (strong, nonatomic) NSArray *data;
@property (strong, nonatomic) NSString *selectedItem;

@end

// ViewController.m
#import "ViewController.h"

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    // データの初期化
    self.data = @[@"Apple", @"Banana", @"Cherry", @"Date", @"Elderberry"];

    // UIPickerViewの初期化
    self.pickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 100, self.view.bounds.size.width, 200)];
    self.pickerView.delegate = self;
    self.pickerView.dataSource = self;
    [self.view addSubview:self.pickerView];

    // UITableViewの初期化
    self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 310, self.view.bounds.size.width, 300)];
    self.tableView.delegate = self;
    self.tableView.dataSource = self;
    [self.view addSubview:self.tableView];
}

// UIPickerViewのDelegateとDataSourceの実装
// その他の実装は省略...
@end

このコードではUIPickerViewとUITableViewを連携させるコードを表しています。

この例では、ピッカーで選択したアイテムをテーブルビューに表示する機能を実現しています。

実行すると、アプリ画面にピッカーとテーブルビューが表示されます。

ピッカーでアイテムを選択すると、そのアイテムがテーブルビューに表示される動作を確認できます。

○サンプルコード6:UIPickerViewで動的なデータを表示

UIPickerViewは固定のデータを表示するだけでなく、動的に変更されるデータも表示することができます。

たとえば、ユーザーの操作に応じて内容が変わるリストや、データベースから取得した情報を動的に表示したい場合などに役立ちます。

こちらのサンプルコードでは、ボタンをタップすることでUIPickerViewのデータが動的に変更される例を示しています。

#import "ViewController.h"

@interface ViewController () <UIPickerViewDelegate, UIPickerViewDataSource>
@property (weak, nonatomic) IBOutlet UIPickerView *pickerView;
@property (nonatomic, strong) NSArray *data1;
@property (nonatomic, strong) NSArray *data2;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.data1 = @[@"りんご", @"みかん", @"ぶどう"];
    self.data2 = @[@"トマト", @"きゅうり", @"なす"];

    self.pickerView.delegate = self;
    self.pickerView.dataSource = self;
}

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
    return 1;
}

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
    return self.data1.count;
}

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
    return self.data1[row];
}

- (IBAction)changeData:(id)sender {
    self.data1 = self.data2;
    [self.pickerView reloadComponent:0];
}

@end

このコードでは、初期のデータとしてdata1をUIPickerViewに表示しています。

しかし、changeData:メソッドを実行すると、data1data2に置き換えられ、UIPickerViewの表示内容が「トマト」「きゅうり」「なす」に変わります。

実際にアプリを実行すると、最初に「りんご」「みかん」「ぶどう」が表示されるUIPickerViewが表示されます。

そして、指定したボタンをタップすると、中身が「トマト」「きゅうり」「なす」に変わることが確認できます。

○サンプルコード7:UIPickerViewの外観をカスタマイズ

UIPickerViewの外観は、標準のものだけでなく、自分の好みやアプリのデザインに合わせてカスタマイズすることも可能です。

特にビジュアルの一貫性を保ちたいアプリや、ブランドイメージを強化したい場合には、このカスタマイズ機能が非常に役立ちます。

下記のサンプルコードでは、UIPickerViewの背景色や選択された項目の文字色を変更する方法を表しています。

#import "ViewController.h"

@interface ViewController () <UIPickerViewDelegate, UIPickerViewDataSource>
@property (weak, nonatomic) IBOutlet UIPickerView *pickerView;
@property (nonatomic, strong) NSArray *data;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.data = @[@"Item1", @"Item2", @"Item3"];

    self.pickerView.delegate = self;
    self.pickerView.dataSource = self;

    // UIPickerViewの背景色を変更
    self.pickerView.backgroundColor = [UIColor lightGrayColor];
}

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
    return 1;
}

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
    return self.data.count;
}

- (NSAttributedString *)pickerView:(UIPickerView *)pickerView attributedTitleForRow:(NSInteger)row forComponent:(NSInteger)component {
    NSString *title = self.data[row];
    NSAttributedString *attributedTitle = [[NSAttributedString alloc] initWithString:title attributes:@{NSForegroundColorAttributeName: [UIColor blueColor]}];
    return attributedTitle;
}

@end

このコードを実行すると、UIPickerViewの背景色が薄い灰色になり、各項目の文字色が青色に変わっていることが確認できます。

特にattributedTitleForRow:forComponent:メソッドを使用することで、各行の文字色やフォントなどを個別にカスタマイズすることができます。

○サンプルコード8:UIPickerViewにアニメーションを追加

UIPickerViewは単に情報を表示するだけでなく、アニメーションを追加することでユーザーエクスペリエンスを向上させることができます。

このコードではUIPickerViewにスムーズなアニメーションを追加する方法を表しています。

この例ではピッカーが表示された際にフェードインするアニメーションを追加しています。

// UIPickerViewのインスタンスを作成
UIPickerView *pickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 200)];
pickerView.alpha = 0.0; // 初期状態を透明に設定

[self.view addSubview:pickerView];

// アニメーションの追加
[UIView animateWithDuration:0.5 animations:^{
    pickerView.alpha = 1.0;
}];

このコードを実行すると、UIPickerViewがフェードインしながら表示されます。

このような簡単なアニメーションを追加することで、アプリの利用者により良い使用感を提供することができます。

○サンプルコード9:UIPickerViewで複数の選択を実現

通常のUIPickerViewは一つの項目しか選択できませんが、カスタマイズを行うことで複数の項目を選択することが可能です。

このコードではUIPickerViewで複数選択を実現する方法を表しています。

この例では3つの項目を同時に選択できるようにしています。

// UIPickerViewのデリゲートメソッド
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
    if(component == 0) {
        // 1番目の項目が選択されたときの処理
    } else if(component == 1) {
        // 2番目の項目が選択されたときの処理
    } else if(component == 2) {
        // 3番目の項目が選択されたときの処理
    }
}

このコードを実行すると、UIPickerViewの各列で選択された項目に応じた処理を行うことができます。

このようにして、一つのUIPickerViewで複数の選択を取得することが可能になります。

○サンプルコード10:UIPickerViewとCore Dataの連携

データの保存や管理にはCore Dataがよく用いられます。

UIPickerViewと連携させることで、簡単にデータの読み書きや更新が可能です。

このコードでは、UIPickerViewとCore Dataの連携を行う方法を表しています。

この例ではCore Dataから取得したデータをUIPickerViewに表示しています。

NSManagedObjectContext *context = [self managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"EntityName"];
NSArray *results = [context executeFetchRequest:fetchRequest error:nil];

NSMutableArray *dataArray = [NSMutableArray array];
for (NSManagedObject *object in results) {
    [dataArray addObject:[object valueForKey:@"attributeName"]];
}

// UIPickerViewのデータソースとして使用
pickerView.dataSource = dataArray;

このコードを実行すると、Core Dataから取得したデータがUIPickerViewに表示されます。

このようにして、UIPickerViewとCore Dataを連携させることで、効率的なデータ管理と表示を実現することができます。

●注意点と対処法

UIPickerViewはObjective-Cで提供される非常に便利なUIコンポーネントの一つですが、その利用に当たってはいくつかの注意点や制約が存在します。

ここでは、これらの注意点や制約、そしてそれらの対処法について詳しく解説していきます。

○UIPickerViewの制約と最適な使い方

UIPickerViewは、選択肢を回転することで選択するUIですが、そのデザインや動作にはいくつかの制約が存在します。

  1. UIPickerViewは無限の行数を持つことができません。多すぎる選択肢を提供すると、ユーザーエクスペリエンスが損なわれる可能性があります。
  2. 既定のデザインを大きく変更することは難しく、カスタマイズの範囲は限られています。
  3. 大量のデータを表示する場合、動作が遅くなることがあります。

これらの制約を避けるための最適な使い方は次の通りです。

  1. 必要な選択肢のみを表示し、不要な選択肢は削除またはグルーピングします。
  2. カスタムビューを使用して、表示を独自にカスタマイズする代わりに、基本的なデザインを活かすよう努めます。
  3. 大量のデータを扱う際は、遅延ロードなどのテクニックを使用して、動作の速度を維持します。

○よくあるエラーとその対処法

Objective-CでのUIPickerView利用時には、次のような一般的なエラーが発生することがあります。

□データソースのエラー

UIPickerViewのデータソースが正しく設定されていない場合、アプリがクラッシュすることがあります。

このコードでは、UIPickerViewのデータソースを設定する方法を表しています。

この例では、配列から選択肢を提供しています。

// UIPickerViewのデータソースを設定
NSArray *pickerData = @[@"選択肢1", @"選択肢2", @"選択肢3"];
self.pickerView.dataSource = self;
self.pickerView.delegate = self;

// デリゲートメソッドでデータを返す
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
    return 1;
}

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
    return pickerData.count;
}

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
    return pickerData[row];
}

このようにデータソースとデリゲートを正しく設定することで、エラーを防ぐことができます。

□デリゲートメソッドの不足

必要なデリゲートメソッドが実装されていないと、アプリが動作しない場合があります。

この問題は、全ての必要なデリゲートメソッドを確認し、実装することで解決します。

□外観のカスタマイズエラー

UIPickerViewの外観をカスタマイズする際に、誤ったプロパティを変更すると意図しない表示になることがあります。

外観をカスタマイズする際は、公式ドキュメントを参照し、正しいプロパティを変更することが重要です。

●UIPickerViewのカスタマイズ方法

UIPickerViewは非常に汎用性が高く、多くのアプリケーションで選択機能として利用されています。

しかし、デフォルトのUIや動作だけでなく、カスタマイズを施すことでさらに多彩な使い方が可能です。

ここでは、UIPickerViewの外観や動作をカスタマイズする手法を中心に解説していきます。

○外観の変更方法

UIPickerViewの外観を変更することで、アプリケーションのデザインやブランドに合わせた表示が可能になります。

□バックグラウンドカラーの変更

このコードでは、UIPickerViewの背景色を変更する方法を表しています。

この例では、背景色を青色に設定しています。

UIPickerView *pickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 0, 320, 200)];
pickerView.backgroundColor = [UIColor blueColor];
[self.view addSubview:pickerView];

このコードを実装すると、UIPickerViewの背景が青色に変わります。

□選択インジケータのスタイルの変更

このコードでは、UIPickerViewの選択インジケータのスタイルを変更するコードを表しています。

この例では、選択インジケータを明確に表示するスタイルに設定しています。

pickerView.showsSelectionIndicator = YES;

このコードを実装すると、選択している行が明確に分かるようになります。

○挙動のカスタマイズ手法

UIPickerViewの動作もカスタマイズ可能です。

ここでは、UIPickerViewの動作をカスタマイズするいくつかの方法を紹介します。

□初期位置の設定

このコードでは、UIPickerViewの初期選択位置を設定するコードを表しています。

この例では、3行目を初期選択として設定しています。

[pickerView selectRow:2 inComponent:0 animated:YES];

このコードを実装すると、UIPickerViewが表示されたときに3行目が選択された状態となります。

□UIPickerViewの回転を禁止

このコードでは、UIPickerViewの回転を禁止する方法を表しています。

この例では、回転を禁止しています。

pickerView.userInteractionEnabled = NO;

このコードを実装すると、UIPickerViewはユーザの操作による回転が禁止されます。

まとめ

UIPickerViewはObjective-Cを使用したアプリケーション開発において、多彩な選択機能を提供するツールとして非常に重要な役割を果たしています。

そのデフォルトの動作や外観も便利ですが、カスタマイズを施すことでアプリのデザインやブランドに合わせた使用が可能となります。

今回の記事で紹介したカスタマイズ方法は、UIPickerViewをより効果的に活用するための一部に過ぎません。

Objective-Cの知識を深め、UIPickerViewのさまざまなカスタマイズや応用例を探求することで、よりユーザビリティの高いアプリケーションを作成することができます。