Проблема с изменением размера tableView при нажатии другого представления во время отображения клавиатуры

У меня есть контроллер tableview под контроллером навигации. Некоторые из моих ячеек таблицы содержат текстовые поля, поэтому, когда я нажимаю на них, появляется клавиатура и автоматически изменяет размер (уменьшает) границы моего представления таблицы. Затем границы восстанавливаются, когда клавиатура отключается программно, вызывая resignFirstResponder в моем текстовом поле.

Некоторые из моих ячеек будут помещать новый контроллер представления в стек представления при нажатии, поэтому я сначала отказываюсь от своего текущего текстового поля перед нажатием контроллера представления:

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if (currentEditingTextField != nil) {
    [currentEditingTextField resignFirstResponder];
    currentEditingTextField = nil;
}
return indexPath;

}

Проблема в том, что когда я возвращаюсь к моему табличному представлению, границы табличного представления имеют размер, как если бы клавиатура все еще была там. Я знаю это, потому что индикатор прокрутки достигает только того места, где была клавиатура, а под таблицей есть пустое пространство для просмотра.

Кто-нибудь сталкивался с этим и знает решение? Спасибо


person Rollin_s    schedule 18.01.2010    source источник
comment
Проверьте и посмотрите, нужно ли вам перезагружать табличное представление сразу после того, как вы уйдете в отставку и уберете клавиатуру, и непосредственно перед тем, как вы нажмете новый контроллер представления.   -  person Jordan    schedule 19.01.2010


Ответы (1)


Я была такая же проблема. Я обнаружил, что мне нужно предотвратить вызов [UIView viewWillDisappear:] до того, как клавиатура скроется.

Мои решения для этого.

// useful method, thus I don't need to remember current first responder
@interface UIView (FindAndResignFirstResponder) 
- (BOOL)findAndResignFirstResonder;
@end

// ---

@implementation UIView (FindAndResignFirstResponder)
// http://stackoverflow.com/questions/1823317/how-do-i-legally-get-the-current-first-responder-on-the-screen-on-an-iphone
- (BOOL)findAndResignFirstResonder {
    if (self.isFirstResponder) {
        return [self resignFirstResponder];
    }
    for (UIView *subView in self.subviews) {
        if ([subView findAndResignFirstResonder]) {
            return YES;
        }
    }
    return NO;
}
@end

// ---

@interface MyTableViewController : UITableViewController {

    // some booleans required to track state of keyboard and view
    BOOL hidingKeyboard;
    BOOL viewWillDisappear;
    BOOL viewWillDisappearAnimated;

}

// methods for keyboard event handling
- (void)keyboardWillHide:(id)sender;
- (void)keyboardDidHide:(id)sender;

@end

// ---

@implementation MyTableViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    // adding observer for keyboard events (notifications)
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidHide:) name:UIKeyboardDidHideNotification object:nil];
    hidingKeyboard = NO;
    viewWillDisappear = NO;
}

- (void)viewDidUnload {
    [super viewDidUnload];

    // removing observer
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

- (void)viewWillDisappear:(BOOL)animated {
    // finding and resigning first responder
    [self.view findAndResignFirstResonder];

    if (hidingKeyboard) {
        // if keyboard hide animation in process,
        //   remembering to run [super viewWillDisappear:] after keyboard hides
        viewWillDisappear = YES;
        viewWillDisappearAnimated = animated;
    } else {
        // if there is no keyboard hide animation,
        //   calling super immediately
        [super viewWillDisappear:animated]; 
    }
}

- (void)keyboardWillHide:(id)sender {
    hidingKeyboard = YES;
}

- (void)keyboardDidHide:(id)sender {
    hidingKeyboard = NO;

    if (viewWillDisappear) {
        // calling [super viewWillAppear:] after keyboard hides, if required
        viewWillDisappear = NO;
        [super viewWillAppear:viewWillDisappearAnimated];
    }
}

@end
person Aleksejs Mjaliks    schedule 24.04.2010