【问题标题】:How to show PickerView Values Based on Previous PickerView Using TextField Click in iOS?如何在 iOS 中使用 TextField Click 显示基于先前 PickerView 的 PickerView 值?
【发布时间】:2016-01-21 14:17:21
【问题描述】:

我有三个文本字段regionTextsectionTextdistributionText。如果我单击第一个文本字段 regionText 意味着,它应该显示 PickerView regionPicker 和数组值 regionArray。如果我点击sectionTextdistributionText 而不在regionText 中选择值,它应该会显示警报消息。

那么,基于regionText的值

ViewController.m

- (void)viewDidLoad
{
[super viewDidLoad];

//static Array for RegionPicker
NSArray *regionArray = [[NSArray alloc]initWithObjects:@"Chennai-south",@"Chennai-north",@"Villupuram", nil];

//static Array for SectionPicker
NSArray *chennaiSouthArray = [[NSArray alloc]initWithObjects:@"A",@"B",@"C", nil];
NSArray *chennaiNorthArray = [[NSArray alloc]initWithObjects:@"D",@"E",@"F", nil];
 NSArray *villupuramArray = [[NSArray alloc]initWithObjects:@"D",@"E",@"F", nil];

//static Array for DistributionPicker
NSArray *aArray = [[NSArray alloc]initWithObjects:@"a",@"b", nil];
NSArray *bArray = [[NSArray alloc]initWithObjects:@"c",@"d", nil];
NSArray *cArray = [[NSArray alloc]initWithObjects:@"e",@"f", nil];

NSArray *dArray = [[NSArray alloc]initWithObjects:@"g",@"h", nil];
NSArray *eArray = [[NSArray alloc]initWithObjects:@"i",@"j", nil];


//viewForPicker
_viewForPicker = [[UIView alloc]initWithFrame:CGRectMake(0,self.view.frame.size.height, self.view.frame.size.width,260)];
_viewForPicker.backgroundColor = [UIColor blackColor];
[self.view addSubview:_viewForPicker];

//regionPickerView
_regionPicker = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 44, self.view.frame.size.width, 216)];
_regionPicker.delegate = self;
_regionPicker.dataSource = self;
_regionPicker.showsSelectionIndicator = YES;
[_regionPicker setBackgroundColor:[UIColor lightGrayColor]];
[_viewForPicker addSubview:_regionPicker];


//ToolBar
UIToolbar *toolBar= [[UIToolbar alloc] initWithFrame:CGRectMake(0,0,self.view.frame.size.width,44)];
[toolBar setBarStyle:UIBarStyleBlackOpaque];
 UIBarButtonItem *barButtonDone = [[UIBarButtonItem alloc] initWithTitle:@"Done"
                                                                  style:UIBarButtonItemStyleBordered target:self action:@selector(hidePickerView:)];
toolBar.items = @[barButtonDone];
barButtonDone.tintColor=[UIColor lightTextColor];
[barButtonDone setEnabled:YES];
[_viewForPicker addSubview:toolBar];

//SettingLabels
[self setView];
}

-(void)hidePickerView:(id)sender
{

[UIView animateWithDuration:0.5 delay:0.1 options:UIViewAnimationOptionCurveEaseIn animations:^{
    _viewForPicker.frame = CGRectMake(0, self.view.frame.size.height, 320, 260);
} completion:^(BOOL finished){
}];
}

-(void)setView
{

//regionLabel
UILabel *regionLabel = [[UILabel alloc]initWithFrame:CGRectMake(self.view.frame.origin.x+30, self.view.frame.origin.y+30, 60, 25)];
[regionLabel setText:@"Region"];
[self.view addSubview:regionLabel];

//regionText
UITextField *regionText = [[UITextField alloc]initWithFrame:CGRectMake(self.view.frame.origin.x+120, self.view.frame.origin.y+30, 150, 25)];
[regionText setBorderStyle:UITextBorderStyleRoundedRect];
[regionText setPlaceholder:@"selectRegion"];
[regionText setTag:0];
[regionText setDelegate:self];
[self.view addSubview:regionText];

//sectionLabel
UILabel *sectionLabel = [[UILabel alloc]initWithFrame:CGRectMake(self.view.frame.origin.x+30, self.view.frame.origin.y+120, 60, 25)];
[sectionLabel setText:@"Section"];
[self.view addSubview:sectionLabel];

//sectionText
UITextField *sectionText = [[UITextField alloc]initWithFrame:CGRectMake(self.view.frame.origin.x+120, self.view.frame.origin.y+120, 150, 25)];
[sectionText setBorderStyle:UITextBorderStyleRoundedRect];
[sectionText setPlaceholder:@"selectSection"];
[sectionText setTag:1];
[sectionText setDelegate:self];
[self.view addSubview:sectionText];


//distributionLabel
UILabel *distributionLabel = [[UILabel alloc]initWithFrame:CGRectMake(self.view.frame.origin.x+30, self.view.frame.origin.y+210, 90, 25)];
[distributionLabel setText:@"Distribution"];
[self.view addSubview:distributionLabel];

//distributionText
UITextField *distributionText = [[UITextField alloc]initWithFrame:CGRectMake(self.view.frame.origin.x+120, self.view.frame.origin.y+210, 150, 25)];
[distributionText setBorderStyle:UITextBorderStyleRoundedRect];
[distributionText setPlaceholder:@"selectDistribution"];
[distributionText setTag:2];
[distributionText setDelegate:self];
[self.view addSubview:distributionText];

}

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
// Show UIPickerView


if (textField isEqual:@"regionText")
{
    NSLog(@"Entering Textfield Begin");
    [UIView animateWithDuration:0.5 delay:0.1 options:UIViewAnimationOptionCurveEaseIn animations:^{
        _viewForPicker.frame = CGRectMake(0, self.view.frame.size.height-260,self.view.frame.size.width, 260);
    }
                     completion:^(BOOL finished){
                     }];
}

elseif(textField isEqual:@"sectionText")
{
   //What i have to Write in This.Please Update.
}
else
{
 //What i have to Write in This.Please Update.
}
return NO;
}

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)thePickerView {

return 1;
}

- (NSInteger)pickerView:(UIPickerView *)thePickerView numberOfRowsInComponent:(NSInteger)component 
{
if([pickerView isEqual:@"regionPicker"])
return [regionArray count];

elseif([pickerView isEqual:@"regionPicker"])
{
//What i have to write.Pls update.
}
else
{
//What i have to write.Pls update.
}

}

- (NSString *)pickerView:(UIPickerView *)thePickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component 
{
//What i have to write.Pls update.
}

1.如何使用单个 UIView viewforPicker 显示 PickerView?

2.如何显示 PickerView 值取决于之前的 PickerView 值?

【问题讨论】:

    标签: ios objective-c uitextfield uipickerview


    【解决方案1】:

    isRangeSlectedfieldTag 声明为类范围变量并更新您的方法,如下所示。

    -(BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
      fieldTag = textField.tag;
      // Show UIPickerView
      if(textField.tag == 0) {
        [self showPickerView];
      } else if (textField.tag == 1) {
        isRangeSlected ? [self showPickerView] : [self showAlertWithText:@"Please select range"];
      } else if (textField.tag == 2) {
        isRangeSlected ? [self showPickerView] : [self showAlertWithText:@"Please select range"];
      }
       return NO;
     }
    
     -(void)showPickerView {
          [UIView animateWithDuration:0.5 delay:0.1 options:UIViewAnimationOptionCurveEaseIn animations:^{
            _viewForPicker.frame = CGRectMake(0, self.view.frame.size.height-260,self.view.frame.size.width, 260);
           }
          completion:^(BOOL finished){
     }];
    

    }

        -(void)showAlertWithText:(NSString *)txt {
             [[[UIAlertView alloc] initWithTitle:@"Error" message:txt delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil] show];
         }
    

    将其余的 PickerViewDataSource 方法更新为

    -(NSInteger)pickerView:(UIPickerView *)thePickerView numberOfRowsInComponent:(NSInteger)component
    {
        if(fieldTag == 0) return [regionArray count];
        else if (fieldTag == 1) return [regionArray count];
        else return [regionArray count];
    }
    
    -(NSString *)pickerView:(UIPickerView *)thePickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
    {
        //What i have to write.Pls update.
        if(fieldTag == 0) return [regionArray objectAtIndex:row];
        else if (fieldTag == 1) return [regionArray objectAtIndex:row];
        else return [regionArray objectAtIndex:row];
    }
    

    如果有任何小错误自行更新代码,这将对您有所帮助。

    【讨论】:

    • 谢谢。但是我的问题是,如果我在_regionPicker 中选择第一个值,然后如果我单击第二个文本字段意味着它应该在我的pickerView 中显示ChennaiSoutharray 值。然后如果单击第三个文本字段意味着,它根据第二个文本字段中的选定值显示值。
    • 为我提供清晰的示例解决方案。我的结构是,我有三个文本字段。约束是,1.如果我选择第二个和第三个文本字段而不在第一个文本字段中选择值,它应该显示警报。 2. 如果我单击第一个 TextField,它应该从底部显示带有 PickerView 的 UIView,其值为 RegionArray。此外,所选值应该填充到 TextField 中。 3.在我的第一个选择器视图中选择值后,如果我单击第二个文本字段,它应该显示带有 PickerView 的 UiView,其值基于第一个文本字段。第二个和第三个文本字段相同。
    • 请给我一个解决方案。你帮了很多忙。
    • @Raghunath 我们来这里不是为了创建应用程序并向您展示,我们可以帮助您解决您错过的问题。我已经修改了您的逻辑,您对此进行更改,如果您遇到困难,请告诉我。
    • K 但是这两天我一直被这个错误困扰。我也是新手,我必须在一段时间内完成它。所以只有。完整项目被这个错误卡住了......跨度>
    【解决方案2】:

    这是经过测试的更新代码:

    首先在 .h 文件中声明:

    UIView *_viewForPicker;
    UIPickerView *_regionPicker;
    NSArray *regionArray;
    NSArray *chennaiSouthArray;
    NSArray *chennaiNorthArray;
    NSArray *villupuramArray;
    int selectionVal;
    

    之后在 .m 文件中:

    - (void)viewDidLoad {
        [super viewDidLoad];
        self.navigationItem.leftBarButtonItem = self.editButtonItem;
        //static Array for RegionPicker
        regionArray = [[NSArray alloc] initWithObjects:@"Chennai-south",@"Chennai-north",@"Villupuram", nil];
    
        //static Array for SectionPicker
        chennaiSouthArray = [[NSArray alloc]initWithObjects:@"A",@"B",@"C", nil];
        chennaiNorthArray = [[NSArray alloc]initWithObjects:@"D",@"E",@"F", nil];
        villupuramArray = [[NSArray alloc]initWithObjects:@"D",@"E",@"F", nil];
    
        //static Array for DistributionPicker
        NSArray *aArray = [[NSArray alloc]initWithObjects:@"a",@"b", nil];
        NSArray *bArray = [[NSArray alloc]initWithObjects:@"c",@"d", nil];
        NSArray *cArray = [[NSArray alloc]initWithObjects:@"e",@"f", nil];
        NSArray *dArray = [[NSArray alloc]initWithObjects:@"g",@"h", nil];
        NSArray *eArray = [[NSArray alloc]initWithObjects:@"i",@"j", nil];
    
    
        //viewForPicker
        _viewForPicker = [[UIView alloc]initWithFrame:CGRectMake(0,self.view.frame.size.height, self.view.frame.size.width,260)];
        _viewForPicker.backgroundColor = [UIColor blackColor];
        [self.view addSubview:_viewForPicker];
    
        //regionPickerView
        _regionPicker = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 44, self.view.frame.size.width, 216)];
        _regionPicker.delegate = self;
        _regionPicker.dataSource = self;
        _regionPicker.showsSelectionIndicator = YES;
        [_regionPicker setBackgroundColor:[UIColor lightGrayColor]];
        [_viewForPicker addSubview:_regionPicker];
    
        //ToolBar
        UIToolbar *toolBar= [[UIToolbar alloc] initWithFrame:CGRectMake(0,0,self.view.frame.size.width,44)];
        [toolBar setBarStyle:UIBarStyleBlackOpaque];
        UIBarButtonItem *barButtonDone = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStylePlain target:self action:@selector(hidePickerView:)];
        toolBar.items = @[barButtonDone];
        barButtonDone.tintColor=[UIColor lightTextColor];
        [barButtonDone setEnabled:YES];
        [_viewForPicker addSubview:toolBar];
    
        //SettingLabels
        [self setView];
    }
    
    - (void)viewWillAppear:(BOOL)animated {
        [super viewWillAppear:animated];
    }
    
    -(void)hidePickerView:(id)sender {
        [UIView animateWithDuration:0.5 delay:0.1 options:UIViewAnimationOptionCurveEaseIn animations:^{
            _viewForPicker.frame = CGRectMake(0, self.view.frame.size.height, 320, 260);
        } completion:^(BOOL finished){
        }];
    }
    
    -(void)setView {
        //regionLabel
        UILabel *regionLabel = [[UILabel alloc]initWithFrame:CGRectMake(self.view.frame.origin.x+30, self.view.frame.origin.y+30, 60, 25)];
        [regionLabel setText:@"Region"];
        [self.view addSubview:regionLabel];
    
        //regionText
        UITextField *regionText = [[UITextField alloc]initWithFrame:CGRectMake(self.view.frame.origin.x+120, self.view.frame.origin.y+30, 150, 25)];
        [regionText setBorderStyle:UITextBorderStyleRoundedRect];
        [regionText setPlaceholder:@"selectRegion"];
        [regionText setTag:51];
        [regionText setDelegate:self];
        [self.view addSubview:regionText];
    
        //sectionLabel
        UILabel *sectionLabel = [[UILabel alloc]initWithFrame:CGRectMake(self.view.frame.origin.x+30, self.view.frame.origin.y+120, 60, 25)];
        [sectionLabel setText:@"Section"];
        [self.view addSubview:sectionLabel];
    
        //sectionText
        UITextField *sectionText = [[UITextField alloc] initWithFrame:CGRectMake(self.view.frame.origin.x+120, self.view.frame.origin.y+120, 150, 25)];
        [sectionText setBorderStyle:UITextBorderStyleRoundedRect];
        [sectionText setPlaceholder:@"selectSection"];
        [sectionText setTag:52];
        [sectionText setDelegate:self];
        [self.view addSubview:sectionText];
    
        //distributionLabel
        UILabel *distributionLabel = [[UILabel alloc]initWithFrame:CGRectMake(self.view.frame.origin.x+30, self.view.frame.origin.y+210, 90, 25)];
        [distributionLabel setText:@"Distribution"];
        [self.view addSubview:distributionLabel];
    
        //distributionText
        UITextField *distributionText = [[UITextField alloc]initWithFrame:CGRectMake(self.view.frame.origin.x+120, self.view.frame.origin.y+210, 150, 25)];
        [distributionText setBorderStyle:UITextBorderStyleRoundedRect];
        [distributionText setPlaceholder:@"selectDistribution"];
        [distributionText setTag:53];
        [distributionText setDelegate:self];
        [self.view addSubview:distributionText];
    
    }
    
    - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
        // Show UIPickerView
        if (textField.tag == 51){
            NSLog(@"Entering Textfield Begin");
            selectionVal = 1;
            [UIView animateWithDuration:0.5 delay:0.1 options:UIViewAnimationOptionCurveEaseIn animations:^{
                _viewForPicker.frame = CGRectMake(0, self.view.frame.size.height-260,self.view.frame.size.width, 260);
            }completion:^(BOOL finished){}];
        }else if(textField.tag == 52){
            if ([[(UITextField*)[self.view viewWithTag:51] text] isEqualToString:@""]) {
                [[[UIAlertView alloc] initWithTitle:@"Alert" message:@"Set Region First" delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil] show];
            }else {
                selectionVal = 2;
                [UIView animateWithDuration:0.5 delay:0.1 options:UIViewAnimationOptionCurveEaseIn animations:^{
                    _viewForPicker.frame = CGRectMake(0, self.view.frame.size.height-260,self.view.frame.size.width, 260);
                }completion:^(BOOL finished){}];
            }
        }else if (textField.tag == 53){
            if ([[(UITextField*)[self.view viewWithTag:51] text] isEqualToString:@""]) {
                [[[UIAlertView alloc] initWithTitle:@"Alert" message:@"Set Region First" delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil] show];
            }else{
                selectionVal = 3;
                [UIView animateWithDuration:0.5 delay:0.1 options:UIViewAnimationOptionCurveEaseIn animations:^{
                    _viewForPicker.frame = CGRectMake(0, self.view.frame.size.height-260,self.view.frame.size.width, 260);
                }completion:^(BOOL finished){}];
            }
        }
        [_regionPicker reloadAllComponents];
        return NO;
    }
    
    - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)thePickerView {
        return 1;
    }
    
    - (NSInteger)pickerView:(UIPickerView *)thePickerView numberOfRowsInComponent:(NSInteger)component{
        if(selectionVal == 1){
            return [regionArray count];
        }else if(selectionVal == 2){
            if ([[(UITextField*)[self.view viewWithTag:51] text] isEqualToString:@"Chennai-south"]) {
                return chennaiSouthArray.count;
            }else if ([[(UITextField*)[self.view viewWithTag:51] text] isEqualToString:@"Chennai-north"]){
                return chennaiNorthArray.count;
            }else if ([[(UITextField*)[self.view viewWithTag:51] text] isEqualToString:@"Villupuram"]){
                return villupuramArray.count;
            }
        }else if(selectionVal == 3){
        }
        return 0;
    }
    
    - (NSString *)pickerView:(UIPickerView *)thePickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component  {
        if(selectionVal == 1){
            return [regionArray objectAtIndex:row];
        }else if(selectionVal == 2){
            if ([[(UITextField*)[self.view viewWithTag:51] text] isEqualToString:@"Chennai-south"]) {
                return [chennaiSouthArray objectAtIndex:row];
            }else if ([[(UITextField*)[self.view viewWithTag:51] text] isEqualToString:@"Chennai-north"]){
                return [chennaiNorthArray objectAtIndex:row];
            }else if ([[(UITextField*)[self.view viewWithTag:51] text] isEqualToString:@"Villupuram"]){
                return [villupuramArray objectAtIndex:row];
            }
        }
        return @"test";
    }
    
    - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{
        if(selectionVal == 1){
            [(UITextField*)[self.view viewWithTag:51] setText:[regionArray objectAtIndex:row]];
        }else if(selectionVal == 2){
            if ([[(UITextField*)[self.view viewWithTag:51] text] isEqualToString:@"Chennai-south"]) {
                [(UITextField*)[self.view viewWithTag:52] setText:[chennaiSouthArray objectAtIndex:row]];
            }else if ([[(UITextField*)[self.view viewWithTag:51] text] isEqualToString:@"Chennai-north"]){
                [(UITextField*)[self.view viewWithTag:52] setText:[chennaiNorthArray objectAtIndex:row]];
            }else if ([[(UITextField*)[self.view viewWithTag:51] text] isEqualToString:@"Villupuram"]){
                [(UITextField*)[self.view viewWithTag:53] setText:[villupuramArray objectAtIndex:row]];
            }
    
        }
    }
    

    希望对你有帮助。

    【讨论】:

    • 你给出了完美的解决方案。
    猜你喜欢
    • 2016-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多