2

我正在寻找一种将单个 UIPickerview 用于两个不同文本字段的方法。我希望在选择每个文本字段时弹出选择器视图。用户选择他们的项目后,该项目将填充特定的文本字段。选择器必须根据所选的文本字段进行填充。

我读过这篇文章:

如何在一个视图中将一个 UIPickerView 用于多个文本字段?

还有这个:

如何使用 UIPickerView 在一个视图中填充不同的文本字段?

这:

文本字段编辑中 UIPickerView 的多个来源

但是,没有一个给出完整的解决方案。

我是 Xcode 的新手,所以我想要一个包含设置情节提要的步骤的解决方案。

我很感激任何帮助,因为我已经研究了几周。

编辑:这是我的代码:

.h:
#import <UIKit/UIKit.h>

@interface klViewController : UIViewController <UIPickerViewDelegate, UIPickerViewDataSource> {

IBOutlet UITextField *textField1;
IBOutlet UITextField *textField2;
NSMutableArray *pickerArray1;
NSMutableArray *pickerArray2;
UIPickerView *pickerView;
}
@property(nonatomic,retain) IBOutlet UITextField *textField1;
@property(nonatomic,retain) IBOutlet UITextField *textField2;
@property(nonatomic,retain) IBOutlet UIPickerView *pickerView;


@end

.m:
#import "klViewController.h"

@interface klViewController ()

@end

@implementation klViewController
@synthesize pickerView;
@synthesize textField1;
@synthesize textField2;
int variabla;

-(void)textFieldDidBeginEditing:(UITextField *)textField{
    [pickerView setHidden:YES];
    if (textField1.editing == YES) {
        [textField1 resignFirstResponder];
        [pickerView setHidden:NO];
        variabla = 1;
    }else if (textField2.editing == YES) {
        [textField2 resignFirstResponder];
        [pickerView setHidden:NO];
        variabla = 2;
    }
    NSLog(@"variabla %d",variabla);
    [pickerView reloadAllComponents];
}

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView;
{
    return 1;
}
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component;
{
    if (variabla == 1) {
        return [pickerArray1 count];
    }else if (variabla == 2) {
        return [pickerArray2 count];
    }else {
        return 0;
    }
}
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component;
{
    if (variabla == 1) {
        return [pickerArray1 objectAtIndex:row];
    }else if (variabla == 2) {
        return [pickerArray2 objectAtIndex:row];
    }else {
        return 0;
    }
}
- (void)textFieldShouldReturn:(UITextField *)textField{
    [textField resignFirstResponder];
}
- (void)viewDidLoad {
    [super viewDidLoad];
    [pickerView setHidden:YES];
    pickerArray1 = [[NSMutableArray alloc] initWithObjects:@"0", @"1", @"2", nil];
    pickerArray2 = [[NSMutableArray alloc] initWithObjects:@"3", @"4", @"5", nil];
}

@end

这是我的故事板的屏幕截图:

我的故事板的屏幕截图

状态更新:

当我运行程序时:
1)pickerview 是隐藏的。
2)当我选择一个文本字段时,选择器视图会出现并根据所选的文本字段正确填充。

问题:
1) 在文本字段外单击时选择器不会消失。
2)选择选择器中的行时不会填充文本字段。

希望这能提供更多的见解。

4

4 回答 4

2

1) 在文本字段外单击时,选择器不会消失。

当发生这种情况时,您没有任何代码试图让选择器消失。尝试在视图中添加一个简单的点击手势识别器。添加一行viewDidLoad喜欢:

[self.view addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(backgroundTap:)]];

然后简单地实现该功能:

-(void)backgroundTap:(UITapGestureRecognizer *)tapGR{
    self.pickerView.hidden = YES;
    // And maybe..
    variabla = 0;
}

由于您使用 hidden 属性使选择器出现和消失,这将非常简单。还有其他更复杂的方法可以做到这一点,我希望你能探索一下。通常选择器设置为文本字段的inputView属性;这是值得研究的。

2)选择选择器中的行时不会填充文本字段。

您还没有处理选择器的pickerView:didSelectRow:inComponent:委托方法。That's the method that gets called when the picker stops turning and lands on an item. 不要假设这是用户选择的项目,它将被多次调用。

-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{
    NSString *text = [self pickerView:pickerView titleForRow:row forComponent:component];
    UITextField *current = nil;
    if (variabla == 1) current = self.textField1;
    else if (variabla == 2) current = self.textField2;
    current.text = text;
}

这应该让你的实现工作。另一件事是实例变量,应该在紧跟or行variabla之后用大括号声明。@interface@implementation

@implementation klViewController {
    int variabla;
}
@synt....
于 2012-10-11T16:08:45.637 回答
1

给出两个不同文本字段的标签,以识别您选择的文本字段,一切正常,您只需要更改以下方法。希望这项工作

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




if ([textField viewWithTag:100]) {

    [textField resignFirstResponder];
    [self.View1 setHidden:NO];
    variable=1;
}

否则 if ([textField viewWithTag:101]) {

    [textField resignFirstResponder];
    [self.View1 setHidden:NO];
     variable=2;

}

    [_Picker_view reloadAllComponents];

}

谢谢 :)

于 2015-12-01T13:14:16.710 回答
0

在.h

@interface TQViewController : UIViewController<UIPickerViewDelegate>
{
    UITextField *textfield;
    UIPickerView *Picker1;
    NSArray *Array1,*Array2;
}
end

在.m

    - (void)viewDidLoad
    {

        [super viewDidLoad];

        //TextField
        textfield=[[UITextField alloc]initWithFrame:CGRectMake(5,5,310,40)];
        textfield.borderStyle = UITextBorderStyleRoundedRect;
        textfield.backgroundColor=[UIColor whiteColor];
        textfield.textAlignment = UITextAlignmentCenter;
        textfield.placeholder = @"<enter amount>";
        [self.view addSubview:textfield];
textfield1=[[UITextField alloc]initWithFrame:CGRectMake(5,100,310,40)];
        textfield1.borderStyle = UITextBorderStyleRoundedRect;
        textfield1.backgroundColor=[UIColor whiteColor];
        textfield1.textAlignment = UITextAlignmentCenter;
        textfield1.placeholder = @"<enter amount>";
        [self.view addSubview:textfield1];

        // PickerView1
        Array1=[[NSArray alloc]initWithObjects:@"USD",@"INR",@"EUR", nil];
        Picker1=[[UIPickerView alloc]initWithFrame:CGRectMake(0, 50, 320,10)];
        Picker1.delegate=self;
        Picker1.tag=PICKER1_TAG;
        Picker1.showsSelectionIndicator=YES;
        [self.view addSubview:Picker1];
     Array2=[[NSArray alloc]initWithObjects:@"USD",@"INR",@"EUR", nil];
    }
       -(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
        {
           if([textfield becomeFirstResponder])
            return [Array1 count];
           if([textfield1 becomeFirstResponder])
            return [Array2 count];
        }
        - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
          NSString *title;
            if([textfield becomeFirstResponder])
            {
                title=[Array1 objectAtIndex:row];  
                return title; 
            }
            ([textfield1 becomeFirstResponder])
            {
                title=[Array2 objectAtIndex:row];  
                return title; 

            }       
        }

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

if([textfield becomeFirstResponder])
            {
                //your code 
            }
            ([textfield1 becomeFirstResponder])
            {
                //your code  

            } 
}
于 2012-10-10T05:59:00.523 回答
0
  1. 确保您已在头文件中声明了 Picker View 对象。
  2. 在头文件中,导入 UITextFieldDelegate 协议:

    @interface MyView:UIViewController < UITextFieldDelegate>

  3. 在 IB 中,为您拥有的每个文本字段设置一个标签。

  4. 在 *.m 文件中,实现 textFieldShouldBeginEditing 方法,更新 PickerView 数组 Data Source 并重新加载所有选取器视图组件。

       -(BOOL) textFieldShouldBeginEditing:(UITextField *)textField {
    
       if (textField.tag == 1) {
    
       itemsArray = [[NSArray alloc] arrayWithObjects:@"A", @"B"];
    
       }
    
       if (textField.tag == 2) {
    
           itemsArray = [[NSArray alloc] arrayWithObjects:@"Green", @"Yellow"];
       }
    
       [myPickerView reloadAllComponents];
       }
    
  5. 确保在头文件中导入 UIPickerViewDelegate 和 UIPickerViewDataSource。

您可以根据需要对尽可能多的文本字段使用相同的选择器视图,根据所选文本字段更改选择器视图的内容,您需要在文本字段被替换时将选择器视图的数据源替换为不同的项目选择然后重新加载选择器视图组件。

好吧,我的朋友,在这里解释起来恐怕有点复杂。您可以在 IB 属性菜单中设置对象的标记值。将 PickerView 拖入视图并选中后,您可以在“对象属性”菜单(侧面)中更改标记属性。我认为您应该寻找将向您展示如何设置简单的选择器视图或表格视图(它们的工作方式非常相似)的教程,这将为您提供有关如何做您想做的事情的更多信息。简而言之,每个 Picker 视图都从数据源获取信息,您可以创建一个包含一些字符串的数组,并让picker 视图将数组中的每个项目作为一行加载。我有一个包含一些初学者信息的小网站,请查看。
http://i-tutor.weebly.com/index.html

于 2012-10-10T07:59:40.437 回答