Есть ли способ предотвратить отклонение клавиатуры?
Я понимаю, что это обратное к большинству сообщений, но я бы хотел, чтобы клавиатура оставалась , даже если нажата клавиша "клавиатура вниз" .
В частности, у меня есть представление с двумя UITextField
s. С помощью следующего метода делегата
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
return NO;
}
Я могу держать клавиатуру вверх, даже если пользователь нажимает кнопку Done
на клавиатуре или нажимает где-нибудь еще на экране EXCEPT для этой надоедливой кнопки вниз клавиатуры в нижней правой части клавиатуры.
Я использую это представление как модальное представление (хотя представление связано с ViewController, который попадает в UINavigationController), поэтому он действительно лучше всего работает с точки зрения пользователя, чтобы поддерживать клавиатуру все время. Если кто-то знает, как этого добиться, сообщите мне! Спасибо!
ОБНОВЛЕНИЕ По-прежнему нет решения! Когда нажата кнопка Done
, она запускает textFieldShouldReturn
, но когда нажата кнопка Dismiss
, она вызывает textFieldDidEndEditing
. Я не могу заблокировать textField
от завершения редактирования, или никогда не удаляется. Так или иначе, я действительно хочу иметь метод, который обнаруживает кнопку Dismiss
и игнорирует ее. Если вы знаете способ, пожалуйста, просветите меня!
Ответы
Ответ 1
Есть способ сделать это.. UIKeyboard
subclasses 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
. Кроме того, я не занимался управлением mem на myWindow
. Поэтому подумайте над этим.
Ответ 2
Я думаю, что нашел хорошее решение.
Добавьте переменную экземпляра 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 заранее. Если нажать кнопку "Отключить клавиатуру", это не произойдет. Флаг reset после того, как текстовое поле получило фокус.
Ответ 3
Старое не идеальное решение
Я могу думать только о не идеальном решении. Прослушайте уведомление UIKeyboardDidHideNotification
и снова создайте текстовые поля. Это переместит клавиатуру с глаз долой и обратно. Вы можете сохранить запись о том, какое текстовое поле было последним первым ответчиком, выслушав UIKeyboardWillHideNotification и сосредоточив внимание на файле didHide.
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardDidHide:)
name:UIKeyboardDidHideNotification
object:nil];
...
- (void)keyboardDidHide:(id)sender
{
[myTextField becomeFirstResponder];
}
Ответ 4
Для iOS 9/10 и Swift 3 используйте это, чтобы создать прямоугольник, который перекрывает "Скрыть клавиатуру" - Кнопка
override func viewDidLoad() {
NotificationCenter.default.addObserver(self, selector: #selector(coverKey), name: .UIKeyboardDidShow, object: nil)
}
func coverKey() {
if let keyboardWindow = UIApplication.shared.windows.last {
let r = UIScreen.main.bounds
let myWindow = UIWindow.init(frame: CGRect(x: r.size.width - 50 , y: r.size.height - 50, width: 50, height: 50))
myWindow.backgroundColor = UIColor.clear
myWindow.isHidden = false
keyboardWindow.addSubview(myWindow)
keyboardWindow.bringSubview(toFront: myWindow)
}
}
Обратите внимание, что это добавляет дополнительный вид в окно клавиатуры вместо основного окна
Ответ 5
Попробуйте добавить пользовательский стиль поверх кнопки закрытия клавиатуры, чтобы пользователь не смог ввести кнопку увольнения. Я использовал этот метод в одном из своих приложений.
- (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];
}
}
}
Ответ 6
Попробуйте это...
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField{
return NO;
}
Вы можете использовать уведомление, упомянутое Ником Уивером.