我意识到这与大多数帖子相反,但我希望键盘能够保持,即使按下“键盘向下”按钮。
具体来说,我有两个UITextField
的视图。使用以下委托方法
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
return NO;
}
即使用户按下键盘上的Done
按钮或点击屏幕上任何其他位置的按钮,我也可以保持键盘不亮除了键盘右下方那个讨厌的键盘向下按钮。
我正在使用此视图,就像模态视图一样(尽管视图与在UINavigationController中推送的ViewController相关联),因此从用户角度来看,它确实能够始终保持键盘的正常运行。如果有人知道如何实现这一目标,请告诉我!谢谢!
更新仍然没有解决方案!按下Done
后会触发textFieldShouldReturn
,但按下Dismiss
按钮会触发textFieldDidEndEditing
。我无法阻止textField
结束编辑,或从不消失。不知何故,我真的想要一个检测Dismiss
按钮并忽略它的方法。如果你知道一种方法,请赐教!
答案 0 :(得分:11)
有一种方法可以做到这一点。 因为UIKeyboard
子类UIWindow
,唯一足以进入UIKeyboard
}的方式是另一个UIWindow
。
- (void)viewDidLoad {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(coverKey) name:UIKeyboardDidShowNotification object:nil];
[super viewDidLoad];
}
- (void)coverKey {
CGRect r = [[UIScreen mainScreen] bounds];
UIWindow *myWindow = [[UIWindow alloc] initWithFrame:CGRectMake(r.size.width - 50 , r.size.height - 50, 50, 50)];
[myWindow setBackgroundColor:[UIColor clearColor]];
[super.view addSubview:myWindow];
[myWindow makeKeyAndVisible];
}
适用于iPhone应用。没试过用iPad。您可能需要调整myWindow
的大小。另外,我没有对myWindow
进行任何内存管理。所以,也考虑这样做。
答案 1 :(得分:6)
我想我找到了一个很好的解决方案。
添加BOOL作为实例变量,我们称之为shouldBeginCalledBeforeHand
然后实现以下方法:
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
shouldBeginCalledBeforeHand = YES;
return YES;
}
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField
{
return shouldBeginCalledBeforeHand;
}
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
shouldBeginCalledBeforeHand = NO;
}
以及
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
return NO;
}
使用返回按钮防止键盘消失。诀窍是,从一个文本字段到另一个文本字段的焦点切换将事先触发textFieldShouldBeginEditing。如果按下关闭键盘按钮,则不会发生这种情况。在文本字段获得焦点后重置该标志。
答案 2 :(得分:3)
我只能想到一个不完美的解决方案。听取通知UIKeyboardDidHideNotification
并再次制作文本字段的第一响应者。这会使键盘移开视线并再次返回。您可以通过监听UIKeyboardWillHideNotification来记录哪个文本字段是最后一个第一个响应者,并将重点放在didHide中。
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardDidHide:)
name:UIKeyboardDidHideNotification
object:nil];
...
- (void)keyboardDidHide:(id)sender
{
[myTextField becomeFirstResponder];
}
答案 3 :(得分:0)
尝试在键盘关闭按钮顶部添加自定义,以便用户无法选中关闭按钮。我在我的一个应用程序中使用过这种方法。
- (void)addButtonToKeyboard {
// create custom button
UIButton *blockButton = [UIButton buttonWithType:UIButtonTypeCustom];
blockButton.frame = //set the frame here, I don't remember the exact frame
[blockButton setImage:[UIImage imageNamed:@"block_button.png"] forState:UIControlStateNormal];
// locate keyboard view
UIWindow *appWindows = [[[UIApplication sharedApplication] windows] objectAtIndex:1];
UIView *keyboard;
for (int i=0; i<[appWindows.subviews count]; i++) {
keyboard = [appWindows.subviews objectAtIndex:i];
// keyboard found, add the button
if ([[keyboard description] hasPrefix:@"<UIPeripheralHost"] == YES && [self.textField isFirstResponder]) {
[keyboard addSubview:doneButton];
}
}
}
答案 4 :(得分:-3)
试试这个......
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField{
return NO;
}
您可以使用Nick Weaver提到的通知。