iOS. Приемы программирования - страница 26




>self.myPicker.delegate = self;


А теперь обработаем только что изученный метод делегата:


>– (NSString *)pickerView:(UIPickerView *)pickerView

>titleForRow:(NSInteger)row

>forComponent:(NSInteger)component{


>if ([pickerView isEqual: self.myPicker]){


>/* Строка имеет нулевое основание, а мы хотим, чтобы первая строка

>(с индексом 0) отображалась как строка 1. Таким образом, нужно

>прибавить +1 к индексу каждой строки. */

>result = [NSString stringWithFormat:@"Row %ld", (long)row + 1];


>}

>return nil;

>}


Теперь запустим приложение и посмотрим, что происходит (рис. 1.12).


Рис. 1.12. Вид выбора с одним разделом и несколькими строками


Виды с возможностью выбора в iOS 6 и старше могут подсвечивать выбранный вариант с помощью свойства showsSelectionIndicator, по умолчанию имеющего значение NO. Вы можете либо напрямую изменить значение этого свойства на YES, либо воспользоваться методом setShowsSelectionIndicator: вида выбора, чтобы включить этот индикатор:


>self.myPicker.showsSelectionIndicator = YES;


Снова предположим, что мы создаем вид выбора в окончательной версии нашего приложения. Какая польза от вида выбора, если мы не можем определить, что именно пользователь выбрал в каждом из компонентов? Да, хорошо, что Apple уже позаботилась о решении этой проблемы и предоставила нам возможность спрашивать вид выбора о выбранном варианте. Вызовем метод selectedRowInComponent: класса UIPickerView и передадим индекс компонента (с нулевым основанием), а в качестве возвращаемого значения получим целое число. Это число будет представлять собой индекс с нулевым основанием, сообщающий строку, которая в данный момент выбрана в интересующем нас компоненте.

Если во время исполнения вам потребуется изменить значения, содержащиеся в вашем виде выбора, необходимо гарантировать, что вид выбора сможет перегружать данные, заменяя старую информацию новой, получаемой из источника и от делегата. Для этого нужно либо принудительно заставить все компоненты перезагрузить содержащиеся в них данные (это делается с помощью метода reloadAllComponents), либо приказать конкретному компоненту перезагрузить содержащиеся в нем данные. Во втором случае применяется метод reloadComponent:. Ему передается индекс компонента, который необходимо перезагрузить.

См. также

Раздел 1.2.

1.5. Выбор даты и времени с помощью UIDatePicker

Постановка задачи

Необходимо предоставить пользователям вашего приложения возможность выбирать дату и время. Для этого нужен интуитивно понятный и уже готовый пользовательский интерфейс.

Решение

Воспользуйтесь классом UIDatePicker.

Обсуждение

Класс UIDatePicker очень напоминает класс UIPickerView. Фактически UIDatePicker – это уже заполненный вид выбора. Хорошим примером такого вида является программа Calendar (Календарь) в iPhone (рис. 1.13).


Рис. 1.13. Вид для выбора даты показан в нижней части экрана


Для начала объявим свойство типа UIDatePicker, а потом выделим и инициализируем это свойство и добавим его в вид, в котором находится контроллер нашего вида:


>#import "ViewController.h"


>@interface ViewController ()

>@property (nonatomic, strong) UIDatePicker *myDatePicker;

>@end


>@implementation ViewController


>…


А теперь, как и планировалось, инстанцируем вид для выбора даты:


>– (void)viewDidLoad{

>[super viewDidLoad];

>self.myDatePicker = [[UIDatePicker alloc] init];

>self.myDatePicker.center = self.view.center;

>[self.view addSubview: self.myDatePicker];