UIPickerView - видовое представление колеса прокрутки

Колесо прокрутки позволяет пользователю делать выбор между различными опциями, вращая колесо на экране. Данное видовое представление может быть использовано например для выбора даты и времени (как это реализовано в Date Picker), или например выбора шрифта для текстового процессора. Список должен быть логически упорядочен для простоты его использования.

picker view iOS

Picker View реализован в классе UIPickerView. Сконфигурировать его можно в Interface Builder в секции Picker View инспектора атрибутов.

Контент для Picker View

Предоставление контента реализуется программно, и начинается с задания источника данных (data source) и делегата (delegate), и дальнейшей их реализации. Это невозможно сделать в Interface Builder, следовательно необходимо реализовать программно.

Колесу прокрутки необходим делегат (delegate) для отображения данных и отработки пользовательских действий. Делегат реализуется UIPickerViewDelegate протоколом и предоставляет контент для каждой строки, такой как строка с атрибутами, обычная строка или видовое представление, а также обрабатывает пользовательский выбор или отмену выбора. Делегат также реализует методы, возвращающие отрисовываемый прямоугольник для строк в каждом компоненте, эти методы необходимы только для реализации делегата, который возвращает видовые представления в качестве части Picker View контента.

В дополнение ко всему колесу прокрутки также требуется источник данных (data source), который реализуется UIPickerViewDataSource протоколом и реализует обязательные методы, возвращающие количество компонентов (колонок) и количество строк для каждого компонента. Сам-же контент предоставляет делегат.

После установки источника данных и делегат, установите требуемые выбранные строки в компонентах с помощью метода selectRow:inComponent:animated: без анимации. Обычно это делают в методе viewDidLoad контроллера вида.

Вы можете динамически изменять строки в компоненте вызывая метод reloadComponent:, или во всех компонентах с помощью reloadAllComponents. Когда вы вызываете эти методы делегат предоставляет новые данные своему колесу прокрутки.

Начиная с iOS 7 вы не можете изменять индикатор выбора (selection indicator), выбор или снятие галочки с пункта Shows Selection Indicator в инспекторе атрибутов Interface Builder не имеет никакого эффекта.

Пример реализации Picker View

Создадим в Xcode новый проект на основе Single View Application для iPhone.

В Interface Builder на созданное видовое представление разместим два Picker View как показано ниже:

Picker View Example

Создадим для перенесенных Picker View ссылки IBOutlet в ViewController.h pv1 и pv2, а также два массива, содержащие данные для наших Picker View:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UIPickerViewDataSource, UIPickerViewDelegate>
{
  IBOutlet UIPickerView *pv1;
  IBOutlet UIPickerView *pv2;
  NSMutableArray* arrData1;
  NSMutableArray* arrData2;
}
@end

Создадим новый класс для первого источника данных, унаследованный от NSObject:

mbCountry.h

#import <Foundation/Foundation.h>

@interface mbCountry : NSObject

@property (copy, nonatomic)NSString* country;
@property (readonly,nonatomic)NSMutableArray* arrCities;

@end

mbCountry.m

#import "mbCountry.h"

@implementation mbCountry

- (instancetype)init
{
  self = [super init];
  if (self) {
    _arrCities = [NSMutableArray array];
  }
  return self;
}

@end

Перейдем в файл ViewController.m и отредактируем его.

#import "ViewController.h"
#import "mbCountry.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];
  // Do any additional setup after loading the view, typically from a nib.
  arrData1 = [NSMutableArray array]; // массив для первого источника данных
  arrData2 = [NSMutableArray array]; // массив для второго источника данных
  
  // Инициализируем первый источник данных
  mbCountry* america = [[mbCountry alloc] init];
  america.country = @"USA";
  [america.arrCities addObject:@"New York"];
  [america.arrCities addObject:@"Washington"];
  [america.arrCities addObject:@"Los Angeles"];
  [america.arrCities addObject:@"Detroit"];
  [arrData1 addObject:america];
  mbCountry* russia = [[mbCountry alloc]init];
  russia.country = @"Россия";
  [russia.arrCities addObject:@"Москва"];
  [russia.arrCities addObject:@"Владивосток"];
  [russia.arrCities addObject:@"Омск"];
  [arrData1 addObject:russia];
  
  // Инициализируем второй источник данных
  [arrData2 addObject:@"Первый"];
  [arrData2 addObject:@"Второй"];
  
  //назначаем делегата и источник данных (можно сделать в IB
  pv1.delegate = self;
  pv1.dataSource = self;
  pv2.delegate = self;
  pv2.dataSource = self;
}

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
  // Возвращает кол-во колонок в Picker View
  NSInteger res;
  if(pickerView == pv1)
    res = 2;
  else
    res = 1;
  return res;
}

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
  // Возвращает кол-во строк в колонке
  NSInteger result;
  if(pickerView == pv1){
    if(!component)
      result = arrData1.count; // кол-во стран
    else{
      NSInteger selCountry = [pv1 selectedRowInComponent:0]; // индекс выбранной страны
      mbCountry* country = arrData1[selCountry];
      result = country.arrCities.count; // кол-во городов
    }
  }
  else
    result = arrData2.count;
  return result;
}

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
  NSString* s;
  if(pickerView == pv1){
    if(!component){
      mbCountry* cnt = arrData1[row];
      s = cnt.country;
    }
    else{
      NSInteger selCountry = [pv1 selectedRowInComponent:0]; // индекс выбранной страны
      mbCountry* country = arrData1[selCountry];
      s = country.arrCities[row];
    }
  }
  else // pv2
    s = arrData2[row];
  return s;
}

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row
       inComponent:(NSInteger)component{
  // Сигнализирует о выборе компонента
  if(pickerView == pv1 && component == 0){
    [pickerView reloadComponent:1];
  }
}

- (void)didReceiveMemoryWarning {
  [super didReceiveMemoryWarning];
  // Dispose of any resources that can be recreated.
}

@end
 
 
homeЗаметили ошибкукарта сайта 
   Made on a Mac