UIpickerView 在同一个 ScrollView 中填充多个 uitextFields

Posted

技术标签:

【中文标题】UIpickerView 在同一个 ScrollView 中填充多个 uitextFields【英文标题】:UIpickerView populating multiple uitextFields in the same ScrollView 【发布时间】:2011-08-21 17:16:38 【问题描述】:

您好,我正在开发一个 iphone 应用程序,其中填充了一个 uipickerview,它与一个 uitextfield 配合得很好。但是我需要填充 6 个 uitextfield,并且我为每个 UItextfield 使用相同的 uipickerview。

我正在使用加载了数组对象的 Ipickerview,它会在每个字段被触摸时弹出。问题在于 UItextfields 下面的代码共享来自选取器的相同数据。

我不知道如何编码,所以每个字段都从 UIPickerView 行获取它自己的数据。 我究竟做错了什么?有什么编码建议吗?

谢谢

@implementation BestViewController

-(NSInteger)numberOfComponentsInPickerView: (UIPickerView *)thePickerView 
 return 1; 

-(NSInteger)pickerView:(UIPickerView *)thePickerView numberOfRowsInComponent:                    (NSInteger)component 
return [list count]; 

-(NSString *)pickerView:(UIPickerView *)thePickerview titleForRow:(NSInteger)row  forComponent:(NSInteger)component 
return [list objectAtIndex:row]; 

-(void)pickerView:(UIPickerView *)thePickerview didSelectRow:(NSInteger)row inComponent:      (NSInteger)component 
 
    uitextfield1.text = [list objectAtIndex:row];   
    utitextfield2.text = [list objectAtIndex:row];




- (void)viewDidLoad 

[super viewDidLoad];

    uitextfield1.inputView = pickerView; 
uitextfield2.inputView = pickerView;

list = [[NSMutableArray alloc] init];   
[list addObject:@"a"];
[list addObject:@"b"];
    [list addObject:@"c"];  
    [list addObject:@"d"];
    

【问题讨论】:

发生了什么?您的文本字段的文本是否已更改? 在您的代码示例中,选择器行的一个选择将同时更新两个 UITextField。这是故意的,对吧? 不,我想选择每个 UItextfield 并输入彼此独立的选择器数据。我的代码适用于一个文本字段。但是我在上面编码的方式(我知道这是错误的)它用相同的数据更新了两个字段。我希望每个 UITextfield 都有彼此独立的数据。 【参考方案1】:

您需要获取当前的第一响应者并设置其text 属性,而不是显式设置特定的文本字段。

所以,

-(void)pickerView:(UIPickerView *)thePickerview didSelectRow:(NSInteger)row inComponent:      (NSInteger)component 
 
    // textFields is an NSArray holding each of the textfields that are using the picker as an input view
    for (UITextField textField in textFields)
    
        if ([textField isFirstResponder])
        
            textField.text = [list objectAtIndex:row];
            break;
        
        

可能有一种更优雅的方法可以找到当前的第一响应者,这不是我的想法。 textFields 可能是一个 IBOutletCollection,但我自己没有使用过这些,所以我不能有太多权威。

【讨论】:

谢谢,所以我将此添加到我的 M 文件中,我需要对我的 (void)pickerView 代码进行哪些更改? -(BOOL) 接受FirstResponder 返回是; 不,选择器不是第一响应者,您的文本字段是。活动文本字段将向 isFirstResponder 返回 YES。 对不起,让我重新输入我的回复。在我的 M 文件中,我添加了 -(BOOL) acceptFirstResponder return YES;我的问题是如何将我的 -(void)pickerView 指向那个活动的 UITextfield?现在我命名一个特定字段 uitextfield1.text = [list objectAtIndex:row] 我希望它是通用的并加载活动字段。【参考方案2】:

我会这样做:

首先,定义几个不同的选择器。当然,您使用相同的UIPickerView,但您更改了一个有助于区分它们的属性。 (几乎)每个文本字段都有不同的数据。 Apple 专门为此目的设计的一个方便属性是tag,它是每个UIView 都可用的任意整数。您可以将相同的标签分配给UITextFields。

例如:

#define kFirstTextField 101
#define kSecondTextField 102
#define kThirdTextField 103
//... etc

在文本框被触摸时的方法中:

[myPickerView setHidden:NO];  // or however you show the picker
[myPickerView setTag:textField.tag];
[myPickerView reloadAllComponents];

在picker的数据方法中:

-(NSString *)pickerView:(UIPickerView *)thePickerview 
            titleForRow:(NSInteger)row  
           forComponent:(NSInteger)component 

    if (thePickerView.tag==kFirstTextField) 
         return [list1 count]; 
    if (thePickerView.tag==kSecondTextField) 
         return [anotherOrTheSameList count]; 
// of course, you can also use a switch statement
    return [defaultList count];

titleForRow: 方法中做类似的事情。 最后,当某物被挑选出来时,再次通过标签进行区分:

-(void)   pickerView:(UIPickerView *)thePickerview 
        didSelectRow:(NSInteger)row 
         inComponent:(NSInteger)component 
 
    UITextField *field = (UITextField *) [thePickerview.superview viewWithTag:thePickerview.tag];   
// this assumes the UIPickerView is the subview of the same view as the UITextFields
    if (thePickerview.tag==kFirstTextField) 
         field.text = [list1 objectAtIndex:row]; 
    if (thePickerview.tag==kSecondTextField)
         field.text = [anotherOrTheSameList objectAtIndex:row]; 
    // etc.
    // alternatively:
    field.text = [self pickerView:thePickerview titleForRow:row forComponent:0];

【讨论】:

我的天哪……你到底是从哪里得到这些想法的……太棒了。谢谢@Mundi :)

以上是关于UIpickerView 在同一个 ScrollView 中填充多个 uitextFields的主要内容,如果未能解决你的问题,请参考以下文章

UIPickerView - 循环数据

如何在级联中设置 UIPickerView

UIPickerView 抖动

如何在 UIPickerview 中添加一行

无法在同一个控制器中使用两个 UIPickerView

UIPickerView 显示问题