Не позволяйте аппаратной (Bluetooth) клавиатуре переопределять inputView в iOS 8

У меня есть UITextField, который использует пользовательский UIPickerView в своем inputView, чтобы ограничить пользователя несколькими параметрами, функционирующими аналогично раскрывающемуся списку. При использовании с аппаратной клавиатурой, подключенной через Bluetooth, аппаратная клавиатура переопределяет (и скрывает) мой inputView. Однако связанный inputAccessoryView остается. Когда я нажимаю кнопку «клавиатура» на моей аппаратной клавиатуре (которая обычно отображает экранную клавиатуру по умолчанию для ванильной UITextField), все работает так, как ожидалось. (Под этим я подразумеваю, что мой inputView снова виден.) В предыдущей версии iOS (т.е. 7 и ниже) inputView всегда отображался при вызове.

Я временно решил проблему, заменив UIKeyboardType UITextField с UIKeyboardTypeDefault на UIKeyboardTypeTwitter, но это будет работать только в том случае, если аппаратная клавиатура не распознается как клавиатура по умолчанию для этого конкретного UIKeyboardType. Код pickerTextField.keyboardType = UIKeyboardTypeTwitter; (см. примерно 2/3 кода ниже). При дальнейшем тестировании это частичное решение не так полезно, как кажется.

Как правильно отображать inputView во всех ситуациях при использовании аппаратной клавиатуры?

Соответствующий фрагмент кода:

-(int)setUpPickerWheelAtXLoc:(int)xLoc andYLoc:(int)yLoc {

    int qwidth = width - (xLoc - FORMBORDERLEFT);

    // Set up inputView (pickerView) to replace the keyboard
    self.pickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(xLoc, yLoc, qwidth, height)];
    self.pickerView.delegate = self;
    self.pickerView.dataSource = self;

    self.pickerTextField = [[UITextField alloc] initWithFrame:CGRectMake(xLoc, yLoc, qwidth, 32)];
    self.pickerTextField.delegate = self;

    pickerTextField.borderStyle = UITextBorderStyleRoundedRect;
    pickerTextField.layer.borderWidth = 0.3f;
    pickerTextField.layer.borderColor = [[UIColor blackColor] CGColor];
    pickerTextField.textColor = [UIColor blackColor];
    pickerTextField.font = [UIFont systemFontOfSize:XXLARGEFONTSIZE];
    pickerTextField.placeholder = @"Tap to choose from list...";

    // Add pickerView as inputView
    pickerTextField.inputView = self.pickerView;

    pickerTextField.keyboardType = UIKeyboardTypeTwitter; // Suggested temporary solution

    // Setup inputAccessoryView (Done button)
    UIButton *doneButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [doneButton addTarget:self action:@selector(pickerDoneButtonPressed) forControlEvents:UIControlEventTouchUpInside];
    [doneButton setTitle:@"Done" forState:UIControlStateNormal];
    doneButton.titleLabel.font = [UIFont systemFontOfSize:XXLARGEFONTSIZE];
    doneButton.frame = CGRectMake(0,0,100,44);
    [doneButton setContentHorizontalAlignment:UIControlContentHorizontalAlignmentRight];
    doneButton.contentEdgeInsets = UIEdgeInsetsMake(0,0,0,20);
    doneButton.backgroundColor = [UIColor lightGrayColor];

    pickerTextField.inputAccessoryView = doneButton;
    return xLoc + qwidth;
}

Дополнительная информация. Проверив несколько других мест, я подтвердил, что это происходит как минимум в одном продукте Apple. (В приложении/странице «Создать новый Apple ID» на iPhone 6 в версии 8.0.2. См. окна выбора даты рождения для месяца и дня.)


person Maple    schedule 30.09.2014    source источник
comment
У меня есть основания подозревать, что это та же самая причина помех от установленных пользовательских клавиатур, таких как Swype. См. stackoverflow.com/q/26020956/650365.   -  person Maple    schedule 30.09.2014
comment
Я также хотел бы найти решение для этого. Пользовательские представления ввода должны отображаться независимо от наличия аппаратной клавиатуры.   -  person albertamg    schedule 14.10.2014


Ответы (1)


Проблема была исправлена ​​Apple в обновлении iOS 8.1.

person Maple    schedule 21.10.2014
comment
Не фиксированный. Это ошибка, из-за которой iOS не скрывает inputView в 8.1. Он должен быть скрыт так же, как в 8.0 и 8.0.1. - person Paul Bruneau; 17.11.2014
comment
@EthicalPaul Здесь есть небольшой конфликт использования. С одной стороны, inputView, функционирующий как клавиатура, должен быть переопределен при подключении аппаратной клавиатуры. С другой стороны, inputViews, которые не работают как клавиатуры (например, собственные средства выбора месяца Apple в различных приложениях), не должны быть скрыты. До тех пор, пока инженеры ввода не добавят флаг, позволяющий разработчику указать, какой из них предпочтительнее, исправление/ошибка 8.1, по крайней мере, позволяет получить доступ ко всем функциям с небольшим неудобством при использовании группы 1. (TL;DR — не все inputViews эквивалентны клавиатурам, но некоторые из них.) - person Maple; 17.11.2014