【问题标题】:IOS Date Picker Like A Popup Keyboard Functionality?IOS 日期选择器像弹出式键盘功能?
【发布时间】:2013-07-27 18:29:47
【问题描述】:

考虑到一个包含 8 个文本字段条目和 4 个日期字段条目的数据输入表单(可滚动视图),是否可以在底部正常显示日期选择器(以及键盘弹出的正常情况),具体取决于用户点击了哪个文本字段?

我想您可以使用代码以模态方式显示日期选择器,但似乎显示日期选择器的方式与调用和显示键盘的方式相同,这将是 SDK 的内置内容,还是我遗漏了什么? (在 nib 编辑器中设置一个属性来告诉视图此文本字段接受日期,并为您提供除各种键盘之外的日期选择器选项)

当声明的日期字段获得焦点时,为什么开发人员没有简单的方法来“弹出”日历或日期选择器,这让我大吃一惊。

您知道的任何示例应用程序或教程可以指向我吗?

【问题讨论】:

    标签: ios forms date datepicker


    【解决方案1】:

    我刚刚研究了同样的问题,虽然网络上充斥着 3rd 方库和棘手的 hack,但实际上有一种非常简单且可能首选的方式来完成您所追求的目标。

    首先,它利用 UITextField inputViewinput accessoryView 属性提供的功能,它们共同提供了无限的自定义可能性。对我来说,问题变成了知道如何构造事物以获得我想要的东西。我建议在这里阅读它们:

    https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/InputViews/InputViews.html

    因此,我首先声明了两个属性:

    @property (nonatomic, strong) UIDatePicker *datePicker;
    @property (nonatomic, strong) UIView *datePickerToolbar;
    

    然后使用以下内容创建它们中的每一个:

    - (UIView*)datePickerToolbar {
    
        if (!_datePickerToolbar) {
    
            UIToolbar *toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
            toolbar.barStyle = UIBarStyleBlack;
    
            UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithTitle:@"Cancel" style:UIBarButtonItemStylePlain target:self action:@selector(datePickerCanceled:)];
            UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(datePickerDone:)];
            UIBarButtonItem *space = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
    
            [toolbar setItems:[NSArray arrayWithObjects:cancelButton, space, doneButton, nil] animated:NO];
    
            _datePickerToolbar = toolbar;
        }
        return _datePickerToolbar;
    }
    
    - (UIDatePicker*)datePicker {
    
        if (!_datePicker) {
    
            UIDatePicker *datePicker = [[UIDatePicker alloc] init];
            datePicker.datePickerMode = UIDatePickerModeDate;
    
            datePicker.date = [NSDate date];
    
           _datePicker = datePicker;
        }
        return _datePicker;
    }
    

    当然,您可以自定义这些视图以满足您的需求。但是,由于这些视图是您自己的,因此您还需要决定工具栏中的每个按钮应如何处理交互。虽然两者都应该关闭“键盘”(通过辞去第一响应者来完成),但在我的情况下,我还希望“完成”按钮将日期输入字段设置为所选日期的格式化字符串:

    - (void)datePickerCanceled:(id)sender {
        // just resign focus and dismiss date picker
        [self.dateOfBirthField resignFirstResponder];
    }
    
    
    - (void)datePickerDone:(id)sender {
    
        NSDate *selectedDate = self.datePicker.date;
    
        // format date into string
        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
        [dateFormatter setDateStyle:NSDateFormatterMediumStyle];
        [dateFormatter setTimeStyle:NSDateFormatterNoStyle];
    
         // format overall string
        NSString *dateString = [dateFormatter stringFromDate:selectedDate];
        self.dateInputField.text = dateString;
    
        [self.dateOfBirthField resignFirstResponder];
    }
    

    之后,触发我们的键盘替换唯一剩下要做的就是将我们的自定义视图分配给我之前提到的那些属性UITextField 属性,我选择在“ViewDidLoad”中执行此操作:

    - (void)viewDidLoad {
        [super viewDidLoad];
    
        self.dateInputField.inputView = self.datePicker;
        self.dateInputField.inputAccessoryView = self.datePickerToolbar;
    }
    

    我希望这就是您想要的。在看到所有内容之后,我确信这是最简单、最易于管理的方法。我也喜欢这种方法,因为它可以很容易地根据不同的输入要求进行修改和重新调整用途。

    在我看来,一颗隐藏的宝石。

    【讨论】:

    • 不起作用。我仍然在UITextField 上看到普通键盘。你的- (UIDatePicker*)datePicker {- (UIView*)datePickerToolbar { 是如何被调用的?
    • @daydreamer 当组件接收到第一响应者时,它们被“调用”,因为它们已被设置为组件的 inputView 和 inputAccessoryView
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-01
    • 1970-01-01
    • 2014-05-21
    • 2017-02-25
    相关资源
    最近更新 更多