Keyboard loses hiding ability “if I use a UIAlertView”

I’m coding some iPad application, and a strange effect has started to appear.

I use a navigation bar so I can navigate freely through my views. Anyway, in one of these innerviews, I offer the possibility of checking if the user really wants to go back to the main view via an alert view (Just a Yes/no pair of buttons).
Once the user confirms he wants to go back, then I “manually” pop the view, and I navigate to the main view, where the keyboard hides.

  • Custom Alert (UIAlertView) with swift
  • Simple App Delegate method to show an UIAlertController (in Swift)
  • How to make a multiple line, left-aligned UIAlertView?
  • Keep UIAlertView displayed
  • iOS dismiss UIAlertView beforing showing another
  • UIAlertView: Where the cancel button should be?
  • BUT, the thing is virtual keyboard acts weirdly. Inside the “inner view”, the keyboard is visible 90% of the time (It’s normal, there are many UITextFields around). What do I do to hide it whenever I want it to become hidden? I put something like this in the “main viewWillAppear”:

    [self.view endEditing:YES];

    Apparently it hides the keyboard, and when I do:

    [[self navigationController] popToRootViewControllerAnimated:YES]; 

    The iPad navigates back, and then the keyboard disappears. No big deal (the first time).

    But then I decide to reenter the same view, so the keyboard appears, I do some fancy stuff. Then I decide to abort (with my button), I show the same alert view again, and I confirm I want to go back to the main view (just as before). The code is the same, but then, in the main view, the:

    [self.view endEditing:YES];

    line, does nothing, and what is worst, I’ve lost the ability to close the keyboard by code ANYWHERE inside my application, for the whole session.

    Why do I know the UIAlertView has something to do? Because if I change the code inside my “Abort button” from this:

    UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:@"" message:NSLocalizedStringFromTable (@"STR_ABANDON_TEST_WARNING", @"ui_strings", @"") delegate:self cancelButtonTitle:NSLocalizedStringFromTable (@"STR_CANCEL", @"ui_strings", @"") otherButtonTitles:nil] autorelease];
    [alert addButtonWithTitle:NSLocalizedStringFromTable (@"STR_ABANDON", @"ui_strings", @"")];
    [alert show];

    to this:

    [[self navigationController] popToRootViewControllerAnimated:YES];

    (that is, no confirmation for the user, the user just navigates back, whenever the abort button is pressed), then when the main view reaches the “viewWillAppear” function, the hide keyboard code, works. Not only THAT time, but ALL the time until the end of my app session.

    I don’t know if my question is 100% clear, but I’ll be more than glad to add some extra pieces of code here if someone believes he can shed some light to this mistery…


    2 Solutions Collect From Internet About “Keyboard loses hiding ability “if I use a UIAlertView””

    I’ve finally solved my problem. I’m more than sure that I could have done better, but for now, even I still don’t know “what causes the aforementioned behaviour”, I’m more than happy.

    The thing is that if I “popped back” a view, FROM inside the UIAlertView delegate code, iOS thinks it’s something I shouldn’t do, and its internal keyboard management code “becomes out of control”. It’s as if I’m popping back “too soon”, or without having let iOS close whatever keyboard data structures it needed to close.

    So a coworker (aleixventa) gave me a hint: “Why don’t you delay a bit the ‘popback’ code, wrapping it inside a “NSTimer structure”?. And that’s precisely what I did. My ‘pop back’ manual code, is now this:

    NSTimer* testTimer = [NSTimer scheduledTimerWithTimeInterval:.05 target:self selector:@selector(popViewPorTimer) userInfo:nil repeats: NO];

    Having a small function for my popViewPorTimer selector:

    -(void) popViewPorTimer
        [[self navigationController] popViewControllerAnimated:YES];

    And now, no matter how many times the keyboard is dismissed via “Navigation pop back”, it always becomes hidden. YAY!!

    For extra bonus, if someone knows why all this happens, it will be a more than welcome piece of info.

    I love when I “solve my questions” by myself 🙂

    Well, I must have been completely misled, because I’ve removed all traces of [self.view endEditing:YES] and/or resignFirstResponder in ALL my .m files and I’ve discovered 2 things:

    1.- They weren’t doing ANYTHING. Keyboard auto disappears when needed.

    2.- The bug I originally described, is still there.

    So, as far as I know, when I just “press back” in the actual UINavigationBar “Back” button (in any inner view), the view, pops back, and if keyboard was present, it disappears. So far so good.

    Then some other times, I need to simulate a “Back” press button. I do it with:

    [[self navigationController] popViewControllerAnimated:YES];

    It works flawlessly, that is, it just pops back, and if keyboard was present, it disappears.

    BUUUT, if I write this “manual back” action INSIDE some UIAlertView Delegate I also need (where I deal with two Accept/Cancel buttons), this “manual back action” also pops back to the “parent” view (always, that’s OK), but it hides the keyboard ONLY the first time it’s called. Succesive calls to “manual back” via this accept/cancel UIAlertDelegate function, render the “keyboard hiding engine” completely unusable for the rest of the session.

    I’m plain lost.