2014-09-30 4 views
7

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

я временно решил проблему, установив UITextField «s UIKeyboardType от 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. См. «Дата рождения» для месяца и дня.)

+0

У меня есть причина подозревать, что это та же причина для помех от установленных пользовательских клавиатур, таких как Swype. См. Http://stackoverflow.com/q/26020956/650365 – Maple

+0

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

ответ

0

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

+0

Не исправлено. Это ошибка, из-за которой iOS не скрывает inputView в 8.1. Он должен быть скрыт точно так же, как в 8.0 и 8.0.1 –

+0

@EthicalPaul Здесь есть немного конфликта использования. С одной стороны, inputView, который функционирует как клавиатура, должен быть переопределен при подключении аппаратной клавиатуры. С другой стороны, входные элементы, которые не работают в качестве клавиатур (например, собственные месячные списки выбора Apple в различных приложениях), не должны быть скрыты. Пока Input Engineering не добавит флаг, чтобы разработчик мог указать, что является предпочтительным, исправление/ошибка 8.1, по крайней мере, позволяет получить доступ ко всем функциям с компромиссом с небольшим раздражением при использовании группы 1. (TL; DR - Не все входные элементы эквивалентны клавиатурам, но некоторые из них). – Maple