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

时间:2011-08-21 17:16:39

标签: iphone objective-c uiscrollview uitextfield uipickerview

您好我正在开发一个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"];
}    

2 个答案:

答案 0 :(得分:2)

您需要掌握当前的第一响应者并设置其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,但我自己没有使用过,所以我不能说话很多。

答案 1 :(得分:2)

我将如何做到这一点:

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

例如:

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

在选择器的数据方法中:

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