Fix compatibility with `SwiftUI.focused()`

Fixes #76
This commit is contained in:
Sindre Sorhus 2022-05-03 15:53:51 +07:00
parent 6cfee79adf
commit dbf30494b4
3 changed files with 26 additions and 5 deletions

View File

@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
objectVersion = 54;
objectVersion = 55;
objects = {
/* Begin PBXBuildFile section */
@ -127,7 +127,7 @@
};
};
buildConfigurationList = E36FB9412609BA43004272D9 /* Build configuration list for PBXProject "KeyboardShortcutsExample" */;
compatibilityVersion = "Xcode 12.0";
compatibilityVersion = "Xcode 13.0";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
@ -222,7 +222,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 12.0;
MACOSX_DEPLOYMENT_TARGET = 12.3;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
@ -277,7 +277,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 12.0;
MACOSX_DEPLOYMENT_TARGET = 12.3;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
SDKROOT = macosx;

View File

@ -9,16 +9,24 @@ extension KeyboardShortcuts.Name {
}
private struct DynamicShortcutRecorder: View {
@FocusState private var isFocused: Bool
@Binding var name: KeyboardShortcuts.Name
@Binding var isPressed: Bool
var body: some View {
HStack(alignment: .firstTextBaseline) {
KeyboardShortcuts.Recorder(for: name)
.focused($isFocused)
.padding(.trailing, 10)
Text("Pressed? \(isPressed ? "👍" : "👎")")
.frame(width: 100, alignment: .leading)
}
.onChange(of: name) { _ in
DispatchQueue.main.async {
isFocused = true
}
}
}
}

View File

@ -30,6 +30,7 @@ extension KeyboardShortcuts {
private var eventMonitor: LocalEventMonitor?
private let onChange: ((_ shortcut: Shortcut?) -> Void)?
private var observer: NSObjectProtocol?
private var canBecomeKey = false
/**
The shortcut name for the recorder.
@ -52,7 +53,7 @@ extension KeyboardShortcuts {
}
/// :nodoc:
override public var canBecomeKeyView: Bool { false }
override public var canBecomeKeyView: Bool { canBecomeKey }
/// :nodoc:
override public var intrinsicContentSize: CGSize {
@ -149,6 +150,18 @@ extension KeyboardShortcuts {
KeyboardShortcuts.isPaused = false
}
// Prevent the control from receiving the initial focus.
/// :nodoc:
override public func viewDidMoveToWindow() {
guard window != nil else {
return
}
DispatchQueue.main.async { [self] in
canBecomeKey = true
}
}
/// :nodoc:
override public func becomeFirstResponder() -> Bool {
let shouldBecomeFirstResponder = super.becomeFirstResponder()