There's no such thing... 'bio'. As a developer I'd describe myself to be even far beyond an amateur or beginner. Auto-didactically started coding in Swift in late 2017. HTML/CSS since 2002 though.
As a beginner I must say that this is a great and in depth tutorial, Very nice! But...
"register:sender needs to be connected with the shortcut button.
unregister:sender needs to be connected to the clear shortcut button.
clearButton property needs to be connected to the clear shortcut button.
shortcutButton needs to be connected to the shortcut button."
Sorry but... what? :D
There's one button and there's one text field. Can't figure out which to connect with which action/outlet because you're calling them all "button"
There's screenshots for all things but this one. Would be incredibly great to know what I'm doing wrong.
Sorry for the confusion. There's a mistake in the tutorial. Instead of using a text field and a button I'd recommend two buttons. One is the clear button, and the other is the "set" button.
You may also wish to set default text on the set button so the user knows to click it. You can do that from the storyboard title button property, as well as updating the unregister method
There's no such thing... 'bio'. As a developer I'd describe myself to be even far beyond an amateur or beginner. Auto-didactically started coding in Swift in late 2017. HTML/CSS since 2002 though.
thank you for your reply which explained a lot and now all makes sense, haha :D
If I may grab another minute off you:
How would you go on if there was no MainWindow? I have an existing app and I have the MainStoryboard wired to a ViewController. Like this: thepracticaldev.s3.amazonaws.com/i...
I want this one to pop up when hitting the shortcut. I've tried a few things but nothing worked so far :-/
There's no such thing... 'bio'. As a developer I'd describe myself to be even far beyond an amateur or beginner. Auto-didactically started coding in Swift in late 2017. HTML/CSS since 2002 though.
Once again: thank you! I guess I'm coming closer to that goal, hehe. Indeed it's a menu bar app. I ran through a "Swift on sundays" session by Paul Hudson and that's why there's a lot of stuff in the AppDelegate.swift and I don't know exactly how to merge both your code and the code that's already there.
Is the settings window supposed to be a popover as well? Or is that just a separate window that opens when the setting button is clicked?
I would try
1) Adding a popover instance to the AppDelegate
2) Add the main view controller instance to the new popover in the applicationDidFinishLaunching method
Something like this (This is untested!)
importCocoaimportHotKeyimportCarbon@NSApplicationMainclassAppDelegate:NSObject,NSApplicationDelegate{letstatusItem=NSStatusBar.system.statusItem(withLength:NSStatusItem.variableLength)// Add mainPopover and eventMonitor as an instance variableletmainPopoverView=NSPopover()vareventMonitor:EventMonitor?funcapplicationDidFinishLaunching(_aNotification:Notification){ifStorage.fileExists("globalKeybind.json",in:.documents){letglobalKeybinds=Storage.retrieve("globalKeybind.json",from:.documents,as:GlobalKeybindPreferences.self)hotKey=HotKey(keyCombo:KeyCombo(carbonKeyCode:globalKeybinds.keyCode,carbonModifiers:globalKeybinds.carbonFlags))}statusItem.button?.title="⅀"statusItem.button?.target=selfstatusItem.button?.action=#selector(showSettings)// Fresh controller instance - use your view controller heremainPopoverView.contentViewController=MenuViewController.freshController()// Check if mouse is clicked outside of menu - if it is then close the popover (optional)eventMonitor=EventMonitor(mask:[.leftMouseDown,.rightMouseDown]){[weakself]eventinifletstrongSelf=self,strongSelf.mainPopoverView.isShown{print("is shown")strongSelf.closePopover(sender:event)}}}funcapplicationWillTerminate(_aNotification:Notification){// Insert code here to tear down your application}// Add in the toggling methods@objcfunctogglePopover(_sender:Any?){ifmainPopoverView.isShown{closePopover(sender:sender)}else{showPopover(sender:sender)}}funcshowPopover(sender:Any?){ifletbutton=statusItem.button{mainPopoverView.show(relativeTo:button.bounds,of:button,preferredEdge:NSRectEdge.minY)}eventMonitor?.start()}funcclosePopover(sender:Any?){mainPopoverView.performClose(sender)eventMonitor?.stop()}@objcfuncshowSettings(){letstoryboard=NSStoryboard(name:"Main",bundle:nil)guardletvc=storyboard.instantiateController(withIdentifier:"ViewController")as?NSViewControllerelse{fatalError("ViewController in Storyboard nicht gefunden.")}guardletbutton=statusItem.buttonelse{fatalError("Button des Status-Items konnte nicht gefunden werden")}letpopoverView=NSPopover()popoverView.contentViewController=vcpopoverView.behavior=.transientpopoverView.show(relativeTo:button.bounds,of:button,preferredEdge:.maxY)}publicvarhotKey:HotKey?{didSet{guardlethotKey=hotKeyelse{return}// Toggle popover hotKey.keyDownHandler={[weakself]inifletstrongSelf=self{strongSelf.togglePopover(nil)}}}}}
Mildly related, I recommend reading this Ray Wenderlich tutorial on menu bar apps, it helped me understand them better - raywenderlich.com/450-menus-and-po...
I'm a bit new to Xcode and swift and I got the hotels working for bringing the window up... But it's doesn't seem to works for the caps lock button.. It'll decide the caps lock button when setting it, but then it just ignores the caps locks key, if you have Command + CapsLock + D for example Command + D will bring up the window still. CapsLock + D set, then try to bring up the window and no luck for me.... Wonder what it is.
There are certain keys that can't be used for shortcuts. Capslock is a funny one as it's more of a toggle key rather than an input, so it might not be usable.
It might be best to add in some validation to tell users when certain keys aren't available or certain combinations can't be used (e.g. command+c for example, which is already a system-wide command).
As a beginner I must say that this is a great and in depth tutorial, Very nice! But...
"register:sender needs to be connected with the shortcut button.
unregister:sender needs to be connected to the clear shortcut button.
clearButton property needs to be connected to the clear shortcut button.
shortcutButton needs to be connected to the shortcut button."
Sorry but... what? :D
There's one button and there's one text field. Can't figure out which to connect with which action/outlet because you're calling them all "button"
There's screenshots for all things but this one. Would be incredibly great to know what I'm doing wrong.
Hi Patrick,
Thank you for reading and for the kind words!
Sorry for the confusion. There's a mistake in the tutorial. Instead of using a text field and a button I'd recommend two buttons. One is the clear button, and the other is the "set" button.
You may also wish to set default text on the set button so the user knows to click it. You can do that from the storyboard title button property, as well as updating the unregister method
Hey Mitch,
thank you for your reply which explained a lot and now all makes sense, haha :D
If I may grab another minute off you:
How would you go on if there was no MainWindow? I have an existing app and I have the MainStoryboard wired to a ViewController. Like this: thepracticaldev.s3.amazonaws.com/i...
I want this one to pop up when hitting the shortcut. I've tried a few things but nothing worked so far :-/
Thanks again and best regards
Patrick
No problem Patrick :)
Can you show me a screenshot of your Storyboard?
Usually a view controller will have window or something else that it is used in.
One of the exceptions is if you're making a menubar app, in which case you can use NSPopover in your AppDelegate
This code is a little messy (copied it from an old project) but hopefully it is enough to give you an idea of how it works.
Once again: thank you! I guess I'm coming closer to that goal, hehe. Indeed it's a menu bar app. I ran through a "Swift on sundays" session by Paul Hudson and that's why there's a lot of stuff in the AppDelegate.swift and I don't know exactly how to merge both your code and the code that's already there.
Here's the MainStoryboard: thepracticaldev.s3.amazonaws.com/i...
And here's my AppDelegate. Tried to understand that Markdown stuff here but didn't succeed :(
Is the settings window supposed to be a popover as well? Or is that just a separate window that opens when the setting button is clicked?
I would try
1) Adding a popover instance to the AppDelegate
2) Add the main view controller instance to the new popover in the
applicationDidFinishLaunchingmethodSomething like this (This is untested!)
Mildly related, I recommend reading this Ray Wenderlich tutorial on menu bar apps, it helped me understand them better - raywenderlich.com/450-menus-and-po...
I'm a bit new to Xcode and swift and I got the hotels working for bringing the window up... But it's doesn't seem to works for the caps lock button.. It'll decide the caps lock button when setting it, but then it just ignores the caps locks key, if you have Command + CapsLock + D for example Command + D will bring up the window still. CapsLock + D set, then try to bring up the window and no luck for me.... Wonder what it is.
There are certain keys that can't be used for shortcuts. Capslock is a funny one as it's more of a toggle key rather than an input, so it might not be usable.
It might be best to add in some validation to tell users when certain keys aren't available or certain combinations can't be used (e.g. command+c for example, which is already a system-wide command).
So just wanted to share this
dev-to-uploads.s3.amazonaws.com/up...