如何在一个视图中使用一个UIPickerView用于多个文本字段?

时间:2012-07-23 12:23:07

标签: iphone xcode uitextfield uipickerview

我在一个视图中有8个文本字段。我想使用pickerview填充每个。 我可以有1个选择器视图,它将显示不同文本字段的不同数组的不同项目列表吗?

有人可以解释如何使用示例代码以编程方式执行此操作吗?

另外,如何在加载视图时隐藏选择器视图,只有当我单击带有相应数据列表的文本字段时才应显示它?当我选择数据时它会消失,当我点击不同的文本字段及其相应的数据列表时会重新出现等等。

我是xcode的新手。任何帮助都感激不尽。谢谢。

4 个答案:

答案 0 :(得分:11)

根据某些条件,您只能使用一个显示不同数据的PickerView。

我的想法如下:你可以创建8个不同的数组 - 一个用于填充UIPickerView,具体取决于UITextField被点击的内容。在接口中将它们声明为NSArray并在viewDidLoad中初始化:

array1st = ...
array2nd = ...
array3d = ...
//and until 8.

然后你创建另一个只是为了指向应该填充它的数组(比如NSArray *currentArray),你甚至不需要初始化它=它只会用于指向正确的数组。

因此,您应该将UITextFields的委托设置为视图控制器,并在方法textFieldShouldBeginEditing中检查谁是UITextField,将正确的数组指定为currentArray,使用reloadData重新加载UIPickerView ,并在同一textFieldShouldBeginEditing方法中返回NO。 currentTextField是一个指针,只知道被编辑的currentUITextField是什么 - 我们需要存储它以便能够在选择器中选择数据后设置文本。在接口中声明currentTextField。

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
    currentTextField = textField;
    if (textField == myFirstTextView)
    {
        currentArray = array1st;
        [pickerView reloadData];
        [self animatePickerViewIn];
        return NO;
    }
    //and this way until 8th
}

因此,当您的视图控制器(实际上是UIPickerViewDelegate)时,您根据当前数组填充UIPickerView并且您不需要更改任何内容,只需使用currentArray作为数组来获取数据。

现在,要显示pickerView:

连接IBOutlet后,在viewDidLoad中你应该做两件事:设置UIPickerView的框架并将其添加为子视图:

pickerView.frame = CGRectMake(0,self.view.frame.size.height, pickerView.frame.size.width, pickerView.frame.size.height);
pickerView.delegate = self;
pickerView.dataSource = self;
//or you can do it via Interface Builder, right click the pickerView and then connect delegate and dataSource to the file's owner
[self.view addSubview:pickerView];

现在您需要创建名为animatePickerViewIn的方法,我们在用户点击UITextField时调用该方法。

-(void)animatePickerViewIn
{

    [UIView animateWithDuration:0.25 animations:^{
        [pickerView setFrame:CGRectMake(0, pickerView.frame.origin.y-pickerView.frame.size.height, pickerView.frame.size.width, pickerView.frame.size.height)];
    }];
}

在pickerView中加载数据:

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

    return [currentArray count];
}


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

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

当用户选择pickerView中的行时,您将收到它作为委托方法。因此,只需将currentTextField的文本设置为所选值:

-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    //and here you can do in two ways:
    //1
    [currentTextField setText:[currentArray objectAtIndex:row]];
    //2
    [currentTextField setText:[self pickerView:pickerView titleForRow:row inComponent:component]];
}

答案 1 :(得分:1)

使用此。

 - (void)textFieldDidBeginEditing:(UITextField *)textField{
   MyPickervie.delegate=self;
 }
 - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)myLocationPickerView;
{
  return 1;
 }

-(void)myLocationPickerView:(UIPickerView *)myLocationPickerView didSelectRow:           (NSInteger)row inComponent:(NSInteger)component;
 {

    switch(textfield.tag){
     Case 0:
            label.text=[arraNo objectAtindex:row];
            break;
     default: break;
  }
 }
 -(NSInteger)myLocationPickerView:(UIPickerView *)myLocationPickerView  numberOfRowsInComponent:(NSInteger)component;
{

switch(textfield.tag){
     Case 0:
            return [arrayNo count];
            break;
     default: break;
  }
}

-(NSString *)myLocationPickerView:(UIPickerView *)myLocationPickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component;
 {
   switch(textfield.tag){
     Case 0:
            return [arrayNo objectAtIndex:row];
            break;
     default: break;
  }

}

你必须在切换条件下采取8个案例来调用不同的数组并将其设置为pickerView。

答案 2 :(得分:1)

我已经用3个文本字段测试了这段代码。

找到了问题的完美解决方案。

1)获取一个全局UITextField。

2)在文本字段编辑的委托方法中,将全局文本字段设置为当前文本字段。

3)在选择器值更改方法中,设置全局文本字段的文本,它将更改所选文本字段的值。

下面的代码工作正常。

享受编码。

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

- (NSInteger)pickerView:(UIPickerView *)thePickerView numberOfRowsInComponent:(NSInteger)component 
{   
return 10;
}

- (NSString *)pickerView:(UIPickerView *)thePickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component 
{
return [NSString stringWithFormat:@"Test %d",row + 1];

}

- (void)pickerView:(UIPickerView *)thePickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component 
{

test.text = @"XYZ";

}

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
test = textField;

return YES;
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{    
[textField  resignFirstResponder];

return YES;
}

答案 3 :(得分:0)

1.使用带有完成barButtonItem的工具栏,它应该隐藏pickerView。

2.现在给你的textFields tagValues如:textFiled1.tag=100;然后用这个标签值填充你的pickerView数组。

3.当用户从pickerView中选择任何值时,在其委托方法中写入

if(textField.tag== @"Your Tag Value")
{  
      textField.text=[pickerArray objectAtIndex:row];
}

我想你可以自己尝试一下代码,现在你已经有了解决方案的要点。祝你好运!