UIPickerView & DatePicker 行为异常

UIPickerView & DatePicker behaving abnormally

我正在将项目从 springs 和 struts 转换为故事板。有一个 VC ,其中登录后,用户必须初始化个人资料信息。我有四个字段,分别是姓名、出生日期、性别和城市。在性别和出生日期上,我分别实现了 pickerView 和 DateView,因此在点击文本字段 picker/date 时会显示视图,以便用户可以从中 select。我已将它们固定在屏幕底部,并没有将它们隐藏在情节提要属性的检查器中。这是在代码中手动完成的。

在测试时,我遇到了一些麻烦,因为 datePicker 行为异常,如果在其他任何地方点击它就会出现,而且 pickerView 也没有 select 完成按钮操作上的选项。 pickerView 的委托和数据源已连接。它在 springs 和 struts 中使用相同的代码工作得非常好。我想知道我在这里可能做错了什么,以及是否有一种简单的方法可以用我想要的输出隐藏取消隐藏视图。

这是 showDatePickerView 方法

-(void) showDatePickerView {

if (self.dob != nil) {
    [self.datePickerView setDate:self.dob];
}

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.50];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
self.datePickerView.backgroundColor = [UIColor groupTableViewBackgroundColor];

CGSize iOSDeviceScreenSize = [[UIScreen mainScreen] bounds].size;
//Origin will be screen size - picker height
float origin = iOSDeviceScreenSize.height - 256;
CGRect frame = self.datePickerView.frame;
frame.origin.y = origin;
self.datePickerView.frame = frame;
frame = self.toolBar.frame;
frame.origin.y = origin-44;
self.toolBar.frame = frame;

[UIView commitAnimations];
}

这是 hideDatePickerViewMethod

-(void) hideDatePickerView {
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.50];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];

CGSize iOSDeviceScreenSize = [[UIScreen mainScreen] bounds].size;

CGRect frame = self.datePickerView.frame;
frame.origin.y = iOSDeviceScreenSize.height;
self.datePickerView.frame = frame;
frame = self.toolBar.frame;
frame.origin.y = iOSDeviceScreenSize.height;
self.toolBar.frame = frame;
[self.view setUserInteractionEnabled:YES];
[UIView commitAnimations];
}

像这样我也实现了在textField的委托方法中调用的show pickerView和hide pickerView方法"textFieldShouldBeginEditing"

对于这种情况,让我告诉你一个不同的简单方法:

在界面的pickerView上创建如下:

UIPickerView *pickerView;
UITextField  *activeTextField; //To keep the reference of activeTextField

然后在ViewDidLoad()中写:

pickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 100, self.view.frame.size.width, 200)];
pickerView.dataSource = self;
pickerView.delegate = self;

现在您已经初始化了 pickerView

下面是UIPickerViewDataSourceUIPickerViewDelegate方法:

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
    return 2; //Whatever number of Components you want
}


- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent :(NSInteger)component {

    if (component==0)
    {
        return [YOUR_ARRAY count];
    }
    else
    {
        return [YOUR_ARRAY count];
    }
}

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {

//You can even update your UITextfield if you want or whatever the UIElement you want to update
    //UITextField* nextTextField;

     //if (activeTextField.tag == 301) {

     //} else if(activeTextField.tag == 302)  {

   //}
}



- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{

    switch (component)
    {
        case 0:
            return [YOUR_ARRAY objectAtIndex:row];
            break;
        case 1:
            return [YOUR_ARRAY objectAtIndex:row];
            break;

    }
    return nil;
}

现在在textFieldShouldBeginEditing写:

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {       // return NO to disallow editing. {

activeTextField=textField;
//Now check for which textField you want to show pickerView
if activeTextField == YOUR_TEXTFIELD {

textField.inputView=pickerView;
 }
}

如果您发现任何困难或您想要的任何额外功能,请告诉我!