UIPickerview 多个文本字段 Xcode

Posted

技术标签:

【中文标题】UIPickerview 多个文本字段 Xcode【英文标题】:UIPickerview Multiple TextFields Xcode 【发布时间】:2012-10-10 05:29:29 【问题描述】:

我正在寻找一种将单个 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

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

状态更新:

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

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

希望这能提供更多见解。

【问题讨论】:

你真的想达到什么目的?? 我希望从预定义的列表(即运动和类别)中填充两个选择器视图。当用户单击文本字段时,将弹出一个带有列表的 uipicker 视图(即运动)。选择一项运动后,pickerview 将消失,文本字段将显示该运动。类别也是如此。这有帮助吗? 所以在这种情况下你会有 2 个文本字段......但你想使用一个仅选择器视图的仪式?? 所以我想知道:1)如何通过情节提要将文本字段链接到选取器视图以及将文本字段/选取器视图链接到代表等,2)在选择文本字段时显示选取器视图 3)填充选取器视图来自预定义的数组和 4) 从选取器视图中的选择中填充文本字段 回答您之前的问题,是的:两个文本字段,一个选择器视图。 【参考方案1】:

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;

这应该可以让您的实现正常工作。还有一件事,尽管variabla 是一个实例变量,应该在紧跟@interface@implementation 行之后用花括号声明。

@implementation klViewController 
    int variabla;

@synt....

【讨论】:

感谢 NJones。这有帮助。 inputview 属性是 def 值得做的——我更喜欢它,但我首先实现了这段代码,老实说,不想花几天时间弄清楚...... NJones,下一步我希望将 json 数据解析到数组中。我创建了这篇文章:***.com/questions/12846093/…。你能看一下吗?【参考方案2】:

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

-(void)textFieldDidBeginEditing:(UITextField *)textField  




if ([textField viewWithTag:100]) 

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

else if ([textField viewWithTag:101])

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



    [_Picker_view reloadAllComponents];

谢谢:)

【讨论】:

【参考方案3】:
    确保您已在头文件中声明了 Picker View 对象。

    在头文件中,导入 UITextFieldDelegate 协议:

    @interface MyView:UIViewController

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

    在*.m文件中,实现textFieldShouldBeginEditing方法,更新PickerView数组数据源并重新加载所有picker view组件。

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

    确保在头文件中导入 UIPickerViewDelegate 和 UIPickerViewDataSource。

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

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

【讨论】:

对于我对 xcode(以及 obj-c 的理解)的有限理解,我深表歉意。如何为每个文本字段设置标签?另外,更新 PickerView 数组数据源并重新加载所有选择器视图组件是什么意思?你能提供整个 .h 和 .m 文件吗?这是我需要在代码中创建的新类吗?添加 .h 和 .m 类文件后,如何将这些文件连接到我拖入情节提要的选取器视图?虽然您提供的信息很有帮助,但我无法自己创建代码来填补漏洞。 我在我的回答中添加了一些信息。希望对您有所帮助。【参考方案4】:

在.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  

             

【讨论】:

这是 .m 文件吗? .h 文件是什么样的?我应该在 // 你的代码中添加什么? .h 包含选择器和文本字段的常规委托, //您的代码将被选择器选择时应该执行的操作替换...... 那会是什么样子?我是 xcode 的新手,所以如果我尝试过就想不出来...... 我已经清楚地给出了一切......除了你对我的期望????????

以上是关于UIPickerview 多个文本字段 Xcode的主要内容,如果未能解决你的问题,请参考以下文章

UIPickerView 作为多个 UITextField 的 inputView

UIPickerView 作为按钮操作并根据选择器的选定值设置文本字段的文本

无法在 SWIFT 中使用 UipickerView 委派文本字段

显示 UIPickerView 文本字段被选中,然后在选中后隐藏

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

在 AlertController 中从 UIPickerView 填充文本字段时出现问题