您只能使用一个 PickerView,根据某些条件显示不同的数据。
我的想法如下:您可以创建,比如说,8 个不同的数组 - 一个用于填充 UIPickerView,具体取决于所点击的 UITextField。在接口中声明为 NSArray 并在 viewDidLoad 中初始化:
array1st = ...
array2nd = ...
array3d = ...
//and until 8.
然后你创建另一个只是为了指向应该填充它的数组(如NSArray *currentArray),你甚至不需要初始化它=它只会用于指向正确的数组。
因此,您应该将 UITextFields 的委托设置为您的视图控制器,并在方法 textFieldShouldBeginEditing 中检查谁是 UITextField,将正确的数组分配为 currentArray,使用 reloadData 重新加载 UIPickerView,然后返回 NO在相同的textFieldShouldBeginEditing 方法中。 currentTextField 是一个指针,仅用于知道正在“编辑”的 currentUITextField 是什么 - 我们需要存储它以便能够在选择器中选择数据后设置文本。在界面中声明currentTextField。
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
currentTextField = textField;
if (textField == myFirstTextView)
{
currentArray = array1st;
[pickerView reloadData];
[self animatePickerViewIn];
return NO;
}
//and this way until 8th
}
所以,当你的视图控制器,实际上是 UIPickerViewDelegate 时,你根据当前数组填充你的 UIPickerView 并且你不需要改变任何东西,只需使用 currentArray 作为数组来获取数据。
现在,显示pickerView:
连接 IBOutlet 后,在 viewDidLoad 中你应该做两件事:设置 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]];
}