Как использовать один UIPickerView для нескольких текстовых полей в одном представлении?

У меня есть 8 текстовых полей в одном представлении. Я хочу заполнить каждый, используя pickerview. Могу ли я иметь 1 pickerview, который будет отображать Различный список элементов из разных массивов для разных текстовых полей?

может кто-нибудь объяснить, как это сделать программно с помощью примера кода?

также как я могу скрыть pickerview при загрузке представления, и он должен отображаться только при нажатии на текстовое поле с соответствующим списком данных? Он должен исчезнуть, когда я выберу данные и снова появляются, когда я нажимаю на другое текстовое поле с соответствующим списком данных и так далее.

Я новичок в xcode. Любая помощь будет высоко оценена. Спасибо.

4 ответов


вы можете использовать только один PickerView, что показывает разные данные в зависимости от некоторых условий.

моя идея заключается в следующем: вы можете создать, скажем, 8 различных массивов - один для заполнения UIPickerView в зависимости от того, что UITextField был задействован. Объявите их в интерфейсе как NSArray и инициализируйте в viewDidLoad:

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

затем вы создаете другой, чтобы указать массив, который должен его заполнить (например,NSArray *currentArray) и вам даже не нужно init it = it будет использоваться только для указания правильного выбора.

таким образом, вы должны установить делегат UITextFields на контроллер представления и в методе textFieldShouldBeginEditing вы проверяете, кто является UITextField, назначаете правильный массив в качестве currentArray, перезагружаете UIPickerView с reloadData, и вернуть нет в том же textFieldShouldBeginEditing метод. 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]];
}

Использовать Это.

 - (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.


я протестировал этот код с 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;
}

1.Используйте панель инструментов с Done barButtonItem, которая должна скрывать pickerView.

2.Теперь дайте ваши textFields tagValues как:textFiled1.tag=100; затем, используя это значение тега, заполните массив pickerView.

3.Когда пользователь выбирает любое значение из pickerView, в его методе делегата писать

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

Я думаю, можно попробовать код самостоятельно, теперь у вас есть суть решения.Удачи!!