添加子视图时iOS奇怪的键盘隐藏行为

Posted

技术标签:

【中文标题】添加子视图时iOS奇怪的键盘隐藏行为【英文标题】:iOS strange keyboard-hiding behavior when adding a subview 【发布时间】:2013-04-19 09:43:41 【问题描述】:

我有一个带有UITextField 的视图,并且需要在按下按钮时显示UIDatePicker(它隐藏在键盘下方)。

我正在懒惰地实例化日期选择器,因为这使我可以更快地显示视图。

这是与点击按钮相关的代码:

- (IBAction)hideKeyboard 
    if (!self.datePicker) 
        // UIDatePicker allocation and initialization
        self.datePicker = ...
        ...
        [self.view addSubview:self.datePicker];
    
    [self.textField resignFirstResponder];

这会干扰键盘隐藏动画。实际上根本没有动画。

我得到的另一个线索是,这不会发生在模拟器上,而只会发生在实际设备(iPhone 4S)上。

我该如何解决这个问题?

编辑

将 datePicker 设置为 textField 的 inputView 并不能解决我的问题。

【问题讨论】:

我已经更新了我的答案 【参考方案1】:

我可以向您推荐另一种解决方案,然后隐藏键盘并使用按钮显示日期选择器。

如果我理解正确,您希望在用户点击文本字段时显示日期选择器,然后您可以在文本字段中设置日期。

UITextField 有一个属性

@property (readwrite, retain) UIView *inputView

如果您将 inputView 属性设置为日期选择器,则文本字段将显示日期选择器而不是键盘(甚至像键盘一样动画)。

当然,这些值需要您自己获取并设置为文本字段。

编辑原因:问题已编辑

我不知道为什么将日期选择器设置为输入视图没有帮助。无论如何,如果您不希望显示键盘并通过添加子视图来显示日期选择器,您可以使用 UITextField 的以下委托方法

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField

实现委托方法。在该方法中,只需将 pickerview 作为子视图添加到您的视图中并返回 NO 以不显示键盘。

编辑原因:推荐

你有什么理由不使用文本字段吗?如果不是,我会使用它,因为它使一切变得更容易。如果您出于某种原因想使用 UILabel,那么您可以观看键盘通知。键盘什么时候消失,然后显示日期选择器。

关于键盘通知,请参考这里,用示例代码很好地解释,UIKeyboardDidHideNotification 应该可以帮助你

http://developer.apple.com/library/ios/#documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html

【讨论】:

不知道这个!这不是我想要的,但也许它可以更好地解决问题。 datePicker 不会修改 textField 的值(而是标签(我的选择)),这就是 inputView 方法没有帮助的原因【参考方案2】:

很简单:

只需添加一个日期选择器对象作为文本字段的输入值。无需显示/隐藏键盘。

UIDatePicker *datePicker = [[UIDatePicker alloc] init];
NSCalendar *calendar = [[NSCalendar alloc]initWithCalendarIdentifier:NSGregorianCalendar] ;
NSDate *currentDate = [NSDate date];
NSDateComponents *comps = [[NSDateComponents alloc] init] ;
[comps setYear:anyInteger];
NSDate *maximumDate = [calendar dateByAddingComponents:comps toDate:currentDate options:0];
[comps setYear:anyInteger;
NSDate *minimumDate = [calendar dateByAddingComponents:comps toDate:currentDate options:0];
[datePicker setMaximumDate:maximumDate];
[datePicker setMinimumDate:minimumDate];
datePicker.datePickerMode = UIDatePickerModeDate;
textField.inputView = datePicker;

【讨论】:

以上是关于添加子视图时iOS奇怪的键盘隐藏行为的主要内容,如果未能解决你的问题,请参考以下文章

输入附件视图行为异常与键盘隐藏和显示事件

UITextView在输入时隐藏文本

将 UIScrollView 滚动到键盘隐藏的 UITextView 中的奇怪行为

一些显示/隐藏循环后,形式中的选轮器消失

iOS导航栏在滚动时被隐藏(也是一种滚动),无论它在滚动视图之外

键盘隐藏视图(AutoLayout + StoryBoard)