UITextField 上的 UIDatePicker 问题

Posted

技术标签:

【中文标题】UITextField 上的 UIDatePicker 问题【英文标题】:UIDatePicker issue on UITextField(s) 【发布时间】:2014-03-07 11:25:33 【问题描述】:

我正在编写一个 TableViewController,其中包含一个名为 Information 的部分,用户在其中输入 name 、 date 和 description 。我的问题是,当我在日期的文本字段上完成 NSDate 选择器的所有设置后,当我点击描述的文本字段而不是键盘时,我会看到日期选择器并将日期存储在日期的文本字段中。

.h 文件

@interface ViewControllerInfo : UITableViewController <UITableViewDelegate, UITextFieldDelegate>
NSDate *date;
UIActionSheet *dateSheet;


@property (weak, nonatomic) IBOutlet UITextField *scadenza;
@property (weak, nonatomic) IBOutlet UITextField *dateTextField;
@property (nonatomic, retain)NSDate *date;

-(void)setDatario;
-(void)dismissDateSet;
-(void)cancelDate;

.m 文件(仅指出所需的功能):

-(void)setDatario;

dateSheet = [[UIActionSheet alloc] initWithTitle:nil delegate:nil cancelButtonTitle:nil      destructiveButtonTitle:nil otherButtonTitles:nil];

[dateSheet setActionSheetStyle:UIActionSheetStyleBlackTranslucent];

CGRect pickerFrame = CGRectMake(0, 44, 0, 0);

UIDatePicker *datePicker = [[UIDatePicker alloc]initWithFrame:pickerFrame];
[datePicker setDatePickerMode:UIDatePickerModeDate];

[dateSheet addSubview:datePicker];

UIToolbar *controlToolbar = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, dateSheet.bounds.size.width, 44)];

[controlToolbar setBarStyle:UIBarStyleBlack];
[controlToolbar sizeToFit];

UIBarButtonItem *spacer = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];

UIBarButtonItem *setButton = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(dismissDateSet)];

UIBarButtonItem *cancelBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(cancelDate)];

[controlToolbar setItems:[NSArray arrayWithObjects:spacer, setButton, cancelBtn, nil] animated:NO];


[dateSheet addSubview:controlToolbar];

[dateSheet showInView:self.view];

[dateSheet setBounds:CGRectMake(0, 0, 320, 485)];



-(void)cancelDate

[dateSheet dismissWithClickedButtonIndex:0 animated:YES];



-(void)dismissDateSet

NSArray *listofViews = [dateSheet subviews];

for (UIView *subview in listofViews)
    if ([subview isKindOfClass:[UIDatePicker class]])
        self.date = [(UIDatePicker*)subview date];



    [dateSheet dismissWithClickedButtonIndex:0 animated:YES];


NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
[dateFormatter setDateFormat:@"dd/MM/yyyy"];

[dateTextField setText:[dateFormatter stringFromDate:self.date]];



-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField
[self setDatario];
return NO;

我不明白为什么描述的 texfield 也很有趣。 问题是:为什么描述的文本字段与日期选择器匹配?

【问题讨论】:

【参考方案1】:

像这样替换你的 textFieldShouldBeginEditing 方法

-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField

    if (textField == scadenza) 

        return YES;
    
    else if(textField == scadenza)

        [self setDatario];

        return NO;

    
    return YES;

【讨论】:

if (textfield == self.dateTextField) [self setDatario];返回是; else if(textField == self.scadenza) return NO; 这种方式是完美的!非常感谢!【参考方案2】:

更好的是,在文本字段上放置一个与文本字段大小相同的自定义UIButton(不可见)。将文本字段enabled 属性设置为NO,然后在点击按钮时显示选择器。当用户从选择器中选择日期时,更新文本字段中的文本。这样您就不必管理文本字段的delegate。这两种方法我都用过,按钮对用户来说更干净、更流畅。

【讨论】:

以上是关于UITextField 上的 UIDatePicker 问题的主要内容,如果未能解决你的问题,请参考以下文章

将 inputAccessoryView - UIToolBar 上的 UITextField 中的文本镜像到 navigationController.toolbar 上 UITextField 上

单元测试 UITextField 上的操作

UITextField 上的强密码覆盖

UITextField 上的 UITapGestureRecognizer 不再适用于 IOS 7.1

没有看到 UIScrollView 上的 UITextField 时 resignFirstResponder

UITextField上的限制字符会破坏Emojis,只能添加一个不能删除