How to make a UITableView scroll to the text field and also prevent from the hiding by keyboard when text field is selected

Most of us faced some problem with UITextField is hidden by keyboard, I found a solution for my case, I hope it will also help you. My solution as follows. I am expecting that you already have a cell with UITextField. So on preparing the cell just keep the row index into the text field’s tag.

    cell.textField.tag = IndexPath.row;

Create an activeTextField, instance of UITextField with global scope as below:

    @interface EditViewController (){

        UITextField *activeTextField;


So, now you just copy paste my code at the end. And also don’t forget to add UITextFieldDelegate

    #pragma mark - TextField Delegation

    - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{

        activeTextField = textField;

        return YES;

    - (void)textFieldDidEndEditing:(UITextField *)textField{

        activeTextField = nil;


Registers keyboard notifications

    #pragma mark - Keyboard Activity

    - (void)registerForKeyboardNotifications


        [[NSNotificationCenter defaultCenter] addObserver:self


                                                 name:UIKeyboardDidShowNotification object:nil];

        [[NSNotificationCenter defaultCenter] addObserver:self


                                                 name:UIKeyboardWillHideNotification object:nil];


Handles Keyboard Notifications:

Called when the UIKeyboardDidShowNotification is sent.

    - (void)keyboardWasShown:(NSNotification*)aNotification


        NSDictionary* info = [aNotification userInfo];

        CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

        UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0);

        [self.tableView setContentInset:contentInsets];

        [self.tableView setScrollIndicatorInsets:contentInsets];

        NSIndexPath *currentRowIndex = [NSIndexPath indexPathForRow:activeTextField.tag inSection:0];

        [self.tableView scrollToRowAtIndexPath:currentRowIndex atScrollPosition:UITableViewScrollPositionTop animated:YES];


Called when the UIKeyboardWillHideNotification is sent

    - (void)keyboardWillBeHidden:(NSNotification*)aNotification


        UIEdgeInsets contentInsets = UIEdgeInsetsZero;

        [self.tableView setContentInset:contentInsets];

        [self.tableView setScrollIndicatorInsets:contentInsets];


Now one thing is left, Call the registerForKeyboardNotifications method in to ViewDidLoad method as follows:

    - (void)viewDidLoad {

        [super viewDidLoad];

        // Registering keyboard notification

        [self registerForKeyboardNotifications];

        // Your codes here...


You are done, hope your text fields will no longer hidden by the keyboard.