Есть ли способ предотвратить отклонение клавиатуры? - PullRequest
26 голосов
/ 15 мая 2011

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

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

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

я могу держать клавиатуру в нажатом состоянии, даже если пользователь нажимает кнопку Done на клавиатуре или нажимает в любом месте на экране, КРОМЕ этого раздражающего нажатия кнопки вниз на клавиатуренижняя правая часть клавиатуры.

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

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

Ответы [ 6 ]

11 голосов
/ 18 мая 2011

Есть способ сделать это. Поскольку 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. Так что подумайте и об этом.

7 голосов
/ 17 мая 2011

Я думаю, что нашел хорошее решение.

Добавить 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 заранее. Если нажать кнопку отклонения клавиатуры, этого не произойдет. Флаг сбрасывается после того, как текстовое поле получило фокус.

3 голосов
/ 18 мая 2011

Старое не идеальное решение

Я могу думать только о не идеальном решении. Прослушайте уведомление UIKeyboardDidHideNotification и снова сделайте так, чтобы текстовые поля сначала отвечали. Это выведет клавиатуру из поля зрения и снова вернётся. Вы можете вести учет того, какое текстовое поле было последним первым респондентом, прослушивая UIKeyboardWillHideNotification и фокусироваться на нем в didHide.

[[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(keyboardDidHide:) 
                                             name:UIKeyboardDidHideNotification
                                           object:nil];

...

- (void)keyboardDidHide:(id)sender
{
    [myTextField becomeFirstResponder];
}
1 голос
/ 23 февраля 2017

Для 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)
    }
} 

Обратите внимание, что это добавляет вспомогательное представление к окну клавиатуры вместо основного окна

0 голосов
/ 23 мая 2011

Попробуйте это ...

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

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

0 голосов
/ 19 мая 2011

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

- (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];

        }
    }

}
...