Reputation: 359
Hi I am developing an iphone app where I have populated a uipickerview and it works great with one uitextfield. But I have 4 uitextfield I need to populate and I am using the same uipickerview for each UItextfield. I have no idea how to implement this thing.
Pickerviewcontroller.m
arrChooseServices=[[NSMutableArray alloc]initWithObjects:@"A+ve",@"A-ve",@"B+ve",@"B-ve",@"AB+ve",@"AB-ve",@"O+ve",@"O-ve", nil];
// Create UITextfield
bloodGroup=[[UITextField alloc]initWithFrame:CGRectMake(150, 200, 120, 20)];
bloodGroup.borderStyle=UITextBorderStyleRoundedRect;
bloodGroup.backgroundColor=[UIColor clearColor];
bloodGroup.backgroundColor=[UIColor colorWithRed:0.662745 green:0.662745 blue:0.662745 alpha:0.5];
[bloodGroup setUserInteractionEnabled:NO];
bloodGroup.font=[UIFont systemFontOfSize:14.0];
bloodGroup.contentVerticalAlignment=UIControlContentVerticalAlignmentCenter;
bloodGroup.textAlignment=NSTextAlignmentCenter;
bloodGroup.delegate=self;
bloodGroup.inputView=self.chooseServicePicker;
bloodGroup.inputAccessoryView=self.accessoryView;
[self.view addSubview:bloodGroup];
-(UIPickerView *)chooseServicePicker
{
if(chooseServicePicker==nil)
{
chooseServicePicker=[[UIPickerView alloc]init];
chooseServicePicker.delegate=self;
chooseServicePicker.dataSource=self;
chooseServicePicker.showsSelectionIndicator=YES;
}
return chooseServicePicker;
}
-(UIToolbar *)accessoryView
{
if ( accessoryView == nil )
{
accessoryView = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 30)];
UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(onVehicleSelection)];
UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(cancel)];
accessoryView.items=[NSArray arrayWithObjects:doneButton,cancelButton, nil];
}
return accessoryView;
}
- (void)onVehicleSelection
{
NSInteger row = [self.chooseServicePicker selectedRowInComponent:0];
bloodGroup.text=[arrChooseServices objectAtIndex:row];
[bloodGroup resignFirstResponder];
}
- (NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
return [arrChooseServices objectAtIndex:row];
}
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return 1;
}
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
return ( arrChooseServices == nil ) ? 0 : [arrChooseServices count];
}
-(void)cancel
{
bloodGroup.text=@"";
[bloodGroup resignFirstResponder];
}
This is my code. Now i want to display another array values in another textfield using same UIPickerview
gender=[NSMutableArray alloc]initWithObjectis:@"MALE",@"Female",nil];
the above array values i want to add in Uipickerview. how to write the code. please give me any idea. I am new to the programming. Thanks in advance
Upvotes: 1
Views: 1340
Reputation: 1097
#import "ViewController.h"
@interface ViewController ()<UIPickerViewDelegate,UITextFieldDelegate>
{
UIPickerView *myPickerView;
int selectedTextfieldValue;
NSArray *namesArray , *genderArray, *ageArray;
}
@end
@implementation ViewController
-(void)viewDidLoad
{
[super viewDidLoad];
namesArray=[[NSArray alloc]initWithObjects:@"a",@"b", nil];
genderArray=[[NSArray alloc]initWithObjects:@"M",@"F", nil];
ageArray=[[NSArray alloc]initWithObjects:@"26",@"25", nil];
int yaxis =50;
selectedTextfieldValue=0;
for (int i=0; i<5; i++)
{
UITextField* bloodGroup=[[UITextField alloc]initWithFrame:CGRectMake(150, yaxis, 120,20)];
bloodGroup.borderStyle=UITextBorderStyleRoundedRect;
bloodGroup.backgroundColor=[UIColor clearColor];
bloodGroup.backgroundColor=[UIColor colorWithRed:0.662745 green:0.662745 blue:0.662745 alpha:0.5];
// bloodGroup.tag=(int)i;// first tag will be ZERO but by default view tag is ZERO so
bloodGroup.tag=(int)[[NSString stringWithFormat:@"20%d",i] intValue];
bloodGroup.font=[UIFont systemFontOfSize:14.0];
bloodGroup.contentVerticalAlignment=UIControlContentVerticalAlignmentCenter;
bloodGroup.textAlignment=NSTextAlignmentCenter;
bloodGroup.delegate=self;
[self.view addSubview:bloodGroup];
yaxis=yaxis +30;
}
}
-(void)textFieldDidBeginEditing:(UITextField *)textField
{
[self.view endEditing:YES];
NSLog(@"%d",textField.tag);
selectedTextfieldValue=(int)textField.tag;
// call picker here according to textfield tag you can set text to textfiled
[self popoverWithInformation];
}
-(void)popoverWithInformation
{
UIToolbar *pickerToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
pickerToolbar.barStyle = UIBarStyleBlackOpaque;
[pickerToolbar sizeToFit];
NSMutableArray *barItems = [[NSMutableArray alloc] init];
UIBarButtonItem *cancelBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(pickerCancel:)];
[barItems addObject:cancelBtn];
UIBarButtonItem *flexSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
[barItems addObject:flexSpace];
UIBarButtonItem *doneBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(pickerDone:)];
[barItems addObject:doneBtn];
[pickerToolbar setItems:barItems animated:YES];
myPickerView = [[UIPickerView alloc] init];
myPickerView.delegate = self;
myPickerView.showsSelectionIndicator = YES;
CGRect pickerRect = myPickerView.bounds;
myPickerView.bounds = pickerRect;
myPickerView.frame = CGRectMake(0, 44, 320, 216);
UIView* popoverView = [[UIView alloc] initWithFrame:CGRectMake(0, 44, 320, 300)];
popoverView.backgroundColor = [UIColor whiteColor];
[popoverView addSubview:myPickerView];
[popoverView addSubview:pickerToolbar];
[self.view addSubview:popoverView];
}
-(void)pickerView:(UIPickerView *)pickerView didSelectRow: (NSInteger)row inComponent:(NSInteger)component {
}
// tell the picker how many rows are available for a given component
-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
int count = 0;
switch (selectedTextfieldValue) {
case 200:
count =namesArray.count;
break;
case 201:
count =genderArray.count;
break;
case 202:
count =ageArray.count;
break;
default:
break;
}
return count;
}
// tell the picker how many components it will have
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
return 1;
}
// tell the picker the title for a given component
-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
NSString *title;
switch (selectedTextfieldValue) {
case 200:
title =namesArray[row];
break;
case 201:
title =genderArray[row];
break;
case 202:
title =ageArray[row];
break;
default:
break;
}
return title;
}
// tell the picker the width of each row for a given component
-(CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component {
int sectionWidth = 300;
return sectionWidth;
}
-(void)pickerDone:(id)sender
{
}
-(void)pickerCancel:(id)sender
{
}
Upvotes: 1
Reputation: 9484
If I am understanding your question correctly, I guess you need multi-column UIPickerView.
You need to define number of columns in this UIPickerViewDatasource method:
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
then in this method:
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
you need to return number of rows for each component.
Example::
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return 3; // for four columns
}
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
if(component == 0)
{
return _array1.count; // 10 rows in 1st column
}
else if(component == 1)
{
return _array2.count; // 15 rows in 1st column
}
else if(component == 2)
{
return _array3.count; // 15 rows in 1st column
}
}
Use this delegate method to fill your textfields, according to the row selected in UIPickerView
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
if(component == 0)
{
self.textfield1.text = [_array1 objectAtIndex:row];
}
else if(component == 1)
{
self.textfield2.text = [_array2 objectAtIndex:row];
}
else if(component == 2)
{
self.textfield3.text = [_array3 objectAtIndex:row];
}
}
Upvotes: 0
Reputation: 4671
You can use this to check which text going to becomeFirstResponder
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
And Based on this Condition
[textField isFirstResponder]
You can perform check what you need to display.
- (NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
if(textField1 isFirstResponder]
return [arrChooseServices objectAtIndex:row];
else if(textField2 isFirstResponder] return [otherArray count];
// write for every textfield other
}
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
if(textField1 isFirstResponder] return 1;
else if(textField2 isFirstResponder] return 3;
//In this way you can do what you need to show in picker view.
return 1;
}
//Same condition you can use in every delegate and datasource method.
Upvotes: 1
Reputation: 3203
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
textField.inputView = pickerView;
//Set the Tag of Uipickerview
pickerView.tag = textField.tag; // you could workaround with tag in delegate methods accordingly
[pickerView reloadAllComponents];
return YES;
}
Upvotes: -1