絶対に挫折しないiPhoneアプリ開発入門Part.27 ~ひとつのUIViewControllerに複数のUIPickerView,UITextField~

前回:絶対に挫折しないiPhoneアプリ開発入門Part.26 ~iPhoneのコピペ、ペーストボードへの文字列コピー~

題名のとおりのことを今回はやってみましょう。

こんな感じです。


SingeViewApplicationからスタートします。
今回、Storyboardは使いません。ARCは有効にしております。

2つのUITextFieldを設置、紐付け

上のほうがtextField1で、下のほうがtextField2という名前です。

UIPickerViewはコードで書きます。

hファイルにデリゲートを書く

ViewController.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UITextFieldDelegate,UIPickerViewDelegate,UIPickerViewDataSource>

@property (weak, nonatomic) IBOutlet UITextField *textField1;
@property (weak, nonatomic) IBOutlet UITextField *textField2;
@end

テキストフィールドとピッカーの設置

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController
{
    UIPickerView *picker1;
    UIPickerView *picker2;
    
    NSString *pic1_str;
    NSString *pic2_str;
}
@synthesize textField1;
@synthesize textField2;

- (void)viewDidLoad
{
    /*
     * テキストフィールドとピッカーにタグをつけるのが今回のポイントです。
     * まだ慣れてない人は、デリゲートを書くのを忘れがちなのでhファイルの<UITextFieldDelegate,UIPickerViewDelegate,UIPickerViewDataSource>に注意
     * delegateにselfを指定することも忘れないこと。
     * UITextFieldDelegateを入れることでShouldBeginEditingを呼び出せる
     * ピッカーについて私が以前に書いた記事も参照してください。http://d.hatena.ne.jp/kazukingband/20120522/1337638966
     */
    
    
    [super viewDidLoad];
    textField1.delegate = self;
    textField2.delegate = self;
    textField1.tag = 1;
    textField2.tag = 2;
    
    picker1 = [[UIPickerView alloc] init];
    picker1.frame = CGRectMake(0, 460, 320, 216);
    picker1.showsSelectionIndicator = YES;
    picker1.delegate = self;
    picker1.dataSource = self;
    picker1.tag = 1;
    [self.view addSubview:picker1];
    
    picker2 = [[UIPickerView alloc] init];
    picker2.frame = CGRectMake(0, 460, 320, 216);
    picker2.showsSelectionIndicator = YES;
    picker2.delegate = self;
    picker2.dataSource = self;
    picker2.tag = 2;
    [self.view addSubview:picker2];
}

コメントにも書きましたが、今回のポイントは、

テキストフィールドとピッカー両方にタグをつける

というところです。

テキストフィールドを編集する直前に呼び出されるメソッドを実装

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
    
    if (textField.tag == 1) {
        NSLog(@"1");
        picker2.frame = CGRectMake(0, 460, 320, 216);
        
        [self showPicker1]; //picker1を表示させるメソッドを実行

        //キーボードは表示させない
        return NO;
        
    }
    if (textField.tag == 2) {
        NSLog(@"2");
        picker1.frame = CGRectMake(0, 460, 320, 216);
        
        
        [self showPicker2]; //picker2を表示させるメソッドを実行
        
        //キーボードは表示させない
        return NO;
    }
}

流れは、

1.上のテキストフィールド(textField1)が編集されたいんだな
2.textField1のタグ(1です)を読み取る
3.showPicker1メソッドが呼ばれる、キーボードは表示しない(showPicker2メソッドは呼ばれない)

タグによる条件分岐ですね。

textField2についても同様で、textField2のタグは2です。

あと、textField1にフォーカスされたときにはpicker2を隠し、逆もまた同様にしています。


picker1あるいはpicker2を表示させる

- (void)showPicker1 {
	//picker1が出てくる
	[UIView beginAnimations:nil context:NULL];
	[UIView setAnimationDuration:0.2];
	[UIView setAnimationDelegate:self];
	picker1.frame = CGRectMake(0, 204, 320, 216); //picker1を呼び出します
	[UIView commitAnimations];
}

- (void)showPicker2 {
	//picker2が出てくる
	[UIView beginAnimations:nil context:NULL];
	[UIView setAnimationDuration:0.2];
	[UIView setAnimationDelegate:self];
	picker2.frame = CGRectMake(0, 204, 320, 216); //picker2を呼び出します
	[UIView commitAnimations];
    
}

テキストフィールドからピッカーを呼び出す方法はこの記事も参照してくださいね。
絶対に挫折しないiPhoneアプリ開発入門Part.25 ~UITextFieldでUIPickerViewを出すサンプル~
細かい説明は省きます。

ピッカーのメソッドを書く

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

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
    if (pickerView.tag == 1) {
        return 3;
    }
    if (pickerView.tag == 2) {
        return 3;
    }
}

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
    if (pickerView.tag == 1) {
        NSArray *arr = [[NSArray alloc] initWithObjects:@"絶対に",@"挫折しない",@"iPhoneアプリ開発入門",nil];
        pic1_str = [NSString stringWithFormat:@"%@",[arr objectAtIndex:row]];
        return pic1_str;
    }
    if (pickerView.tag == 2) {
        NSArray *arr = [[NSArray alloc] initWithObjects:@"勉強会も",@"やってるので",@"ご連絡ください",nil];
        pic2_str = [NSString stringWithFormat:@"%@",[arr objectAtIndex:row]];
        return pic2_str;
    }
}

- (void) pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    if (pickerView.tag == 1) {
        NSArray *arr = [[NSArray alloc] initWithObjects:@"絶対に",@"挫折しない",@"iPhoneアプリ開発入門",nil];
        pic1_str = [NSString stringWithFormat:@"%@",[arr objectAtIndex:row]];
        textField1.text = pic1_str;
    }
    if (pickerView.tag == 2) {
        NSArray *arr = [[NSArray alloc] initWithObjects:@"勉強会も",@"やってるので",@"ご連絡ください",nil];
        pic2_str = [NSString stringWithFormat:@"%@",[arr objectAtIndex:row]];
        textField2.text = pic2_str;
    }
}

viewDidLoadのなかで、picker1.tag = 1 と picker2.tag = 2 を書きましたね。
ここで使っています。


種明かしをすればなんだこれだけのことかって感じなのですが、
意外につまるポイントなのではないかと思い書きました。


この問題に悩んでいる人が無事にこの記事にたどり着くことを祈って。


ソースコードGitHubからどうぞ。
https://github.com/ics-hiro/iOS_Samples


======================
当ブログ管理人のツイッターこちら
◎フォローしてくださると泣いて喜びます!ツイッター上で当ブログの質問などにもできるだけお答えしますし、役に立つiPhoneアプリ開発情報もつぶやきます。個人的なご依頼(たとえば、プログラミングの家庭教師、Skypeレッスンをしてくれないか、iPhoneアプリ開発の勉強会ってやってるの、とかですね)でもかまいません。
スカイプレッスンについて
開発をしているとその都度ぶつかる問題があると思いますが、検索で調べてもなかなかわからない、あるいは調べても非常に時間がかかる場合があると思います。開発者のみなさんもお忙しいと思いますので、私のレッスンを受けながら開発を進めていただけると、大幅にお時間を短縮できます。加えて、iPhoneアプリ開発の基礎、応用が身につき、今後の開発もスムーズに進められます

お問い合わせはツイッター、またはhiyoshimarukoアットマークgmail.comまでお願いします。(アットマークを@にしてください)お待ちしております!