2

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

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

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

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

4

1 回答 1

8

我刚刚研究了同样的问题,虽然网络上充斥着 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;
}

我希望这就是你要找的。在看到所有内容之后,我确信这是最简单、最易于管理的方法。我也喜欢这种方法,因为它可以很容易地修改和重新利用,以满足不同的输入要求。

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

于 2014-08-02T22:47:00.150 回答