UIPickerview多个TextFields Xcode

时间:2012-10-10 05:29:30

标签: iphone objective-c xcode uipickerview

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

我读过这个:

How to use one UIPickerView for multiple textfields in one view?

这个:

How to use UIPickerView to populate different textfields in one view?

这个:

Multiple sources for UIPickerView on textfield editing

然而,没有一个提供完整的解决方案。

我是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

这是我故事板的一个屏幕:

Screen Shot of my StoryBoard

状态更新:

当我运行程序时:
1)隐藏了挑选者视图 2)当我选择文本字段时,选择器视图会根据所选的文本字段显示并正确填充。

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

希望这能提供更多见解。

4 个答案:

答案 0 :(得分: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;
}

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

  

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

您尚未处理选择器的pickerView:didSelectRow:inComponent:委托方法。当拾取器停止转动并落在物品上时,这就是被调用的方法。不要认为这是用户选择的项目,它将被多次调用。

-(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;
}

这应该让您的实施工作。还有一件事variabla是一个实例变量,应该在@interface@implementation行之后立即用花括号声明。

@implementation klViewController {
    int variabla;
}
@synt....

答案 1 :(得分:1)

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

System.IO.File.WriteAllLines(
    @"C:\Users\Mohammad_Taghi\Desktop\ab\a.txt",
    richTextBox1.Lines);

else if([textField viewWithTag:101]){

richTextBox1.SaveFile(@"C:\Users\Mohammad_Taghi\Desktop\ab\a.txt",
    RichTextBoxStreamType.PlainText); //This will remove any formatting

}

谢谢:)

答案 2 :(得分: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  

            } 
}

答案 3 :(得分:0)

  1. 确保已在头文件中声明了Picker View对象。
  2. 在头文件中,导入UITextFieldDelegate协议:

    @interface MyView:UIViewController&lt; UITextFieldDelegate&GT;

  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。

  6. 您可以根据需要为同一个文本字段使用相同的选取器视图,根据所选文本字段更改选择器视图的内容,只要文本需要将选择器视图的数据源替换为不同的项目正在选择字段,然后重新加载选取器视图组件。

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