【问题标题】:UIpickerView populating multiple uitextFields in the same viewcontrollerUIpickerView 在同一个视图控制器中填充多个 uitextFields
【发布时间】:2013-12-24 05:25:34
【问题描述】:

您好,我正在开发一个 iphone 应用程序,其中填充了一个 uipickerview,它与一个 uitextfield 配合得很好。但是我有 4 个需要填充的 uitextfield,并且我为每个 UItextfield 使用相同的 uipickerview。我不知道如何实现这个东西。

Pickerviewcontroller.m

 arrChooseServices=[[NSMutableArray alloc]initWithObjects:@"A+ve",@"A-ve",@"B+ve",@"B-ve",@"AB+ve",@"AB-ve",@"O+ve",@"O-ve", nil];

// Create UITextfield

 bloodGroup=[[UITextField alloc]initWithFrame:CGRectMake(150, 200, 120, 20)];
bloodGroup.borderStyle=UITextBorderStyleRoundedRect;
bloodGroup.backgroundColor=[UIColor clearColor];
bloodGroup.backgroundColor=[UIColor colorWithRed:0.662745 green:0.662745 blue:0.662745 alpha:0.5];

[bloodGroup setUserInteractionEnabled:NO];
bloodGroup.font=[UIFont systemFontOfSize:14.0];
bloodGroup.contentVerticalAlignment=UIControlContentVerticalAlignmentCenter;
bloodGroup.textAlignment=NSTextAlignmentCenter;
bloodGroup.delegate=self;

bloodGroup.inputView=self.chooseServicePicker;
bloodGroup.inputAccessoryView=self.accessoryView;
[self.view addSubview:bloodGroup];


-(UIPickerView *)chooseServicePicker
{
  if(chooseServicePicker==nil)
  {
    chooseServicePicker=[[UIPickerView alloc]init];
    chooseServicePicker.delegate=self;
    chooseServicePicker.dataSource=self;
    chooseServicePicker.showsSelectionIndicator=YES;
 }
  return chooseServicePicker;
}

-(UIToolbar *)accessoryView
{

 if ( accessoryView == nil )
{
  accessoryView = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 30)];
 UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(onVehicleSelection)];

 UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(cancel)];
accessoryView.items=[NSArray arrayWithObjects:doneButton,cancelButton, nil];

}
return accessoryView;

}

- (void)onVehicleSelection 
{

   NSInteger row = [self.chooseServicePicker selectedRowInComponent:0];
  bloodGroup.text=[arrChooseServices objectAtIndex:row];
  [bloodGroup resignFirstResponder];
}

- (NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component 
{
  return [arrChooseServices objectAtIndex:row];
}

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView 
{
return 1;
}

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component

{

return ( arrChooseServices == nil ) ? 0 : [arrChooseServices count];

}

-(void)cancel
{

bloodGroup.text=@"";

[bloodGroup resignFirstResponder];

}

这是我的代码。现在我想使用相同的 UIPickerview 在另一个文本字段中显示另一个数组值

gender=[NSMutableArray alloc]initWithObjectis:@"MALE",@"Female",nil];

我想在 Uipickerview 中添加的上述数组值。如何编写代码。请给我任何想法。我是编程新手。提前致谢

【问题讨论】:

  • 您是否需要为所有文本字段显示相同元素的选择器..
  • 不,先生,我想使用 sample pickerview 在不同的 uitextfields 中显示不同的数组值
  • 我已经提交了我的代码,首先将其用作示例并检查它是否适合我。如果您对代码有任何疑问,请随时询问

标签: ios iphone objective-c uitextfield uipickerview


【解决方案1】:

您可以使用它来检查哪些文本将发送到becomeFirstResponder

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField

并基于此条件

[textField isFirstResponder]

您可以检查您需要显示的内容。

- (NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component 
{
    if(textField1 isFirstResponder] 
         return [arrChooseServices objectAtIndex:row];

    else if(textField2 isFirstResponder] return [otherArray count]; 
    // write for every textfield other 
}



- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView 
 {
    if(textField1 isFirstResponder] return 1;

    else if(textField2 isFirstResponder] return 3;
    //In this way you can do what you need to show in picker view.
    return 1;
  }



   //Same condition you can use in every delegate and datasource method.

【讨论】:

  • 嗨,先生,感谢您发送答案。但我的要求是我有 3 个文本字段。我有 3 个数组值。我想显示 3 个数组值正在使用相同的选择器视图显示相应的文本字段。
  • 在我给出的答案中。当您 firtTextField isFirstResponder 然后显示相应的数组数据。在 ` -(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component` 中做同样的比较。并加载相应的数据。
【解决方案2】:
 #import "ViewController.h"

 @interface ViewController ()<UIPickerViewDelegate,UITextFieldDelegate>
 {
UIPickerView *myPickerView;
int selectedTextfieldValue;
NSArray *namesArray , *genderArray, *ageArray;

 }
 @end

 @implementation ViewController

 -(void)viewDidLoad
 {
 [super viewDidLoad];
    namesArray=[[NSArray alloc]initWithObjects:@"a",@"b", nil];
    genderArray=[[NSArray alloc]initWithObjects:@"M",@"F", nil];
   ageArray=[[NSArray alloc]initWithObjects:@"26",@"25", nil];
  int yaxis =50;
  selectedTextfieldValue=0;
  for (int i=0; i<5; i++) 
 {
  UITextField*  bloodGroup=[[UITextField alloc]initWithFrame:CGRectMake(150, yaxis, 120,20)];

 bloodGroup.borderStyle=UITextBorderStyleRoundedRect;

 bloodGroup.backgroundColor=[UIColor clearColor];

 bloodGroup.backgroundColor=[UIColor colorWithRed:0.662745 green:0.662745 blue:0.662745 alpha:0.5];
 // bloodGroup.tag=(int)i;// first tag will be ZERO but by default view tag is ZERO so
  bloodGroup.tag=(int)[[NSString stringWithFormat:@"20%d",i] intValue];

  bloodGroup.font=[UIFont systemFontOfSize:14.0];

  bloodGroup.contentVerticalAlignment=UIControlContentVerticalAlignmentCenter;

  bloodGroup.textAlignment=NSTextAlignmentCenter;

  bloodGroup.delegate=self;

  [self.view addSubview:bloodGroup];
    yaxis=yaxis +30;
  }

  }
 -(void)textFieldDidBeginEditing:(UITextField *)textField
 {
 [self.view endEditing:YES];
 NSLog(@"%d",textField.tag);
 selectedTextfieldValue=(int)textField.tag;
 // call picker here according to textfield tag you can set text to textfiled
 [self popoverWithInformation];
 }

 -(void)popoverWithInformation
 {
UIToolbar *pickerToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
pickerToolbar.barStyle = UIBarStyleBlackOpaque;
[pickerToolbar sizeToFit];
NSMutableArray *barItems = [[NSMutableArray alloc] init];


UIBarButtonItem *cancelBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(pickerCancel:)];
[barItems addObject:cancelBtn];

UIBarButtonItem *flexSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
[barItems addObject:flexSpace];

UIBarButtonItem *doneBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(pickerDone:)];
[barItems addObject:doneBtn];



[pickerToolbar setItems:barItems animated:YES];


myPickerView = [[UIPickerView alloc] init];
myPickerView.delegate = self;
myPickerView.showsSelectionIndicator = YES;
CGRect pickerRect = myPickerView.bounds;
myPickerView.bounds = pickerRect;
myPickerView.frame = CGRectMake(0, 44, 320, 216);

UIView* popoverView = [[UIView alloc] initWithFrame:CGRectMake(0, 44, 320, 300)];
popoverView.backgroundColor = [UIColor whiteColor];
[popoverView addSubview:myPickerView];

[popoverView addSubview:pickerToolbar];
[self.view addSubview:popoverView];
 }
 -(void)pickerView:(UIPickerView *)pickerView didSelectRow: (NSInteger)row inComponent:(NSInteger)component {


 }

 // tell the picker how many rows are available for a given component
 -(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
int count = 0;

switch (selectedTextfieldValue) {
    case 200:
        count =namesArray.count;
        break;
      case 201:
        count =genderArray.count;
        break;
      case 202:
        count =ageArray.count;
        break;  
    default:
        break;
}

return count;
 }

 // tell the picker how many components it will have
 -(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
return 1;
 }

 // tell the picker the title for a given component
 -(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {

NSString *title;

switch (selectedTextfieldValue) {
     case 200:
        title =namesArray[row];
        break;
      case 201:
        title =genderArray[row];
        break;
      case 202:
        title =ageArray[row];
        break;  
    default:
        break;
}


return title;
 }

 // tell the picker the width of each row for a given component
 -(CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component {
int sectionWidth = 300;

return sectionWidth;
 }

 -(void)pickerDone:(id)sender
 {


 }
 -(void)pickerCancel:(id)sender
 {


 }

【讨论】:

  • 谢谢兄弟。非常好的答案。如果我想显示另一个数组值,比如male=[NSMutableArray alloc]initWithObjects:@"Male"@"Female",nil];在另一个使用相同选择器视图的文本字段中。如何使用您的代码制作代码?
  • 您好,先生,感谢您的回复。我检查您的代码。如果我运行,我收到错误消息,例如“spring board failed to launch application with error-3”
【解决方案3】:

如果我正确理解您的问题,我猜您需要多列 UIPickerView。

您需要在此 UIPickerViewDatasource 方法中定义列数:

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView

那么在这个方法中:

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component

您需要返回每个组件的行数。

示例::

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
  return 3; // for four columns
}

   - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
  if(component == 0)
  {
    return _array1.count; // 10 rows in 1st column
  }
  else  if(component == 1)
  {
    return _array2.count; // 15 rows in 1st column
  }
  else  if(component == 2)
  {
    return _array3.count; // 15 rows in 1st column
  }
}

根据UIPickerView中选择的行,使用此委托方法填充您的文本字段

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
   if(component == 0)
   {
       self.textfield1.text = [_array1 objectAtIndex:row];
   }
    else if(component == 1)
    {
        self.textfield2.text = [_array2 objectAtIndex:row];
    }
    else if(component == 2)
    {
        self.textfield3.text = [_array3 objectAtIndex:row];
    }
}

【讨论】:

  • 不,先生,我想使用 sample pickerview 在不同的 uitextfields 中显示不同的数组值
  • 在这里您将使用相同的选择器视图,但有四列,每列将有不同的数组。当您选择每一列时,将填充四个不同的文本字段。这不是你想要的吗?
  • 嗨,先生,感谢您发送答案。但我的要求是我有 3 个文本字段。我有 3 个数组值。我想显示 3 个数组值正在使用相同的选择器视图显示相应的文本字段。
  • 这是您可以使用我在答案中发布的方法实现的目标。有关更多说明,请参阅我的编辑。
【解决方案4】:
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
   textField.inputView = pickerView;
   //Set the Tag of Uipickerview
   pickerView.tag = textField.tag; // you could workaround with tag in delegate methods accordingly
   [pickerView reloadAllComponents];
   return YES;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-27
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-08
    • 1970-01-01
    相关资源
    最近更新 更多