Подтвердить что ты не робот

Есть ли способ предотвратить отклонение клавиатуры?

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

В частности, у меня есть представление с двумя UITextField s. С помощью следующего метода делегата

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    return NO;
}

Я могу держать клавиатуру вверх, даже если пользователь нажимает кнопку Done на клавиатуре или нажимает где-нибудь еще на экране EXCEPT для этой надоедливой кнопки вниз клавиатуры в нижней правой части клавиатуры.

Я использую это представление как модальное представление (хотя представление связано с ViewController, который попадает в UINavigationController), поэтому он действительно лучше всего работает с точки зрения пользователя, чтобы поддерживать клавиатуру все время. Если кто-то знает, как этого добиться, сообщите мне! Спасибо!

ОБНОВЛЕНИЕ По-прежнему нет решения! Когда нажата кнопка Done, она запускает textFieldShouldReturn, но когда нажата кнопка Dismiss, она вызывает textFieldDidEndEditing. Я не могу заблокировать textField от завершения редактирования, или никогда не удаляется. Так или иначе, я действительно хочу иметь метод, который обнаруживает кнопку Dismiss и игнорирует ее. Если вы знаете способ, пожалуйста, просветите меня!

4b9b3361

Ответ 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;
}

Вы можете использовать уведомление, упомянутое Ником Уивером.