键盘无法从UITextField显示

时间:2013-03-19 14:03:50

标签: iphone ios objective-c uitextfield

我遇到一个间歇性的问题,键盘不会显示在UITextField上。

大多数时候都会发生,但不是每次都发生。

我真的无法确定导致它的动作。

我已订阅UIKeyboardDidShowNotification,其中的通知用户数据为:

    0x15581730 {name = UIKeyboardDidShowNotification; userInfo = {
    UIKeyboardAnimationCurveUserInfoKey = 0;
    UIKeyboardAnimationDurationUserInfoKey = "0.25";
    UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {320, 0}}";
    UIKeyboardCenterBeginUserInfoKey = "NSPoint: {160, 568}";
    UIKeyboardCenterEndUserInfoKey = "NSPoint: {160, 568}";
    UIKeyboardFrameBeginUserInfoKey = "NSRect: {{inf, inf}, {0, 0}}";
    UIKeyboardFrameChangedByUserInteraction = 0;
    UIKeyboardFrameEndUserInfoKey = "NSRect: {{inf, inf}, {0, 0}}";
    }}

NSRect: {{inf, inf}, {0, 0}}似乎是个问题,因为当键盘显示时,这两个值是有效的。

该应用非常标准。这是一个导航堆栈,这发生在一个视图控制器上,堆栈中有4个级别。所有文本字段委托都已设置,我看不到有关视图或控制器的任何其他奇怪的内容。

有没有人见过这个?

3 个答案:

答案 0 :(得分:4)

你还记得有关你的应用的任何细节吗?我认为它可能与iOS 6的方向API更改有关。我遇到了同样的问题,并且遇到了一些不直观的定向行为。

具体来说,我的应用程序指定UIInterfaceOrientationMaskPortraitUp作为Info.plist和根UIViewController的supportedInterfaceOrientations:实现中唯一允许的方向。我还从我的根UIViewController一直返回NO shouldAutorotate。我正在使用UIDevice的方向来确定如何呈现我的孩子UIViewControllers并使用所呈现的UIViewController类型和UIDeviceOrientation设置状态栏方向。

这导致了相当简单但在iPad(这是一款iPhone应用程序)上,当从面向风景的启动板启动时,呈现的UIViewController(和状态栏)将垂直于窗框定向,并且不会旋转回来

它还在iPhone 3GS上引起了一些非常奇怪的间歇性方向/窗口框架错误,其中RootViewController的框架被赋予了比设备更大的愚蠢尺寸。

我改变了什么(在我的根UIViewController中):

- (BOOL)shouldAutorotate
{
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

- (BOOL)shouldAutomaticallyForwardRotationMethods
{
    return NO;
}

我也不再使用设备方向来确定正确的方向,仅依赖于呈现的UIViewController类(由导航决定)。这有解决直接的iPad方向错误的预期效果,但我没有看到奇怪的间歇性错误或你也遇到的键盘错误的实例。

答案 1 :(得分:0)

您是否在iOS 5.x模拟器上使用DCIntrospect?我遇到了同样的问题,发现错误的UIKeyboardFrameBeginUserInfoKey值是由DCIntrospect引起的。 DCIntrospect可能会在收到UIKeyboardWillHideNotification通知时尝试更改第一响应者。见代码:

- (void)takeFirstResponder
{
    if (![self.inputTextView becomeFirstResponder])
        NSLog(@"DCIntrospect: Couldn't reclaim keyboard input.  Is the keyboard used elsewhere?");
}

通常,我们不应该在发布版本上启用DCIntrospect。所以最终用户不应该遇到这个问题。

答案 2 :(得分:-1)

设置

@interface UIController : UIViewController<UITextFieldDelegate>

并将数据委托从Xib分配给您的UITextfield。