#objective-c #ios14
#objective-c #ios14
Вопрос:
iOS 14
введено GCKeyboard
. Я смог успешно подключить a BlueTooth NumberPad
в своем приложении, но мне нужно иметь возможность подключать две из них в тандеме. Не мог бы кто-нибудь указать мне пример кода?
В GCController
классе есть controllers
метод «», который возвращает массив всех подключенных контроллеров, но для него нет ничего подобного GCKeyboard
.
Вот мой код:
- (void)viewDidLoad {
[super viewDidLoad];
[[UIApplication sharedApplication]setIdleTimerDisabled:YES];
// notifications for keyboard (dis)connect
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(keyboardWasConnected:) name:GCKeyboardDidConnectNotification object:nil];
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(keyboardWasDisconnected:) name:GCKeyboardDidDisconnectNotification object:nil];
}
GCKeyboard *leftKeyboard;
GCKeyboard *rightKeyboard;
- (void)keyboardWasConnected:(NSNotification *)notification {
if (!self.leftKeyboard) {
leftKeyboard = (GCKeyboard *)notification.object;
NSLog(@"Left Keyboard connected: %@n", leftKeyboard.description);
NSString *keyboardStatus = [NSString stringWithFormat:@"Left Keyboard CONNECTED:n%@", leftKeyboard.description];
self.statusLabel.text = keyboardStatus;
self.leftKeyboard = leftKeyboard;
[self reactToKeyboardInput];
}
else if (!self.rightKeyboard) {
NSLog(@"Right Keyboard connected: %@n", rightKeyboard.description);
rightKeyboard = (GCKeyboard *)notification.object;
NSString *keyboardStatus = [NSString stringWithFormat:@"Right Keyboard CONNECTED:n%@", rightKeyboard.description];
self.statusLabel.text = keyboardStatus;
self.rightKeyboard = rightKeyboard;
[self reactToKeyboardInput];
}
}
- (void)keyboardWasDisconnected:(NSNotification *)notification {
if (self.leftKeyboard) {
GCKeyboard *keyboard = (GCKeyboard *)notification.object;
NSString *status = [NSString stringWithFormat:@"Left Keyboard DISCONNECTED:n%@", keyboard.description];
self.statusLabel.text = status;
self.leftKeyboard = nil;
}
else if (self.rightKeyboard) {
GCKeyboard *keyboard = (GCKeyboard *)notification.object;
NSString *status = [NSString stringWithFormat:@"Right Keyboard DISCONNECTED:n%@", keyboard.description];
self.statusLabel.text = status;
self.rightKeyboard = nil;
}
}
При подключении клавиатуры или цифровой клавиатуры я получаю сообщение:
2020-09-18 13:09:15.845943-0700 Controller[1653:351628] Left Keyboard connected: GCController 0x280bb8dd0 ('Keyboard' - 0x27c3dc28cec4d818)
Ответ №1:
«Перенесите игры с клавиатуры и мыши на iPad», — говорится в видеозаписи WWDC:
В случае клавиатур вы не можете различать несколько клавиатур, и вместо этого все события клавиатуры с нескольких клавиатур объединяются для вас. Таким образом, хотя вы можете использовать уведомления, чтобы заметить, когда клавиатура отключается, и, возможно, приостановить игру, чтобы запросить другой ввод, в общем, вы обнаружите, что просто с помощью GCKeyboard-Device.coalesced для проверки состояния клавиши, когда значение не равно нулю является правильным путем.
Таким образом, хотя у вас может быть подключено несколько клавиатур, похоже, что все они объединяются в один GCKeyboard
экземпляр, и вы не можете их различить. Вот почему нет никакого [GCKeyboard keyboards]
метода. Вместо этого есть [GCKeyboard coalescedKeyboard]
Комментарии:
1. Спасибо, Зорг. К сожалению, то же самое верно и для мыши. Невозможно определить, подключено ли более одной мыши Bluetooth. Странно то, что GCKeyboard каким-то образом связан с GCController, как видно из свойства GCKeyboard.description «GCController 0x280bb8dd0 (‘Keyboard’ — 0x27c3dc28cec4d818)», а для gcccontroller есть свойство PlayerIndex, для которого можно задать значение GCControllerPlayerIndex1. Интересно, можно ли каким-то образом преобразовать GCKeyboard в gcccontroller, чтобы я мог использовать это свойство. Есть предложения?
2. Мыши не объединяются в соответствии с документацией. Вы должны уметь различать несколько мышей с помощью обработчиков уведомлений или
[GCMouse mice]
. GCKeyboard и GCController являются частью одной и той же платформы и соответствуютGCDevice
протоколу. Их входные свойства являются подклассамиGCPhysicalInputProfile
. GCKeyboard не имеет свойства PlayerIndex, потому что это не имеет особого смысла — на клавиатуре нет такого светодиодного индикатора для отображения индекса проигрывателя.3. Спасибо, что указали [мыши GCMouse], @Zorg. Я попробовал, и он отлично работает для различения нескольких парных мышей, как описано в документации. Что касается [GCKeyboard coalescedKeyboard], мне интересно, есть ли способ получить доступ к исходному коду GCContoller.framework, чтобы я мог изменить GCKeyboard и добавить свойство «клавиатуры» и перекомпилировать его локально. Я знаю, что в большинстве случаев различать клавиатуры не имеет особого смысла, но это имеет смысл для моего приложения:-) Делает ли Apple такие источники общедоступными? Если да, то откуда я могу их загрузить?
4. Нет, это принятие желаемого за действительное. Вы также не можете использовать частные API, если хотите получить одобрение App Store. Вы можете проверить API UIKit для работы с физическими клавиатурами (я там не знаком), если это позволяет их различать. Существует приличная вероятность объединения GCKeyboard из-за else в стеке iOS.