Как использовать несколько UIPickerViews в одном контроллере View, используя UITextFields - PullRequest
0 голосов
/ 15 апреля 2020

Я пытаюсь создать несколько просмотров в одном представлении в Objective- C. До сих пор я создал 3 разных текстовых поля, и я хочу, чтобы три из них имели разные виды выбора, если я нажму на них. скажем, если щелкнуть текстовое поле № 1, откроется массив № 1 и текстовые поля № 2 - вторые, а текстовые поля - третье. Если я щелкаю по первому и второму текстовым полям, отображается связанный вид средства выбора, но если я щелкаю по третьему виду, средство выбора не отображается.

- (void) viewDidLoad {

isBloodGroupFieldSelected = YES;

isGenderGroupFieldSelected = YES;

// Выполнить любую дополнительную настройку после загрузки представления.

bloodGroup = [[UITextField alloc] initWithFrame: CGRectMake (10, 100, self.view.frame.size.width-10,30)];

[self.view addSubview: bloodGroup] ;

txtField1 = [[UITextField alloc] initWithFrame: CGRectMake (10, 160, self.view.frame.size.width-10,30)];

txtField1.delegate = self;

[self.view addSubview: txtField1];

txtField2 = [[UITextField alloc] initWithFrame: CGRectMake (10, 210, self.view.frame.size.width-10,30) ];

txtField2.delegate = self;

[self.view addSubview: txtField2];

dataArray = [[NSMutableArray alloc] initWithObjects: @ "A +", @ "A -", @ "B +", @ "B -", @ "O +", @ "O-", nil];

sexArray = [[NSMutableArray alloc] initWithObjects: @ "Male", @ "Female", nil];

ageArray = [[NSMutableArray alloc] initWithOb jects: @ "Age1", @ "Age2", nil];

myPickerView = [[UIPickerView alloc] init];

[myPickerView setDataSource: self];

[myPickerView setDelegate: self];

myPickerView.showsSelectionIndicator = YES;

UIBarButtonItem * doneButton = [[UIBarButtonItem alloc] initWithTitle: @ "Done" стиль самопознания: UIBartBileton: done:)];

UIToolbar * toolBar = [[UIToolbar alloc] initWithFrame: CGRectMake (0, self.view.frame.size.height- myPickerView.frame.size.height-50, 320, 50) ];

[toolBar setBarStyle: UIBarStyleBlackOpaque];

NSArray * toolbarItems = [NSArray arrayWithObjects: doneButton, nil];

[toolBar setItems: toolbarItems] * *

bloodGroup.inputView = myPickerView;

bloodGroup.inputAccessoryView = toolBar;

// txtField1

txtField1.inputView = myPickerView;

txtField1. inputAccessoryView = toolBar;

txtField2.inputView = myPickerView;

txtField2.inputAccessoryView = toolBar;

}

- (void) выполнено: (id) отправитель {

[bloodGroup resignFirstResponder];

[ txtField1 resignFirstResponder];

[txtField2 resignFirstResponder];

}

отметка прагмы - UIPickerViewDataSource

// # 3 - (NSInteger) numberOfererponents: UIPerPhone: *) pickerView {

if (isBloodGroupFieldSelected) {

return 1;

}

else if (! isBloodGroupFieldSelected) {

return 1;

}

иначе if (! isGenderGroupFieldSelected) {

return 1;

}

return 0;

}

- (NSInteger) pickerView: (UIPickerView *) pickerView numberOfRowsInComponent: (NSInteger) component {

if (isBloodGroupFieldSelected) {

return [dataArray count ];

}

иначе, если (! IsBloodGroupFieldSelected)

{

return [счетчик гендерного массива];

} * 111 8 *

else if (! IsGenderGroupFieldSelected)

{

return [ageArray count];

}

return 0;

}

отметка прагмы - UIPickerViewDelegate

// # 5 - (NSString *) pickerView: (UIPickerView *) pickerView titleForRow: строка (NSInteger) для компонента: компонент: (NSInteger) {

if (isBloodGroupFieldSelected) {

вернуть dataArray [row];

}

иначе, если (! IsBloodGroupFieldSelected)

{

возвращать поле гендерного массива [строка];

}

еще, если (! IsGenderGroupFieldSelected)

{

return ageArray [row];

}

return 0;

}

// # 6 - (void) pickerView: (UIPickerView *) pickerView didSelectRow: (NSInteger) строка inComponent: (NSInteger) компонент {

if (isBloodGroupFieldSelected) {

bloodGroup.text = dataArray [row];

}

иначе if (! IsBloodGroupFieldSelected)

{

txtField1.text = гендерArray [строка];

}

иначе if (! IsGenderGroupFieldSelected)

{

txtField2.text = ageArray [row];

}

}

  • (void) textFieldDidBeginEditing: (UITextField *) textField {

if (textField == bloodGroup) {

isBloodGroupFieldSelected = YES;

}

else if (textField == txtField1) {

isBloodGroupFi eldSelected = NO;

isGenderGroupFieldSelected = YES;

}

else if (textField == txtField2) {

isGenderGroupFieldSelected = NO;

isBloodGroupFieldSelected = NO;

}

[myPickerView reloadAllComponents];

}

1 Ответ

0 голосов
/ 15 апреля 2020

Здесь проблема с вашей кодировкой в ​​методе titleForRow. После присвоения false методу isBloodGroupFieldSelected, указатель всегда перемещается в остальную часть, потому что условие совпадает там до перехода к последнему блоку.

Для этого вам нужно проверить оба условия:

 (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {

if (isBloodGroupFieldSelected) {

return dataArray[row];

}

else if(!isBloodGroupFieldSelected) && isGenderGroupFieldSelected

{

return genderArray[row];

}

else if(!isGenderGroupFieldSelected)

{

return ageArray[row];

}

return 0;

}

Я предлагаю вам использовать для этого тег textField. Вам будет легче.

...