UIpickerView, заполняющий несколько полей uitextFields в одном ScrollView - PullRequest
2 голосов
/ 21 августа 2011

Привет, я разрабатываю приложение для iphone, в котором я заполнил uipickerview, и оно отлично работает с одним полем uitext.Но у меня есть 6 полей uitext, которые мне нужно заполнить, и я использую одно и то же представление uipicker для каждого поля UItext.

У меня работает Ipickerview, загруженный объектами массива, и он появляется при касании каждого поля.Проблема заключается в том, что приведенный ниже код UItextfields совместно использует те же данные из средства выбора.

Я не могу понять, как кодировать, чтобы каждое поле получало свои данные из строки UIPickerView.Что я делаю неправильно?Любые предложения по кодированию?

Спасибо

@ реализация BestViewController

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

-(NSInteger)pickerView:(UIPickerView *)thePickerView numberOfRowsInComponent:                    (NSInteger)component 
{return [list count]; }

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

-(void)pickerView:(UIPickerView *)thePickerview didSelectRow:(NSInteger)row inComponent:      (NSInteger)component 
{ 
    uitextfield1.text = [list objectAtIndex:row];   
    utitextfield2.text = [list objectAtIndex:row];
}



- (void)viewDidLoad {

[super viewDidLoad];

    uitextfield1.inputView = pickerView; 
uitextfield2.inputView = pickerView;

list = [[NSMutableArray alloc] init];   
[list addObject:@"a"];
[list addObject:@"b"];
    [list addObject:@"c"];  
    [list addObject:@"d"];
}    

Ответы [ 2 ]

2 голосов
/ 22 августа 2011

Вот как я бы это сделал:

Сначала определите несколько разных сборщиков.Конечно, вы используете тот же UIPickerView, но вы меняете одно свойство, которое помогает вам их различать.Есть разные данные для (почти) каждого текстового поля.Одно удобное свойство, разработанное Apple именно для этой цели, - tag, произвольное целое число, доступное каждому UIView.Вы можете назначить те же теги для UITextField s.

Например:

#define kFirstTextField 101
#define kSecondTextField 102
#define kThirdTextField 103
//... etc

В методе при касании текстового поля:

[myPickerView setHidden:NO];  // or however you show the picker
[myPickerView setTag:textField.tag];
[myPickerView reloadAllComponents];

В методах данных средства выбора:

-(NSString *)pickerView:(UIPickerView *)thePickerview 
            titleForRow:(NSInteger)row  
           forComponent:(NSInteger)component 
{
    if (thePickerView.tag==kFirstTextField) 
        { return [list1 count]; }
    if (thePickerView.tag==kSecondTextField) 
        { return [anotherOrTheSameList count]; }
// of course, you can also use a switch statement
    return [defaultList count];
}

Сделайте что-то подобное в методе titleForRow:.
Наконец, когда что-то выбрано, снова различайте по тегу:

-(void)   pickerView:(UIPickerView *)thePickerview 
        didSelectRow:(NSInteger)row 
         inComponent:(NSInteger)component 
{ 
    UITextField *field = (UITextField *) [thePickerview.superview viewWithTag:thePickerview.tag];   
// this assumes the UIPickerView is the subview of the same view as the UITextFields
    if (thePickerview.tag==kFirstTextField) 
        { field.text = [list1 objectAtIndex:row]; }
    if (thePickerview.tag==kSecondTextField)
        { field.text = [anotherOrTheSameList objectAtIndex:row]; }
    // etc.
    // alternatively:
    field.text = [self pickerView:thePickerview titleForRow:row forComponent:0];
}
2 голосов
/ 22 августа 2011

Вам нужно ухватиться за текущего первого респондента и установить его свойство text, а не явно устанавливать конкретное текстовое поле.

Итак,

-(void)pickerView:(UIPickerView *)thePickerview didSelectRow:(NSInteger)row inComponent:      (NSInteger)component 
{ 
    // textFields is an NSArray holding each of the textfields that are using the picker as an input view
    for (UITextField textField in textFields)
    {
        if ([textField isFirstResponder])
        {
            textField.text = [list objectAtIndex:row];
            break;
        }
    }    
}

Может быть, есть более элегантный способ найти текущего первого респондента, это не в моей голове. textFields может быть IBOutletCollection, но я сам не использовал их, поэтому не могу говорить с большим авторитетом.

...