その後のその後

iOSエンジニア 堤 修一のブログ github.com/shu223

UITextFieldへの入力時にキーボードではなくUIPickerViewを出す方法

普通はキーボードがニュッと出てくるところを、ピッカー出すようにします。
(某アプリのクレジットカード対応でカードの有効期限入力するところで用いました)


ものすごくシンプルに書くと、

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
    // Show UIPickerView

    return NO;
}


こういうことになります。
textFieldShouldBeginEditing:というUITextFieldのデリゲートメソッドでNOを返すことで、キーボードが出なくなります。




ピッカー出すところまで書くならこんな感じ。

- (void)showPicker {
	// ピッカーが下から出るアニメーション
	[UIView beginAnimations:nil context:NULL];
	[UIView setAnimationDuration:0.4];
	[UIView setAnimationDelegate:self];
	picker.center = CGPointMake(160, SHOW_TARGET);
	[UIView commitAnimations];
	
	// 右上にdoneボタン
	if (!self.navigationItem.rightBarButtonItem) {
        UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(done:)];
        [self.navigationItem setRightBarButtonItem:doneButton animated:YES];
        [doneButton release];
    }	
}


- (void)hidePicker {
	// ピッカーが下に隠れるアニメーション
	[UIView beginAnimations:nil context:NULL];
	[UIView setAnimationDuration:0.4];
	[UIView setAnimationDelegate:self];
	picker.center = CGPointMake(160, HIDE_TARGET);
	[UIView commitAnimations];

	// doneボタンを消す
	[self.navigationItem setRightBarButtonItem:nil animated:YES];
}


- (void)done:(id)sender {
	// ピッカーしまう
	[self hidePicker];
	
	// doneボタン消す
    [self.navigationItem setRightBarButtonItem:nil animated:YES];
}


- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
	// ピッカー表示開始
	[self showPicker];

    return NO;
}