如何解决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的主要内容,如果未能解决你的问题,请参考以下文章

如何解决包冲突问题

如何解决包冲突问题

如何解决ajax跨域问题

MySQL 的 10048问题,如何解决?

如何解决smartgit的冲突问题

如何解决https传输图片的问题