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
下面是UIPickerViewDataSource
和UIPickerViewDelegate
方法:
- (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;
}
}
如果您发现任何困难或您想要的任何额外功能,请告诉我!
我正在将项目从 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
下面是UIPickerViewDataSource
和UIPickerViewDelegate
方法:
- (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;
}
}
如果您发现任何困难或您想要的任何额外功能,请告诉我!