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
都可用的任意整数。您可以将相同的标签分配给UITextField
s。
例如:
#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的主要内容,如果未能解决你的问题,请参考以下文章