我在导航控制器下有一个tableview控制器。我的一些表单元格包含文本字段,因此当我点击它们时,键盘将显示并自动调整(缩小)我的tableview的边界。通过在我的文本字段上调用resignFirstResponder以编程方式解除键盘时,将恢复边界。
我的一些单元格会在点击时将新的视图控制器推入视图堆栈,所以我在推动视图控制器之前首先重新设置当前的文本字段:
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if (currentEditingTextField != nil) {
[currentEditingTextField resignFirstResponder];
currentEditingTextField = nil;
}
return indexPath;
}
问题是当我导航回我的表视图时,tableview的边界大小就像键盘仍在那里一样。我知道这一点,因为滚动指示器只到达键盘所在的正上方,并且在表视图下面有空的视图空间。
有人经历过这个并知道解决方案吗?感谢
答案 0 :(得分: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