如何解决uipickerview
Posted
技术标签:
【中文标题】如何解决uipickerview【英文标题】:how to solve uipickerview 【发布时间】:2012-07-30 01:59:51 【问题描述】:我的pickerview 有问题,单击文本字段会显示一个空的uipickerview。我有 3 个文本字段,通过单击每个文本字段,每个文本字段都会有不同的数组。 代码如下:
- (void)viewDidLoad
[super viewDidLoad];
tbMode.inputView = pickerView;
tbWalkDist.inputView = pickerView;
tbRouteOpt.inputView = pickerView;
-(BOOL)textFieldShouldReturn:(UITextField *)textField
[textField resignFirstResponder];
return YES;
-(void)textFieldDidBeginEditing:(UITextField*)textField;
modeArray = [[NSMutableArray alloc] init];
if(textField.tag==1)
[modeArray addObject:@" A "];
[modeArray addObject:@" B "];
pickerView.hidden = NO;
else
if(textField.tag==2)
[modeArray addObject:@" 300 "];
[modeArray addObject:@" 400 "];
[modeArray addObject:@" 500 "];
pickerView.hidden = NO;
else
if(textField.tag==3)
[modeArray addObject:@" cheapest "];
[modeArray addObject:@" fastest "];
pickerView.hidden = NO;
else
pickerView.hidden=YES;
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView;
return 1;
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent: (NSInteger)component
tbMode.text = [modeArray objectAtIndex:row];
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component;
return [modeArray count];
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component;
return [modeArray objectAtIndex:row];
请帮忙!我哪里做错了?是否有可能不调用此方法-(void)textFieldDidBeginEditing:(UITextField*)textField;
?谢谢
edit* 我错过了这 3 行,它们是用于在 viewDidLoad
中调用该方法的每个文本字段的
tbMode.delegate = self;
tbWalkDist.delegate = self;
tbRouteOpt.delegate = self;
但我仍然得到一个空的选择器视图。我怎样才能将这些NSMutableArray
添加到选择器视图中
*添加[pickerView reloadAllComponents];
选择器将显示值:)
【问题讨论】:
你有没有测试过不隐藏在你的viewDidLoad方法中它仍然会出现? 另外,如果你想知道是否达到了某些代码,在里面放一些 NSLog 语句。例如 NSLog(@"我是一行被执行的代码");并观察此消息是否打印在调试控制台中。-(void)textFieldDidBeginEditing:(UITextField*)textField;
没有被调用它必须做什么才能工作?
【参考方案1】:
我在这里看不到您初始化 pickerView ivar 的位置。我可以假设它是在 xib 中创建的吗? 如果是这样,请确保您已连接 iBOutlet 并将其委托和数据源属性设置为“文件所有者”或视图控制器。
如果您在 init 方法中创建选择器,请发布该代码,以便我们查看这些属性是否设置正确。
您还必须将您的控制器设置为 uiTextField 的委托。
此外,如果它们没有在其他地方实现,则您缺少这些必需的协议:
--pickerView:rowHeightForComponent:
--pickerView:widthForComponent:
【讨论】:
是的。我确实将其委托和数据源属性链接到文件所有者。但它仍然显示一个空的pickerview 以及文本字段怎么样。他们也需要委托集。 我通过 Eoin 添加了[pickerView reloadAllComponents]
。选择器显示了正确的数组
但是由于- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent: (NSInteger)component tbMode.text = [modeArray objectAtIndex:row];
,我所有的结果都只显示在第一个文本字段上。我应该怎么做才能将它放在每个文本字段上任何建议?【参考方案2】:
至于您的输出问题,您需要跟踪激活的 uiTextField。添加一个 ivar,
uiTextField *activeField;
在文本字段委托方法中将变量设置为适当的 uiTextField 对象。然后替换,
tbMode.text = [modeArray objectAtIndex:row];
与,
activeField.txt = [modeArray objectAtIndex:row];
像这样设置 ivar:
-(void)textFieldDidBeginEditing:(UITextField*)textField
activeField = textField;
// all the if else logic here
【讨论】:
我添加了示例。只需添加一行。您不需要使用标签,因为您的 textField 将始终是您要保存的对象。【参考方案3】:设置新数据集后尝试[pickerView reloadAllComponents]。
【讨论】:
但是由于- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent: (NSInteger)component tbMode.text = [modeArray objectAtIndex:row];
,我所有的结果都只显示在第一个文本字段上。我应该怎么做才能把它放在每个文本字段上
您是否已将您的视图控制器添加为每个 uitextfield 的委托?并确保标签匹配?以上是关于如何解决uipickerview的主要内容,如果未能解决你的问题,请参考以下文章