条件によって異なるデータを表示する PickerView は 1 つしか使用できません。
私の考えは次のとおりです。たとえば、8 つの異なる配列を作成できます。インターフェイスでそれらを NSArray として宣言し、viewDidLoad で初期化します。
array1st = ...
array2nd = ...
array3d = ...
//and until 8.
次に、それを埋める必要がある配列を指すためだけに別のものを作成し(のようにNSArray *currentArray
)、それを初期化する必要さえありません=正しい配列を指すためだけに使用されます。
したがって、UITextFields のデリゲートをビュー コントローラーに設定し、メソッドtextFieldShouldBeginEditing
で UITextField が誰であるかを確認し、正しい配列を currentArray として割り当て、UIPickerView を でリロードし、同じメソッドreloadData
で NO を返す必要があります。textFieldShouldBeginEditing
currentTextField は、現在の UITextField が「編集」されているものを知るためだけのポインターです。ピッカーでデータを選択した後にテキストを設定できるように、それを保存する必要があります。インターフェイスで currentTextField を宣言します。
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
currentTextField = textField;
if (textField == myFirstTextView)
{
currentArray = array1st;
[pickerView reloadData];
[self animatePickerViewIn];
return NO;
}
//and this way until 8th
}
したがって、実際にはUIPickerViewDelegateであるView Controllerの場合、現在の配列に従ってUIPickerViewを設定し、何も変更する必要はありません.currentArrayを配列として使用してデータを取得します.
次に、pickerView を表示します。
IBOutlet を接続した後、viewDidLoad で次の 2 つのことを行う必要があります。UIPickerView のフレームを設定し、それをサブビューとして追加します。
pickerView.frame = CGRectMake(0,self.view.frame.size.height, pickerView.frame.size.width, pickerView.frame.size.height);
pickerView.delegate = self;
pickerView.dataSource = self;
//or you can do it via Interface Builder, right click the pickerView and then connect delegate and dataSource to the file's owner
[self.view addSubview:pickerView];
animatePickerViewIn
ここで、ユーザーが UITextField をタップしたときに呼び出される というメソッドを作成する必要があります。
-(void)animatePickerViewIn
{
[UIView animateWithDuration:0.25 animations:^{
[pickerView setFrame:CGRectMake(0, pickerView.frame.origin.y-pickerView.frame.size.height, pickerView.frame.size.width, pickerView.frame.size.height)];
}];
}
pickerView にデータをロードするには:
-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
return [currentArray count];
}
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return 1;
}
-(NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
return [currentArray objectAtIndex:row];
}
ユーザーが pickerView で行を選択すると、それをデリゲート メソッドとして受け取ります。したがって、currentTextField のテキストを選択した値として設定するだけです。
-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
//and here you can do in two ways:
//1
[currentTextField setText:[currentArray objectAtIndex:row]];
//2
[currentTextField setText:[self pickerView:pickerView titleForRow:row inComponent:component]];
}