i have 3 picker view in my view controller
the picker1 contain contain 2 row Audio and Video.picker2 contain product type,if audio is selected in picker1 then picker2 should populate with (transistor,walkman,ipod) and if video is selected in picker1 then picker2 should populate with (tv,screen,monitor) and if walkman is selected in picker2 then picker3 should populate with (sony,philips,jbl).
i am confused with the if condition....
if ([[categoryArray objectAtIndex:row] isEqual:#"Audio"] && [[audioProduct objectAtIndex:row] isEqual:#"walkman"])
{
NSLog(#"Audio and walkman");
modelArray=[[NSMutableArray alloc]initWithObjects:#"walkman1",#"walkman2",#"walman3", nil];
[modelPickerView reloadAllComponents];
}
else if ([[categoryArray objectAtIndex:row] isEqual:#"Audio"] && [[audioProduct objectAtIndex:row] isEqual:#"mp3"]) {
modelArray=[[NSMutableArray alloc]initWithObjects:#"mp3",#"mp3", #"mp3",#"mp3",nil];
[modelPickerView reloadAllComponents];
}
you have to load picker2 and picker 3 conditionally, as follows:
picker1Array=[[NSMutableArray alloc] initWithObjects:#"Audio",#"Video", nil]
if ([[picker1array objectAtIndex:[picker1 selectedRowInComponent:0]] isEqual:#"Audio"])
{
picker2Array=[[NSMutableArray alloc] initWithObjects:#"transistor",#"walkman",#"ipod", nil];
}
else {
picker2Array=[[NSMutableArray alloc] initWithObjects:#"tv",#"screen",#"monitor", nil];
}
[picker2 reloadAllComponents];
if ([[picker2array objectAtIndex:[picker2 selectedRowInComponent:0]] isEqual:#"walkman"]){
picker3Array=[[NSMutableArray alloc] initWithObjects:#"sony",#"philips",#"jbl", nil];
}
[picker3 reloadAllComponents];
please try the following code.
in .h file please declare
NSMutableArray *randCatSel;
NSMutableArray *randSubCatSel;
NSMutableArray *randItemSel;
UIPickerView *packerView;
and in .m file write this code.
- (void)fetchedData{
randCatSel =[[NSMutableArray alloc] initWithObjects:#"Audio",#"Video", nil];
packerView=[[UIPickerView alloc] initWithFrame:CGRectMake(0, 280, 320, 200)];
packerView.delegate=self;
packerView.dataSource=self;
packerView.tag=1;
[self.view addSubview:packerView];
}
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return 1;
}
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent: (NSInteger)component
{
if(pickerView.tag==1)
{
return [randCatSel count];
}
else if(pickerView.tag==2)
{
return [randSubCatSel count];
}
else if(pickerView.tag==3)
{
return [randItemSel count];
}
else
{
return 0;
}
}
-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
if(pickerView.tag==1)
{
return [randCatSel objectAtIndex:row];
}
else if(pickerView.tag==2)
{
return [randSubCatSel objectAtIndex:row];
}
else if(pickerView.tag==3)
{
return [randItemSel objectAtIndex:row];
}
else
{
return 0;
}
}
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
if(pickerView.tag==1)
{
if(randSubCatSel.count>0)
{
randSubCatSel=nil;
}
if([[randCatSel objectAtIndex:row] isEqualToString:#"Audio"])
{
randSubCatSel=[[NSMutableArray alloc] initWithObjects:#"Transistor",#"walkman",#"ipod", nil];
}
else
{
randSubCatSel=[[NSMutableArray alloc] initWithObjects:#"TV",#"Screen",#"Monitor", nil];
}
[packerView removeFromSuperview];
packerView=[[UIPickerView alloc] initWithFrame:CGRectMake(0, 280, 320, 200)];
packerView.delegate=self;
packerView.dataSource=self;
packerView.tag=2;
[self.view addSubview:packerView];
}
else if(pickerView.tag==2)
{
//do coding according to randSubCatSel for randItemSel
}
}
please note that this is sample code for your requirement. you need to make changes accordingly.
i hope this code will help you.
Related
I m new to objective-C and I need to create a UIPickerView when a particular textfield is touched that would be populated with the items of NSMutableArray..I have implemented this code but couldnot see the pickerView addded up.I can still see the keyboard popping up when a textfield is touched...Where Am I gng wrong..???
- (BOOL)textFieldDidBeginEditing:(UITextField *)textField {
if( textField == txtstate)
{
[txtstate resignFirstResponder];
pickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 200, 320, 200)];
pickerView.delegate = self;
pickerView.dataSource = self;
pickerView.showsSelectionIndicator = YES;
[self.view addSubview:pickerView];
}
}
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView;
{
return 1;
}
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
[pickerView selectRow:1 inComponent:0 animated:NO];
txtstate.text= [[arr objectAtIndex:row] valueForKey:#"Code"];
}
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component;
{
return [arr count];
}
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component;
{
return [arr objectAtIndex:row];
}
My Array looks like this :
(
{
Code = Wisconsin;
Id = "6215b339-2959-4a3d-9430-f5bddb0a4eb9";
},
{
Code = Wyoming;
Id = "7972f963-9b3b-4ba6-a30c-d68bb9f59145";
}
)
Any help would be appreciated...
u can add button on UITextField and add your picker at that button action .
make sure your button should be custom type button and put that button over text field.
if you not give the delegate to UITextField name txtstate then give the delegate like bellow in viewDidLoad: method
txtstate.delegate = self;
I have a multicomponent picker with two separate wheels showing relative information. I want to display an image depending on which component is selected. For example: if "AA" is selected from both wheels, image AA will be displayed. If the right wheel is changed to "B", image AB will be displayed.
Thanks for your help in advance.
Regards,
You can do something like this:
#import <UIKit/UIKit.h>
#interface PickerController: UIViewController <UIPickerViewDelegate, UIPickerViewDataSource> {
NSArray *titleStrings;
UIPickerView *picker;
UIImage *imageView;
}
#end
#implementation PickerController
- (id) init {
if (self = [super init]) {
titleStrings = [[NSArray alloc] initWithObjects:#"A", #"B", NULL];
picker = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 100, 320, 100)];
picker.showsSelectionIndicator = YES;
picker.delegate = self;
picker.dataSource = self;
[self.view addSubview:picker];
imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:#"empty.png"]];
imageView.frame = CGRectMake(0, 200, imageView.frame.size.width, imageView.frame.size.height);
[self.view addSubview:imageView];
[imageView release];
[picker release];
}
return self;
}
- (void) dealloc {
[titleStrings release];
[super dealloc];
}
/* UIPickerViewDataSource */
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
return 2;
}
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
return 2;
}
/* UIPickerViewDelegate */
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
return [titleStrings objectAtIndex:row];
}
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
NSString *first = [titleStrings objectAtIndex:[pickerView selectedRowInComponent:0]];
NSString *second = [titleStrings objectAtIndex:[pickerView selectedRowInComponent:1]];
NSString *imageName = [[NSString alloc] initWithFormat:#"%#%#", first, second];
imageView.image = [UIImage imageNamed:imageName];
[imageName release];
[imageView sizeToFit];
}
#end
Here i developing application. I could not change pickerview in landscape mode. Here is my code.
-(IBAction) showPicker:(UIControl *)sender
{
UIActionSheet *menu = [[UIActionSheet alloc] initWithTitle:#""
delegate:self
cancelButtonTitle:#"Done"
destructiveButtonTitle:nil
otherButtonTitles:nil];
menu.tag=1;
UIPickerView *pickerView;
if (self.interfaceOrientation == UIInterfaceOrientationLandscapeLeft ||
self.interfaceOrientation == UIInterfaceOrientationLandscapeRight)
{
pickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(-80,70,220,0)];
pickerView.delegate = self;
pickerView.dataSource = self;
pickerView.showsSelectionIndicator = YES;
[menu addSubview:pickerView];
[menu showInView:self.view.superview];
[menu setBounds:CGRectMake(0,0,320, 470)];
[pickerView release];
[menu release];
NSLog(#"Landscape");
}
else
{
NSLog(#"Portrait");
pickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0,70,220,0)];
pickerView.delegate = self;
pickerView.dataSource = self;
pickerView.showsSelectionIndicator = YES;
[menu addSubview:pickerView];
[menu showInView:self.view.superview];
[menu setBounds:CGRectMake(0,0,320, 470)];
[pickerView release];
[menu release];
}
}
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
return [arrayNo count];
}
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
return 1;
[entered2 resignFirstResponder];
}
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
entered2.text=[arrayNo objectAtIndex:row];
[entered2 resignFirstResponder];
}
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
return [arrayNo objectAtIndex:row];
}
- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component
{
int sectionWidth = 300;
return sectionWidth;
}
In my application i created portrait mode ran fine. But when i try to write code in landscape mode it can positioned wrongly. How can i do this.
How can i change landscape mode. Anybody help me. Thanks in advance.
You just need to set size inspector attributes like this:
P.S. Edit 1:You have to return yes in
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return YES;
}
Edit 2:
If you are doing like this you don't need if condition for checking orientation and make frame for it.
I need to display drop down box in my app.
most of them suggest me UIPickerView for the drop down box.
But my requirement is i need to place two drop down boxes in my app.
MY code for UIPicker view is
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)thePickerView {
return 1;
}
- (NSInteger)pickerView:(UIPickerView *)thePickerView numberOfRowsInComponent:(NSInteger)component {
return [arrayColors count];
}
- (NSString *)pickerView:(UIPickerView *)thePickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
return [arrayColors objectAtIndex:row];
}
- (void)pickerView:(UIPickerView *)thePickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
NSLog(#"Selected Color: %#. Index of selected color: %i", [arrayColors objectAtIndex:row], row);
}
- (IBAction)dropdown_term_in_years: (id)sender
{
UIActionSheet *menu = [[UIActionSheet alloc] initWithTitle:#"Ratings"
delegate:self
cancelButtonTitle:#"OK"
destructiveButtonTitle:nil
otherButtonTitles:nil];
UIPickerView *pickerView = [[UIPickerView alloc] init];
//pickerView.datePickerMode = UIDatePickerModeDate;
pickerView.showsSelectionIndicator = YES;
pickerView.dataSource = self;
pickerView.delegate = self;
[menu addSubview:pickerView];
[menu showInView:self.view];
[menu sendSubviewToBack:pickerView];
[menu setBounds:CGRectMake(0,0,320, 300)];
CGRect pickerRect = pickerView.bounds;
//pickerRect.origin.y = -100;
pickerView.bounds = pickerRect;
[pickerView release];
[menu release];
}
this works for one button click, I need to open another array values for the another button click.
how can i done this.
PLs help me.
Thank U in advance.
I think you need tag assignment for all picker view.
Assign two different tag for both picker view.
Now simply get tag from thePickerView argument and take respective action inside delegate.
i.e
- (NSInteger)pickerView:(UIPickerView *)thePickerView numberOfRowsInComponent:(NSInteger)component {
switch(thePickerView.tag){
case 101:
return [arrayImage count];
case 102:
return [arrayColors count];
}
}
I have 2 instances of UITextField and 1 instance of UIPickerView. UIPickerView is able to update data into
UITextField in didSelectRow:(NSInteger)row inComponent:(NSInteger)component. But how do I update 2 UITextField from UIPickerView when the user touch the UITextView?
Thanks. :)
you will need to make the UIPickerView the inputView of the textfields, i have made an example.
.h file:
#interface aViewController : UIViewController <UIPickerViewDelegate,UIPickerViewDataSource> {
UITextField * textField0;
UITextField * textField1;
UIPickerView * pickerView;
UIToolbar * toolBar;
NSArray * items0;
NSArray * items1;
}
-(void)cancel;
-(void)close;
#end
.m need something like the following:
- (void)viewDidLoad
{
[super viewDidLoad];
textField0 = [[UITextField alloc] initWithFrame:CGRectMake(10.f, 20.0f, 100.f, 30.f)];
textField1 = [[UITextField alloc] initWithFrame:CGRectMake(130.f, 20.0f, 100.f, 30.f)];
textField0.backgroundColor = [UIColor grayColor];
textField1.backgroundColor = [UIColor grayColor];
pickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 0, 320.f, 200.f)];
// Do any additional setup after loading the view from its nib.
[self.view addSubview:textField0];
[self.view addSubview:textField1];
toolBar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320.f, 44.f)];
UIBarButtonItem * cancelButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:#selector(cancel)];
UIBarButtonItem * doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:#selector(close)];
toolBar.items = [NSArray arrayWithObjects:doneButton,cancelButton, nil];
items0 = [[NSArray alloc] initWithObjects:#"dogs",#"cats",#"llamas",#"emus", nil];
items1 = [[NSArray alloc] initWithObjects:#"bone",#"catnip",#"hay", nil];
[doneButton release];
[cancelButton release];
pickerView.showsSelectionIndicator = YES;
pickerView.delegate = self;
pickerView.dataSource = self;
textField1.inputView = pickerView;
textField0.inputView = pickerView;
textField1.inputAccessoryView = toolBar;
textField0.inputAccessoryView = toolBar;
}
#pragma mark - actions
-(void)cancel
{
//reset the values to the original values on cancel...
//do that here.
[textField0 resignFirstResponder];
[textField1 resignFirstResponder];
}
-(void)close
{
textField0.text = [items0 objectAtIndex:[pickerView selectedRowInComponent:0]] ;
textField1.text = [items1 objectAtIndex:[pickerView selectedRowInComponent:1]] ;
[textField0 resignFirstResponder];
[textField1 resignFirstResponder];
}
#pragma mark - pickerview handling
-(float)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component{
return 130.f;
}
-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
if (component==0) {
return [items0 objectAtIndex:row];
}
return [items1 objectAtIndex:row];
}
-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
if (component==0) {
textField0.text = [items0 objectAtIndex:row];
return;
}
textField1.text = [items1 objectAtIndex:row];
}
-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
if (component ==0) {
return [items0 count];
}
return [items1 count];
}
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return 2;
}
I haven't included any clean-up code.