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