【问题标题】:How to use Multiple UIPickerViews in same View controller using UITextFields如何使用 UITextFields 在同一视图控制器中使用多个 UIPickerViews
【发布时间】:2020-07-27 23:46:44
【问题描述】:

我试图在 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];

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

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

myPickerView = [[UIPickerView alloc] init];

[myPickerView setDataSource: self];

[myPickerView setDelegate: self];

myPickerView.showsSelectionIndicator = YES;

UIBarButtonItem *doneButton = [[UIBarButtonItem alloc]initWithTitle:@"Done" style:UIBarButtonItemStyleDone 目标:自我行动:@selector(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 = 工具栏;

// txtField1

txtField1.inputView = myPickerView;

txtField1.inputAccessoryView = 工具栏;

txtField2.inputView = myPickerView;

txtField2.inputAccessoryView = 工具栏;

}

-(void)done:(id)sender{

[bloodGroup resignFirstResponder];

[txtField1 resignFirstResponder];

[txtField2 resignFirstResponder];

}

pragma mark - UIPickerViewDataSource

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

if (isBloodGroupFieldSelected) {

返回 1;

}

else if(!isBloodGroupFieldSelected){

返回 1;

}

else if(!isGenderGroupFieldSelected){

返回 1;

}

返回 0;

}

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

if (isBloodGroupFieldSelected) {

返回[数据数组计数];

}

else if(!isBloodGroupFieldSelected)

{

返回 [genderArray 计数];

}

else if(!isGenderGroupFieldSelected)

{

返回 [ageArray 计数];

}

返回 0;

}

pragma mark - UIPickerViewDelegate

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

if (isBloodGroupFieldSelected) {

返回数据数组[行];

}

else if(!isBloodGroupFieldSelected)

{

返回性别数组[行];

}

else if(!isGenderGroupFieldSelected)

{

返回年龄数组[行];

}

返回 0;

}

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

if (isBloodGroupFieldSelected) {

bloodGroup.text = dataArray[row];

}

else if(!isBloodGroupFieldSelected)

{

txtField1.text = genderArray[row];

}

else if(!isGenderGroupFieldSelected)

{

txtField2.text=ageArray[row];

}

}

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

if (textField == bloodGroup) {

isBloodGroupFieldSelected = YES;

}

else if (textField == txtField1){

isBloodGroupFieldSelected = 否;

isGenderGroupFieldSelected = YES;

}

else if (textField == txtField2){

isGenderGroupFieldSelected = NO;

isBloodGroupFieldSelected = 否;

}

[myPickerView reloadAllComponents];

}

【问题讨论】:

    标签: ios objective-c iphone xcode uipickerview


    【解决方案1】:

    这里的问题在于您在 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 标签。这对你来说会更容易。

    【讨论】:

    • 感谢您的回答。它的工作很好。能否请您使用标签分享我们如何编写代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-12
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多