Ваш контроллер представления должен реализовать UIPickerViewDataSource , а также UIPickerViewDelegate .В XIB UIPickerView вам нужно связать владельца файла с делегатом и источником данных UIPickerView.
Как и в UITabelDataSource, вам нужно указать количество компонентов (table: section) внутри [numberOfComponentsInPickerView].Затем необходимо указать количество строк для каждого компонента в [numberOfRowsInComponent] .Наконец, вам нужно предоставить заголовок для каждой записи внутри [titleForRow] .
Теперь, чтобы воплотить все в жизнь, вы можете использовать [didSelectRow] для загрузки следующегокомпонента, если был выбран предыдущий.
Внимание: В UIPickerView есть небольшая ошибка, не позволяющая вызывать [didSelectRow] , когда компонент заполнен / изменен.Чтобы сделать его более плавным, я добавил запись «Нет» в качестве первой записи, которая не является выборкой и не приводит к загрузке следующего компонента.
Это элементарный код:
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
return 3; // Number of Components aka Columns
}
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
if( component == 0 ) {
return [self.firstColumnEntries count] + 1;
} else if( component == 1 ) {
return [self.secondColumnEntries count] + 1;
} else if( component == 2 ) {
return [self.thirdColumnEntries count] + 1;
}
return 0;
}
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
NSLog( @"titleForRow(), component: %d, row: %d", component, row );
NSDictionary *item = nil;
if( row == 0 ) {
return @" --- ";
} else {
int correctedRow = row - 1;
if( component == 0 ) {
item = [self.firstColumnEntries objectAtIndex:correctedRow];
} else if( component == 1 ) {
item = [self.secondColumnEntries objectAtIndex:correctedRow];
} else if( component == 2 ) {
item = [self.thirdColumnEntries objectAtIndex:correctedRow];
}
return [item objectForKey:@"name"]; // My objects are NSDictionarys
}
}
- (void) pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
DLog( @"SSVC.didSelectRow(), component: %d, row: %d", component, row );
ActionRequest *action = nil;
if( row == 0 ) {
if( component == 0 ) {
[self refreshFirstColumn:self.firstColumnEntries];
} else if( component == 1 ) {
...
}
} else {
// Last Column is selected. Now selection is complete
...
}
}
Поскольку UIPickerView отнимает много места и вы не можете изменить его размер, я бы порекомендовал поместить его в дополнительный UIView (сделать остальное прозрачным) и отображать его, когда пользователь выбрал назначенное полек значению (UITextField).Когда выбор сделан (либо когда выбрано последнее значение, либо когда пользователь вводит кнопку), вы позволяете представлению исчезнуть и установите значение в UITextField.Убедитесь, что UITextField не может быть отредактирован, и что при его вводе отображается представление с представлением выбора.Когда закончите, убедитесь, что вы также переходите к следующему полю.