IOS - заполнение статического UIPickerView

У меня есть форма профиля как часть процесса регистрации для приложения iOS.

Я хотел бы использовать меню "drop down" для таких элементов, как пол, заголовок, DOB и т.д. Данные для каждого будут статичными - я буду использовать UIPickerView для реализации, но мой вопрос: мне нужно создавать массивы и делегаты данных для заполнения каждого отдельного сборщика или есть более простой способ применения статических данных?

Ответ 1

Можете ли вы сделать это без делегата? Нет.

Можете ли вы сделать это без массива? Да, но не стоит.

Вот пример без массива (из http://cocoamatic.blogspot.com/2010/08/create-uipickerview-programmatically.html).

- (void)pickerView:(UIPickerView *)pickerView didSelectRow: (NSInteger)row inComponent:(NSInteger)component {
    // Handle the selection
}

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

    return numRows;
}

// 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;

    title = [@"" stringByAppendingFormat:@"Row %d",row];

    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;
}

Тем не менее, вам действительно нужно просто использовать массив, чтобы сделать его намного проще для чтения. Если вы хотите добавить дополнительное значение, просто добавьте его в свой массив. Вместо обновления в нескольких местах просто добавьте другое значение в свой массив. Кроме того, гораздо легче понять.

@implementation PickerViewController
.
.
- (void)viewDidLoad {
      [super viewDidLoad];
      _myArray = @[@"Row 1", @"Row 2", @"Row 3",];
}

- (void)pickerView:(UIPickerView *)pickerView didSelectRow: (NSInteger)row inComponent:(NSInteger)component {
    // Handle the selection
}

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

    return _myArray.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;

    title = myArray[row];

    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;
}

Если у вас есть несколько сборщиков, вы просто используете несколько массивов и проверяете каждый PickerView, чтобы увидеть, какой из них был с момента, когда PickerView передается в каждую из перечисленных функций.

@implementation PickerViewController
.
.
- (void)viewDidLoad {
      [super viewDidLoad];
      _myArray1 = @[@"Row 1", @"Row 2", @"Row 3",];
      _myArray2 = @[@"Row 1-2", @"Row 2-2", @"Row 3-2", @"Row 4-2"];      

      UIPickerView pickerView1 = [[UIPickerView alloc] init];
      UIPickerView pickerView2 = [[UIPickerView alloc] init];      
}

- (void)pickerView:(UIPickerView *)pickerView didSelectRow: (NSInteger)row inComponent:(NSInteger)component {
    // Handle the selection
    if (pickerView == pickerView1)
    {
        // First Picker
    }
    else if (pickerView == pickerView2)
    {
        // First Picker    
    }
}

// tell the picker how many rows are available for a given component
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
    if (pickerView == pickerView1)
    {
        // First Picker
         return _myArray1.count;
    }
    else if (pickerView == pickerView2)
    {
        // Second Picker    
        return _myArray2.count;
    }    

    // A third picker passed in somehow
    return 0;
}

// tell the picker how many components it will have
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
    if (pickerView == pickerView1)
    {
        // First Picker
         return 1;
    }
    else if (pickerView == pickerView2)
    {
        // Second Picker    
        return 1;
    }    

    // A third picker passed in somehow
    return 0;
}

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

    if (pickerView == pickerView1)
    {
        // First Picker
         title = myArray1[row];
    }
    else if (pickerView == pickerView2)
    {
        // Second Picker    
        rtitle = myArray2[row];
    }    

    return title;
}

// tell the picker the width of each row for a given component
- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component {
    if (pickerView == pickerView1)
    {
        // First Picker
         return 300;
    }
    else if (pickerView == pickerView2)
    {
        // Second Picker    
        return 400;
    }    

    // A third picker passed in somehow
    return 0;
}