2012-02-05 4 views
1

то, что я пытаюсь сделать, - это разместить двух uipickers на одном и том же представлении, я где-то читал, что у одного из них должен быть свой отдельный делегат, который я пытался сделать, но я не мог этого сделать работать должным образом.

Несколько раз, когда я запускаю приложение, второе приложение просто перестает работать без ошибок на консоли.

это файл .h для просмотра:
Два uipicker в том же представлении

@interface FirstViewController : UIViewController { 

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

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

и вот .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 

и для второго uipicker я добавил NSObject к представлению и изменил его класс «SecondPickerDelegate», который я создал раньше, и это является его код:
.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 

файл .m:

#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 
     [email protected]"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 

Если какой-либо один имеет рабочий пример для такого случая, пожалуйста, помогите.

ответ

3

Вам не нужны отдельные делегаты для двух UIPickerView в одном представлении.

Используйте свойство UIPickerViewtag, а затем вы можете различать их в методах делегата.

+1

Или у вас есть выход или ivar, указывающий на каждый, и проверьте это в методах делегата/источника данных. – jrturton

+0

Большое вам спасибо, я дал каждому сборщику тег и сравнил параметр thePickerView, и теперь он отлично работает, спасибо еще раз. – 4kr4m

Смежные вопросы