Просмотр исходного кода

Fix crash on calling _keyCode on events from the simulator keyboard

Ryan Olson лет назад: 10
Родитель
Сommit
24985ac984
1 измененных файлов с 13 добавлено и 12 удалено
  1. 13 12
      Classes/Utility/FLEXKeyboardShortcutManager.m

+ 13 - 12
Classes/Utility/FLEXKeyboardShortcutManager.m

@@ -220,7 +220,6 @@ static const long kFLEXCommandKeyCode = 0xe3;
     NSString *unmodifiedInput = nil;
     UIKeyModifierFlags flags = 0;
     BOOL isKeyDown = NO;
-    long keyCode = 0;
     
     if ([event respondsToSelector:@selector(_modifiedInput)]) {
         modifiedInput = [event _modifiedInput];
@@ -238,17 +237,14 @@ static const long kFLEXCommandKeyCode = 0xe3;
         isKeyDown = [event _isKeyDown];
     }
     
-    if ([event respondsToSelector:@selector(_keyCode)]) {
-        keyCode = [event _keyCode];
-    }
-    
     BOOL interactionEnabled = ![[UIApplication sharedApplication] isIgnoringInteractionEvents];
-    
+    BOOL hasFirstResponder = NO;
     if (isKeyDown && [modifiedInput length] > 0 && interactionEnabled) {
         UIResponder *firstResponder = nil;
         for (UIWindow *window in [FLEXUtility allWindows]) {
             firstResponder = [window valueForKey:@"firstResponder"];
             if (firstResponder) {
+                hasFirstResponder = YES;
                 break;
             }
         }
@@ -279,12 +275,17 @@ static const long kFLEXCommandKeyCode = 0xe3;
         }
     }
     
-    if (keyCode == kFLEXControlKeyCode) {
-        self.pressingControl = isKeyDown;
-    } else if (keyCode == kFLEXCommandKeyCode) {
-        self.pressingCommand = isKeyDown;
-    } else if (keyCode == kFLEXShiftKeyCode) {
-        self.pressingShift = isKeyDown;
+    // Calling _keyCode on events from the simulator keyboard will crash.
+    // It is only safe to call _keyCode when there's not an active responder.
+    if (!hasFirstResponder && [event respondsToSelector:@selector(_keyCode)]) {
+        long keyCode = [event _keyCode];
+        if (keyCode == kFLEXControlKeyCode) {
+            self.pressingControl = isKeyDown;
+        } else if (keyCode == kFLEXCommandKeyCode) {
+            self.pressingCommand = isKeyDown;
+        } else if (keyCode == kFLEXShiftKeyCode) {
+            self.pressingShift = isKeyDown;
+        }
     }
 }