Come posso programmare più di un UipicKerView nella stessa opinione?
-
13-12-2019 - |
Domanda
Sto usando Textfields InputView Property per visualizzare gli uipickerviews invece della tastiera. Il modo in cui ho programmato, non dichiaro i Pickervisciews nel file .h o collegarli nella visualizzazione nel Builder Interfaccia. Quando implemendo le proprietà dei Pickerviscons, non sono in grado di rendere ognuno di loro con proprietà diverse. Ho provato a utilizzare le dichiarazioni "se" per dirlo ad avere proprietà diverse a seconda del quale raccogliere veniva usato come segue ....
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)agePickerView {
if ([pickerView isEqual: agePickerView]){
return 1;
}
if ([pickerView isEqual: weightPickerView]){
return 1;
}
.
}
Quando faccio questo, però, dirà che il pesoPickerView è undeclared. Quindi ecco il mio codice per implementare i PickerVischi.
@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];
}
}
.
C'è qualche altro modo per fare ciò che sto cercando di fare, perché in questo modo non funziona ... e se provo solo a rifare l'implementazione per ogni selezionatore, ottengo gli errori di "ridefinizione di ... "" NumberOfrowsinComponent "" o che mai altre proprietà che sto facendo. Per favore aiuto, anche se devo cambiarlo e dichiarare che i Pickerfiews nel file .h in qualche modo, non mi interessa quello che devo fare il più a lungo possibile Ottieni questo per lavorare !!
Grazie
Aggiornamento !!!
@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];
}
.
// Codice campo di età
-(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];
}
}
. Soluzione
UIPickerView *weightPickerView = [[UIPickerView alloc] init];
.
È necessario dichiararlo nel tuo file .h (o interfaccia).
Stai subclassando UIPickerView
?
Modifica * Se non si desidera dichiarare quelli nel tuo file .h per qualche motivo, impostare un tag
ai raccoglitori.
Tutti i tuoi UIPickerView
s chiamano metodi UipickerViewDelegate, il che significa che -(NSInteger)weightpickerView:(UIPickerView *)weightPickerView numberOfRowsInComponent: (NSInteger)component
non verrà chiamato a meno che non si stiatrò la sottoclassamento e la creazione dei propri metodi (che credo che tu non sia), 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;
}
.
Se desideri farlo con tag;
weightPickerView.tag = 100; //set the tag
if(pickerView.tag == 100) //check which picker it is
. Altri suggerimenti
Imposta il tag su ciascuna vista selezionatrice e gestirli in modo diverso in base al tag