Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Keyboard appearing briefly when popping viewcontroller iOS

I'm experimenting an issue with the numeric pad when popping the current UIViewController from the UINavigationController.

In my current UIViewController. I have a few UITextField and a "Save" button in the UINavigationBar. The expected behavior is as follows:

When the user taps "Save", the keyboard must hide and a network operation is performed. In its callback, an UIAlertView is shown. When user dismisses this UIAlertView, a notification raises and the current UIViewController performs

[self.navigationController popViewControllerAnimated:YES];

The thing is, if "Save" is pressed with the keyboard still showing, after performing the popViewControllerAnimated, the keyboard appears briefly and from left to right (as if it was visible in the previous UIViewController).

I've tried

[myTextField resignFirstResponder]

when user taps "Save", when user dismisses the UIAlertView, and even in the

viewWillDisappear 

method. Some other answers suggest using

[self.view endEditing:YES];

but it doesn't work either.

If I could use the regular keyboard it would be trivial to override

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];

    return YES;
}

to hide it when user taps "Return", "Done", etc. But being the numeric pad doesn't allow you to show that "finish" button.

I'd appreciate any help, thank you all for your time

like image 902
LuisSedano Avatar asked Aug 19 '15 12:08

LuisSedano


1 Answers

Try this:

Set the text field delegate and its return type as Done and pad as numeric pad.

  _textField.delegate = self;
_textField.keyboardType = UIKeyboardTypeDecimalPad;
[_textField setReturnKeyType:UIReturnKeyDone];

and now add the buttons to keyboard:

    -(void)addButtonsToKeyboard
{
    UIToolbar* keyboardDoneButtonView = [[UIToolbar alloc] init];
    [keyboardDoneButtonView sizeToFit];


    UIBarButtonItem* doneButton = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Done", nil)
                                                                   style:UIBarButtonItemStyleDone target:self
                                                                  action:@selector(kbDoneAction:)];

    UIBarButtonItem* seperatorItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];


    UIBarButtonItem* cancelButton = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Cancel", nil)
                                                                     style:UIBarButtonItemStylePlain target:self
                                                                    action:@selector(kbCancelAction:)];


    [keyboardDoneButtonView setItems:[NSArray arrayWithObjects:cancelButton,seperatorItem, doneButton, nil]];
    _textField.inputAccessoryView = keyboardDoneButtonView;
}

and to hide the keyboard:

    - (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}

and your Done action method is:

    -(void)kbDoneAction:(id)sender
{
    [_textField resignFirstResponder];
}

and Cancel action method is:

    -(void)kbCancelAction:(id)sender
{
[_textField resignFirstResponder];
    }
like image 197
Teja Nandamuri Avatar answered Oct 28 '22 12:10

Teja Nandamuri