如何使用 UITextFields 在同一视图控制器中使用多个 UIPickerView

How to use Multiple UIPickerViews in same View controller using UITextFields

我正在尝试在 Objective-C 的一个视图中包含多个选择器视图。到目前为止,我已经创建了 3 个不同的文本字段,如果我单击它们,我希望其中三个具有不同的选择器视图。所以让我们说如果点击文本字段 #1 它打开数组 #1 和文本字段 #2 第二个和文本字段 # 第三个。如果我单击第一个和第二个文本字段相关的选择器视图显示,但如果我单击第三个选择器视图不显示。

-(void)viewDidLoad{

isBloodGroupFieldSelected = 是;

isGenderGroupFieldSelected = 是;

// 加载视图后执行任何其他设置。

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.view addSubview:txtField1];

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

txtField2.delegate = 自己;

[self.view addSubview:txtField2];

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

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

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

myPickerView = [[UIPickerView 分配] 初始化];

[myPickerView setDataSource: self];

[myPickerView setDelegate: self];

myPickerView.showsSelectionIndicator = 是;

UIBarButtonItem *doneButton = [[UIBarButtonItem alloc]initWithTitle:@"完成" style:UIBarButtonItemStyleDone target:self 动作:@选择器(完成:)];

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

[工具栏setBarStyle:UIBarStyleBlackOpaque];

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

[工具栏setItems:toolbarItems];

bloodGroup.inputView = myPickerView;

bloodGroup.inputAccessoryView = 工具栏;

// txtField1

txtField1.inputView = myPickerView;

txtField1.inputAccessoryView = 工具栏;

txtField2.inputView = myPickerView;

txtField2.inputAccessoryView = 工具栏;

}

-(void)完成:(id)发件人{

[bloodGroup resignFirstResponder];

[txtField1 resignFirstResponder];

[txtField2 resignFirstResponder];

}

pragma 标记 - UIPickerViewDataSource

// #3 -(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {

if (isBloodGroupFieldSelected) {

return1;

}

否则如果(!isBloodGroupFieldSelected){

return1;

}

else if(!isGenderGroupFieldSelected){

return1;

}

return 0;

}

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

if (isBloodGroupFieldSelected) {

return [dataArray 计数];

}

else if(!isBloodGroupFieldSelected)

{

return [genderArray 计数];

}

else if(!isGenderGroupFieldSelected)

{

return [ageArray 计数];

}

return 0;

}

pragma 标记 - UIPickerViewDelegate

// #5 -(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {

if (isBloodGroupFieldSelected) {

return 数据数组[行];

}

else if(!isBloodGroupFieldSelected)

{

return 性别数组[行];

}

else if(!isGenderGroupFieldSelected)

{

return ageArray[行];

}

return 0;

}

// #6 -(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {

if (isBloodGroupFieldSelected) {

bloodGroup.text = 数据数组[行];

}

else if(!isBloodGroupFieldSelected)

{

txtField1.text = genderArray[行];

}

else if(!isGenderGroupFieldSelected)

{

txtField2.text=年龄数组[行];

}

}

if (textField == bloodGroup) {

isBloodGroupFieldSelected = 是;

}

else if (textField == txtField1){

isBloodGroupFieldSelected = 否;

isGenderGroupFieldSelected = 是;

}

else if (textField == txtField2){

isGenderGroupFieldSelected = 否;

isBloodGroupFieldSelected = 否;

}

[myPickerView reloadAllComponents];

}

问题出在您在 titleForRow 方法中的编码。一旦将 false 分配给 isBloodGroupFieldSelected 方法,那么指针总是移动到 else 部分,因为在移动到最后一个块之前那里的条件匹配。

为此,您需要检查两个条件

 (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 标记。这对你来说会更容易。