UIPickerView - заполнить 1 сборщик несколькими массивами

У меня проблема с представлением выбора в Xcode 4.4. Я хочу заполнить 1 Picker несколькими массивами. Я посмотрел / прочитал много руководств и почти смог приступить к работе. Это мой код:

*.h

 #import <UIKit/UIKit.h>

@interface PickerView : UIViewController

<UIPickerViewDataSource,UIPickerViewDelegate>
{
    IBOutlet UIPickerView *picker;

    NSMutableArray *array_1;
    NSMutableArray *array_2;
}

@property (strong, nonatomic) IBOutlet UIView *pickerContainer;
@property (strong, nonatomic) IBOutlet UITextField *textfield_1;
@property (strong, nonatomic) IBOutlet UITextField *textfield_2;

- (IBAction)showArray_1Picker:(id)sender;
- (IBAction)showArray_2Picker:(id)sender;
- (IBAction)hidePicker:(id)sender;

@end

*.m

#import "PickerView.h"

@interface PickerView ()

@end

@implementation PickerView
@synthesize pickerContainer;
@synthesize textfield_1;
@synthesize textfield_2;

int textFieldTouched = 0;

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

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent (NSInteger)component
{
    switch(textFieldTouched)
    {
        case 1:
            return [array_1 count];
            break;
        case 2:
            return [array_2 count];
            break;
        default:
            return 0;
    }
}


- (NSString *)pickerView:(UIPickerView *)picker titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
    switch(textFieldTouched)
    {
        case 1:
            return [array_1 objectAtIndex:row];
            break;
        case 2:
            return [array_2 objectAtIndex:row];
            break;
        default:
            return @"nothing";
    }
}

- (void) pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    switch(textFieldTouched)
    {
        case 1:
            textfield_1.text = [array_1 objectAtIndex:[pickerView selectedRowInComponent:0]];
            break;
        case 2:
            textfield_2.text = [array_2 objectAtIndex:[pickerView selectedRowInComponent:0]];
            break;
    }
}

 - (void)viewDidLoad
 {
    array_1 = [[NSMutableArray alloc] init];
    [array_1 addObject:@"1"];
    [array_1 addObject:@"2"];
    [array_1 addObject:@"3"];
    [array_1 addObject:@"4"];
    [array_1 addObject:@"5"];

    array_2 = [[NSMutableArray alloc] init];
    [array_2 addObject:@"a"];
    [array_2 addObject:@"b"];
    [array_2 addObject:@"c"];
    [array_2 addObject:@"d"];
    [array_2 addObject:@"e"];

    pickerContainer.frame = CGRectMake(0, 460, 320, 261);

    [super viewDidLoad];
}

- (void)viewDidUnload
{
    [self setPickerContainer:nil];
    [self setTextfield_1:nil];
    [self setTextfield_2:nil];
    [super viewDidUnload];
}

- (IBAction)showArray_1Picker:(id)sender
{
    [textfield_1 resignFirstResponder];
    textFieldTouched = 1;
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3];
    pickerContainer.frame = CGRectMake(0, 200, 320, 261);
    [UIView commitAnimations];
}

- (IBAction)showArray_2Picker:(id)sender
{
    [textfield_2 resignFirstResponder];
    textFieldTouched = 2;
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3];
    pickerContainer.frame = CGRectMake(0, 200, 320, 261);
    [UIView commitAnimations];
}

- (IBAction)hidePicker:(id)sender
{
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3];
    pickerContainer.frame = CGRectMake(0, 460, 320, 261);
    [UIView commitAnimations];
}

@end

Итак, у меня есть 2 основные проблемы:

  1. Если я установлю textFieldTouched = 0 (или> 2), как я сделал до того, как мой выборщик будет пустым, когда он появится. В любом случае, если я снова его скрою, он запишет первое значение соответствующего массива в текстовое поле.

  2. Если я устанавливаю textFieldTouched = 1 или = 2, средство выбора заполняется связанным массивом независимо от того, какое текстовое поле я пытаюсь редактировать. Но если я прокручиваю значения в средстве выбора вне поля зрения, они изменились, когда я прокручиваю назад.

Я хочу, чтобы это было так:

Если я коснусь текстового поля 1, появится средство выбора, заполненное массивом 1

Если я коснусь текстового поля 2, появится средство выбора, заполненное массивом 2

и так далее.

Можешь помочь мне с этим?

Я загрузил код, чтобы вы могли лучше его рассмотреть.

https://dl.dropbox.com/u/5858884/ProblemCode.zip

P.S.

Английский не мой родной язык, так что извините за ошибки ;)

Я начал программировать 2 недели назад, поэтому, если вы обнаружите что-то не так в моем коде, что не относится к моей проблеме, пожалуйста, сообщите мне, чтобы я мог исправиться :)


person Fugu_Fish    schedule 07.09.2012    source источник


Ответы (1)


В ваших методах showArray1Picker и showArray2Picker добавьте строку:

[picker reloadAllComponents];

Это заставит средство выбора перезагрузить свои данные. Вам также необходимо подключить IBOutlet, средство выбора, к представлению средства выбора в IB — я заметил, что оно не было подключено.

person rdelmar    schedule 07.09.2012
comment
Спасибо за идеальный ответ :) Есть ли способ, чтобы, если я открываю сборщик, он всегда начинался с строки 1? - person Fugu_Fish; 08.09.2012
comment
Вы имеете в виду, что сборщик находится в строке 1, когда вы переключаетесь с одного сборщика на другой? - person rdelmar; 08.09.2012
comment
Я хочу, чтобы это было так. на данный момент, если я выберу третью строку, затем скрою средство выбора и снова покажу его с другим массивом, выбранная строка по-прежнему будет третьей - person Fugu_Fish; 08.09.2012
comment
Если вы добавите строку [picker selectRow:0 inComponent:0 анимированный:NO]; в ваших IBActions для 2 сборщиков, что заставит их вернуться в первую строку. - person rdelmar; 09.09.2012