Two uipicker in the same view

508 views Asked by At

what i am trying to do is to put two uipickers on the same view, i read somewhere that one of them should have its own separate delegate i tried to do so but i couldn't make it work properly.

Some times when i run the application the second application just stops working with no errors on the console.

this is the .h file for the view:

@interface FirstViewController : UIViewController {

IBOutlet UIPickerView *cities;
NSMutableArray *array;
NSString *picked;
}

@property(nonatomic,retain) IBOutlet UIPickerView *cities;
@property(nonatomic,retain) IBOutlet NSMutableArray *array;

and here is the .m:

@implementation FirstViewController
@synthesize cities,array;

-(void) getCities:(NSString *)link{
    url=link;
    NSString *str=[[NSString alloc] initWithContentsOfURL:[NSURL URLWithString:url]];
    if([str length]==0){
        [str release];
        return;
    }

    SBJsonParser *parser=[[SBJsonParser alloc] init];
    array=[[parser objectWithString:str] copy];
    [receivedData release];

}


- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)thePickerView { // This method needs to be used. It asks how many columns will be used in the UIPickerView 
    return 1; // We only need one column so we will return 1. 
}


- (NSInteger)pickerView:(UIPickerView *)thePickerView numberOfRowsInComponent:(NSInteger)component { // This method also needs to be used. This asks how many rows the UIPickerView will have. 
    return [array count]; // We will need the amount of rows that we used in the pickerViewArray, so we will return the count of the array. 
} 


- (void)pickerView:(UIPickerView *)thePickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { // what happens when selecting rows
    picked=[array objectAtIndex:row];
} 


- (NSString *)pickerView:(UIPickerView *)thePickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { //method asks for what the title or label of each row will be
    return [array objectAtIndex:row]; // We will set a new row for every string used in the array. 
} 

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad
{
    [sv setScrollEnabled:TRUE];
    [sv setContentSize:CGSizeMake(320, 800)];
    [self getCities:@"any url"];

    [super viewDidLoad];
}


- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}


- (void)didReceiveMemoryWarning
{
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc. that aren't in use.
}


- (void)viewDidUnload
{
    [super viewDidUnload];

    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}


- (void)dealloc
{
    [super dealloc];
}

@end

and for the second uipicker i added an nsobject to the view and changed its class to "SecondPickerDelegate" which i created before and this is its code:
.h

#import <UIKit/UIKit.h>


@interface FirstViewSecondPickerDelegate :  UIViewController<UIPickerViewDelegate>{

    IBOutlet UIPickerView *specialities;
    NSMutableArray *array;
    NSString *picked;
}

@property(nonatomic,retain) IBOutlet UIPickerView *specialities;
@property(nonatomic,retain) NSMutableArray *array;
@property(nonatomic,retain) NSString *picker;

@end

the .m file:

#import "FirstViewSecondPickerDelegate.h"
#import "JSON.h"


@implementation FirstViewSecondPickerDelegate
@synthesize specialities,array,picker;

-(void) getSpecialities:(NSString *)link{
    url=link;
    NSString *str=[[NSString alloc] initWithContentsOfURL:[NSURL URLWithString:url]];
    if([str length]==0){
        [str release];
        return;
    }

    SBJsonParser *parser=[[SBJsonParser alloc] init];
    array=[[parser objectWithString:str] copy];
    for(int i=0;i<[array count];i++){
        NSLog(@"index %i",i);
        NSLog(@"value %@",[array objectAtIndex:i]);
    }


}
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)thePickerView { // This method needs to be used. It asks how many columns will be used in the UIPickerView 
    return 1; // We only need one column so we will return 1. 
}


- (NSInteger)pickerView:(UIPickerView *)thePickerView numberOfRowsInComponent:(NSInteger)component { // This method also needs to be used. This asks how many rows the UIPickerView will have. 
    return [array count]; // We will need the amount of rows that we used in the pickerViewArray, so we will return the count of the array. 
} 


- (void)pickerView:(UIPickerView *)thePickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { // what happens when selecting rows
    picked=[array objectAtIndex:row];
} 


- (NSString *)pickerView:(UIPickerView *)thePickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { //method asks for what the title or label of each row will be
    return [array objectAtIndex:row]; // We will set a new row for every string used in the array. 
} 


- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
        picked=@"1";
        [self getSpecialities:@"http://localhost:8080/Test/gs"];
    }


    return self;
}
/*
-(void) viewDidLoad{
    [super viewDidLoad];

}

*/

- (void)dealloc
{

    [super dealloc];
}

- (void)didReceiveMemoryWarning
{
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle

/*
// Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView
{
}
*/


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

    [super viewDidLoad];
}


- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

@end

If any one has a working example for such case please help.

1

There are 1 answers

2
Andrey Zverev On BEST ANSWER

You don't need separate delegates for two UIPickerView's in the same view.

Use the UIPickerView tag property, and then you can differentiate between them in delegate methods.