3

I am using textFields inputView property to display UIPickerViews instead of the keyboard. The way I have it programmed, I do not declare the PickerViews in the .H file, or connect them in the view in interface builder. When I implement the properties of the pickerviews, I am not able to make each of them with different properties. I tried using "if" statements to tell it to have different properties depending on which picker was being used like follows....

-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)agePickerView {
    if ([pickerView isEqual: agePickerView]){
                 return 1;
    }
            if ([pickerView isEqual: weightPickerView]){
                 return 1;
    }

}

When I do this though, It will say that weightPickerView is undeclared. So here is my code for implementing the pickerViews.

@implementation MainViewController

//WEIGHT FIELD CODE 

-(IBAction)weightFieldDidBeginEditing{
UIPickerView *weightPickerView = [[UIPickerView alloc] init];
weightField.inputView = weightPickerView;
weightPickerView.showsSelectionIndicator = YES;
weightPickerView.delegate = self;
weightPickerView.dataSource = self;
[weightPickerView release];

UIToolbar *weightToolBar = [[UIToolbar alloc] initWithFrame:CGRectMake(0,0,320,44)];
UIBarButtonItem *doneButton = [[UIBarButtonItem alloc]   initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(pickerDoneClicked:)];
[weightToolBar setItems:[NSArray arrayWithObject:doneButton] animated:NO];
 weightField.inputAccessoryView = weightToolBar;
}

-(NSInteger)weightpickerView:(UIPickerView *)weightPickerView numberOfRowsInComponent: (NSInteger)component{
return [weightPickerArray count];
}

-(NSString *)weightpickerView:(UIPickerView*)weightPickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
return [weightPickerArray objectAtIndex:row];
}

// AGE FIELD CODE

-(IBAction)ageFieldDidBeginEditing{
UIPickerView *agePickerView = [[UIPickerView alloc] init];
ageField.inputView = agePickerView;
agePickerView.showsSelectionIndicator = YES;
agePickerView.delegate = self;
agePickerView.dataSource = self;
[agePickerView release];

UIToolbar *ageToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0,0,320,44)];
UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(pickerDoneClicked:)];
[ageToolbar setItems:[NSArray arrayWithObject:doneButton] animated:NO];
ageField.inputAccessoryView = ageToolbar; 
}

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

-(NSInteger)pickerView:(UIPickerView *)agePickerView numberOfRowsInComponent: (NSInteger)component {
return [agePickerArray count];
}

-(NSString *)pickerView:(UIPickerView*)agePickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
    return [agePickerArray objectAtIndex:row];

}

-(void)pickerView:(UIPickerView *)agePickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{
    ageField.text = (NSString *) [agePickerArray objectAtIndex:row];
}

-(void)pickerDoneClicked:(id)sender{
[ageField resignFirstResponder];
[weightField resignFirstResponder];
}



// Implement viewDidLoad to do additional setup after loading the view, typically from a    nib.
- (void)viewDidLoad {
[super viewDidLoad];

agePickerArray = [[NSMutableArray alloc] init];
for (int age=1; age<=100; age++) {
    NSString *ageString = [NSString stringWithFormat:@"%d%",age];
                           [agePickerArray    addObject:ageString];


weightPickerArray = [[NSMutableArray alloc] init];
for (int weight = 50; weight<=500; weight++) {
    NSString *weightString = [NSString stringWithFormat:@"%d%",weight];
                            [weightPickerArray   addObject:weightString];
    }
}

Is there any other way to do what I am trying to do , because that way is not working... And if i just try and redo the implementation for each picker view i get the errors of "redefinition of...""numberOfRowsInComponent"" or which ever other property i am doing. Please help, even if I have to change it and declare the pickerViews in the .H file somehow, I don't care what I have to do as long as I can get this to work!!

THANKS

UPDATE!!!

   @interface MainViewController : UIViewController   <FlipsideViewControllerDelegate,UITextFieldDelegate,UIPickerViewDelegate,UIPickerViewDataSource> {

IBOutlet UITextField*ageField;

NSMutableArray *agePickerArray;
IBOutlet UITextField*weightField;
NSMutableArray *weightPickerArray;
UIPickerView *weightPickerView;
UIPickerView *agePickerView;    

   }

- (IBAction)ageFieldDidBeginEditing;
- (IBAction)weightFieldDidBeginEditing;
- (IBAction)showInfo:(id)sender;
- (IBAction)activityButtonClicked;
@end

.m file

-(IBAction)weightFieldDidBeginEditing{
//UIPickerView *weightPickerView = [[UIPickerView alloc] init];
weightField.inputView = weightPickerView;
weightPickerView.showsSelectionIndicator = YES;
weightPickerView.delegate = self;
weightPickerView.dataSource = self;
[weightPickerView release];

UIToolbar *weightToolBar = [[UIToolbar alloc] initWithFrame:CGRectMake(0,0,320,44)];
UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(pickerDoneClicked:)];
[weightToolBar setItems:[NSArray arrayWithObject:doneButton] animated:NO];
 weightField.inputAccessoryView = weightToolBar;
}

-(NSInteger)weightpickerView:(UIPickerView *)weightPickerView numberOfRowsInComponent:(NSInteger)component{
return [weightPickerArray count];
}

-(NSString *)weightpickerView:(UIPickerView*)weightPickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
return [weightPickerArray objectAtIndex:row];
}

// AGE FIELD CODE

-(IBAction)ageFieldDidBeginEditing{
//UIPickerView *agePickerView = [[UIPickerView alloc] init];
ageField.inputView = agePickerView;
agePickerView.showsSelectionIndicator = YES;
agePickerView.delegate = self;
agePickerView.dataSource = self;
[agePickerView release];

UIToolbar *ageToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0,0,320,44)];
UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(pickerDoneClicked:)];
[ageToolbar setItems:[NSArray arrayWithObject:doneButton] animated:NO];
ageField.inputAccessoryView = ageToolbar; 
}

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

-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
if ([pickerView isEqual: agePickerView]) {
    return [agePickerArray count];
}
if ([pickerView isEqual:weightPickerView]) {
    return [weightPickerArray count];
}
}

-(NSString *)pickerView:(UIPickerView*)agePickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
    return [agePickerArray objectAtIndex:row];

}

-(void)pickerView:(UIPickerView *)agePickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{
    ageField.text = (NSString *) [agePickerArray objectAtIndex:row];
}

-(void)pickerDoneClicked:(id)sender{
[ageField resignFirstResponder];
[weightField resignFirstResponder];
}



// Implement viewDidLoad to do additional setup after loading the view, typically from a   nib.
- (void)viewDidLoad {
[super viewDidLoad];

agePickerArray = [[NSMutableArray alloc] init];
for (int age=1; age<=100; age++) {
    NSString *ageString = [NSString stringWithFormat:@"%d%",age];
                           [agePickerArray   addObject:ageString];


weightPickerArray = [[NSMutableArray alloc] init];
for (int weight = 50; weight<=500; weight++) {
    NSString *weightString = [NSString stringWithFormat:@"%d%",weight];
                            [weightPickerArray addObject:weightString];
    }
}
user1450221
  • 109
  • 2
  • 12

2 Answers2

7
UIPickerView *weightPickerView = [[UIPickerView alloc] init];

You need to declare that in your .h file (or interface).

Are you subclassing UIPickerView?

Edit* If you don't want to declare those in your .h file for some reason, set a tag to your pickers.

All of your UIPickerViews will be calling UIPickerViewDelegate methods, meaning -(NSInteger)weightpickerView:(UIPickerView *)weightPickerView numberOfRowsInComponent: (NSInteger)component will not be called unless you are subclassing and creating your own methods (which I believe you are not), i.e.

-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent: (NSInteger)component {
  if([pickerView isEqual: agePickerView]){
   return [agePickerArray count];
  }else if([pickerView isEqual: weightPickerView]){
   return [weightPickerArray count];
  }else return 0;
}

If you'd like to do it with tags;

weightPickerView.tag = 100; //set the tag

if(pickerView.tag == 100) //check which picker it is
ohr
  • 1,717
  • 14
  • 15
  • When i declare them in .h file and then run the program it says that it is hiding an instance variable... How do i set a tag to the pickers? And I am not sure what you mean by subclassing...I am new to programing. @Oscar Hernadez – user1450221 Jul 29 '12 at 23:49
  • That is because you are declaring it in your .h file and in your IBAction method again, remove the `UIPickerView *` declaration there. All of your pickers will be calling the same delegate methods. I'll edit my answer. – ohr Jul 30 '12 at 02:10
  • I took your advice and moved UIPickerView *weightPickerView to interface and used the if statements for the number of rows, however now when i run the program the pickerview does not pop up when i click on the texfields, it brings the keyboard back up. Maybe I am implementing it wrong in interface...I will update my answer with my code. @Oscar Hernandez – user1450221 Jul 31 '12 at 04:01
  • Where are you creating your pickers? You need to `alloc - init` them. – ohr Jul 31 '12 at 15:46
  • I got, it. Your answer helped, just had to change where i did the alloc- init. – user1450221 Aug 01 '12 at 05:35
1

set tag to each picker view and handle them differently based on tag

Vinodh
  • 5,262
  • 4
  • 38
  • 68