{"id":1065,"date":"2018-07-15T22:33:25","date_gmt":"2018-07-15T20:33:25","guid":{"rendered":"http:\/\/www.albertopasca.it\/whiletrue\/?p=1065"},"modified":"2018-06-19T20:14:04","modified_gmt":"2018-06-19T18:14:04","slug":"swift-macos-how-to-make-cool-desktop-apps-using-cocoa","status":"publish","type":"post","link":"https:\/\/www.albertopasca.it\/whiletrue\/swift-macos-how-to-make-cool-desktop-apps-using-cocoa\/","title":{"rendered":"Swift | macOS &#8211; How to make cool desktop apps using Cocoa"},"content":{"rendered":"<p>So, what I want to share today is how to make windows with cool UI in a macOS application written in Cocoa\/Swift.<\/p>\n<p>This an example of what you see when create a new project from scratch in XCode and run it:<\/p>\n<p><!--more--><\/p>\n<p><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1066\" src=\"https:\/\/i0.wp.com\/www.albertopasca.it\/whiletrue\/wp-content\/uploads\/2018\/06\/Schermata-2018-06-14-alle-19.35.38.png?resize=1234%2C878\" alt=\"\" width=\"1234\" height=\"878\" srcset=\"https:\/\/i0.wp.com\/www.albertopasca.it\/whiletrue\/wp-content\/uploads\/2018\/06\/Schermata-2018-06-14-alle-19.35.38.png?w=1234&amp;ssl=1 1234w, https:\/\/i0.wp.com\/www.albertopasca.it\/whiletrue\/wp-content\/uploads\/2018\/06\/Schermata-2018-06-14-alle-19.35.38.png?resize=300%2C213&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.albertopasca.it\/whiletrue\/wp-content\/uploads\/2018\/06\/Schermata-2018-06-14-alle-19.35.38.png?resize=768%2C546&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.albertopasca.it\/whiletrue\/wp-content\/uploads\/2018\/06\/Schermata-2018-06-14-alle-19.35.38.png?resize=1024%2C729&amp;ssl=1 1024w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><\/p>\n<p>If you like this windows&#8230; ok, close this page and ignore the rest.<\/p>\n<p>Personally I don&#8217;t like so much, I prefer to customize a little bit also if my app is very simple.<\/p>\n<p>For instance, we can remove the Title bar, we can change the background color, we can drag clicking everywhere, we can also add a toolbar and much more&#8230;<\/p>\n<p>This is what I want to achieve in this post:<\/p>\n<p><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1067\" src=\"https:\/\/i0.wp.com\/www.albertopasca.it\/whiletrue\/wp-content\/uploads\/2018\/06\/Schermata-2018-06-14-alle-19.40.52.png?resize=1168%2C808\" alt=\"\" width=\"1168\" height=\"808\" srcset=\"https:\/\/i0.wp.com\/www.albertopasca.it\/whiletrue\/wp-content\/uploads\/2018\/06\/Schermata-2018-06-14-alle-19.40.52.png?w=1168&amp;ssl=1 1168w, https:\/\/i0.wp.com\/www.albertopasca.it\/whiletrue\/wp-content\/uploads\/2018\/06\/Schermata-2018-06-14-alle-19.40.52.png?resize=300%2C208&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.albertopasca.it\/whiletrue\/wp-content\/uploads\/2018\/06\/Schermata-2018-06-14-alle-19.40.52.png?resize=768%2C531&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.albertopasca.it\/whiletrue\/wp-content\/uploads\/2018\/06\/Schermata-2018-06-14-alle-19.40.52.png?resize=1024%2C708&amp;ssl=1 1024w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><\/p>\n<p>A NSWindow without title and titlebar, with a full background color and a toolbar that start on the right.<\/p>\n<p>Better than the first one, no?<\/p>\n<hr \/>\n<h6>Let&#8217;s go!<\/h6>\n<p>The first thing to do is to create some Swift Extensions because <strong>NSWindowController<\/strong> and <strong>NSViewController<\/strong> don&#8217;t have the <em>backgroundColor<\/em> method for instance.<\/p>\n<p>Other extensions that we can create are useful things to reuse in our projects, like\u00a0<em>NSWindowController<\/em> styles and addons.<\/p>\n<h6>NSCOLOR EXTENSION<\/h6>\n<p>just because if useful&#8230;<\/p>\n<pre class=\"p1\">\/\/ NSColorExtension.swift\r\nextension <span class=\"s2\">NSColor<\/span><span class=\"s1\"> {<\/span>\r\n<span class=\"Apple-converted-space\">\u00a0 \u00a0 <\/span><span class=\"s3\">static<\/span> <span class=\"s3\">var<\/span> <strong>defaultBackground<\/strong>: <span class=\"s2\">NSColor<\/span> {\r\n<span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><span class=\"s3\">get<\/span> { \r\n<span class=\"s3\">          return<\/span> <span class=\"s2\">NSColor<\/span>.<span class=\"s2\">init<\/span>(\r\n               red: <span class=\"s4\">83<\/span>\/<span class=\"s4\">255<\/span>, \r\n               green: <span class=\"s4\">87<\/span>\/<span class=\"s4\">255<\/span>, \r\n               blue: <span class=\"s4\">96<\/span>\/<span class=\"s4\">255<\/span>, \r\n               alpha: <span class=\"s4\">1<\/span>) \r\n        }\r\n<span class=\"Apple-converted-space\">\u00a0 \u00a0 <\/span>}\r\n}<\/pre>\n<h6>NSVIEW BACKGROUND COLOR<\/h6>\n<pre class=\"p1\">\/\/ NSViewExtension.swift\r\nextension <span class=\"s2\">NSView<\/span><span class=\"s1\"> {<\/span>\r\n\r\n<span class=\"Apple-converted-space\">\u00a0 \u00a0 <\/span><span class=\"s3\">var<\/span> <strong>backgroundColor<\/strong>: <span class=\"s2\">NSColor<\/span>? {\r\n<span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><span class=\"s3\">get<\/span> {\r\n<span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span class=\"s3\">if<\/span> <span class=\"s3\">let<\/span> colorRef = <span class=\"s3\">self<\/span>.<span class=\"s4\">layer<\/span>?.<span class=\"s4\">backgroundColor<\/span> {\r\n<span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span class=\"s3\">return<\/span> <span class=\"s2\">NSColor<\/span>(cgColor: colorRef)\r\n<span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span>} <span class=\"s3\">else<\/span> { <span class=\"s3\">return<\/span> <span class=\"s3\">nil<\/span> }\r\n<span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span>}\r\n<span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><span class=\"s3\">set<\/span> {\r\n<span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span class=\"s3\">self<\/span>.<span class=\"s4\">wantsLayer<\/span> = <span class=\"s3\">true<\/span>\r\n<span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span class=\"s3\">self<\/span>.<span class=\"s4\">layer<\/span>?.<span class=\"s4\">backgroundColor<\/span> = newValue?.<span class=\"s4\">cgColor<\/span>\r\n<span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span>}\r\n<span class=\"Apple-converted-space\">\u00a0 \u00a0 <\/span>}\r\n}<\/pre>\n<h6>NSVIEWCONTROLLER extension<\/h6>\n<pre class=\"p1\"><span class=\"s1\">\/\/ NSViewControllerExtension.swift\r\nextension<\/span> NSViewController<span class=\"s2\"> {<\/span>\r\n<span class=\"Apple-converted-space\">\u00a0 \u00a0 <\/span><span class=\"s1\">func<\/span> <strong>darkBackground<\/strong>() {\r\n<span class=\"s2\"><span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><\/span><span class=\"s1\">self<\/span><span class=\"s2\">.<\/span>view<span class=\"s2\">.<\/span>backgroundColor<span class=\"s2\"> = <\/span><span class=\"s3\">NSColor<\/span><span class=\"s2\">.<\/span>defaultBackground\r\n<span class=\"Apple-converted-space\">\u00a0 \u00a0 <\/span>}\r\n}<\/pre>\n<p>and the latest one is for NSWindowController,<\/p>\n<h6>NSWINDOWCONTROLLEr styles<\/h6>\n<pre class=\"p1\"><span class=\"s1\">\/\/NSWindowControllerExtension.swift\r\nextension<\/span> NSWindowController<span class=\"s2\"> {<\/span>\r\n<span class=\"Apple-converted-space\">\u00a0 \u00a0 <\/span><span class=\"s1\">func<\/span> <strong>smartWindow<\/strong>() {\r\n<span class=\"s2\"><span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0<\/span><\/span><span class=\"s1\">self<\/span><span class=\"s2\">.<\/span>window<span class=\"s2\">?.<\/span>styleMask<span class=\"s2\">.<\/span><span class=\"s3\">insert<\/span><span class=\"s2\">(\r\n<\/span><span class=\"s4\">                 NSWindow<\/span><span class=\"s2\">.<\/span><span class=\"s4\">StyleMask<\/span><span class=\"s2\">.<\/span>unifiedTitleAndToolbar<span class=\"s2\">)<\/span>\r\n<span class=\"s1\">       self<\/span><span class=\"s2\">.<\/span>window<span class=\"s2\">?.<\/span>styleMask<span class=\"s2\">.<\/span><span class=\"s3\">insert<\/span><span class=\"s2\">(\r\n<\/span><span class=\"s4\">                 NSWindow<\/span><span class=\"s2\">.<\/span><span class=\"s4\">StyleMask<\/span><span class=\"s2\">.<\/span>fullSizeContentView<span class=\"s2\">)<\/span>\r\n<span class=\"s2\"><span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0<\/span><\/span><span class=\"s1\">self<\/span><span class=\"s2\">.<\/span>window<span class=\"s2\">?.<\/span>styleMask<span class=\"s2\">.<\/span><span class=\"s3\">insert<\/span><span class=\"s2\">(<\/span><span class=\"s4\">NSWindow<\/span><span class=\"s2\">.<\/span><span class=\"s4\">StyleMask<\/span><span class=\"s2\">.<\/span>titled<span class=\"s2\">)\r\n<\/span>\r\n<span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0<\/span><span class=\"s1\">self<\/span>.<span class=\"s5\">window<\/span>?.<span class=\"s5\">toolbar<\/span>?.<span class=\"s5\">isVisible<\/span> <span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span>= <span class=\"s1\">false<\/span>\r\n<span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0<\/span><span class=\"s1\">self<\/span>.<span class=\"s5\">window<\/span>?.<span class=\"s5\">titleVisibility<\/span><span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span>= .<span class=\"s1\">hidden<\/span>\r\n<span class=\"s2\"><span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0<\/span><\/span><span class=\"s1\">self<\/span><span class=\"s2\">.<\/span>window<span class=\"s2\">?.<\/span>titlebarAppearsTransparent<span class=\"s2\"> = <\/span><span class=\"s1\">true<\/span>\r\n<span class=\"Apple-converted-space\">\u00a0 \u00a0 <\/span>}\r\n\r\n<span class=\"Apple-converted-space\">\u00a0 \u00a0 <\/span><span class=\"s1\">func<\/span> <strong>activateWindowDrag<\/strong>() {\r\n<span class=\"s2\"><span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><\/span><span class=\"s1\">self<\/span><span class=\"s2\">.<\/span>window<span class=\"s2\">?.<\/span>isMovableByWindowBackground<span class=\"s2\"> = <\/span><span class=\"s1\">true<\/span>\r\n<span class=\"Apple-converted-space\">\u00a0 \u00a0 <\/span>}\r\n}<\/pre>\n<p>This last extension do the biggest cool part!<\/p>\n<p>Let&#8217;s see how to &#8220;colorize&#8221; this window and next how to add the toolbar on the right:<\/p>\n<ul>\n<li>Create a new file,\u00a0 new <strong>Cocoa<\/strong> class, subclass of <strong>NSWindowController<\/strong> and add to project. Call it &#8220;<strong>MainWindow<\/strong>.swift&#8221;<\/li>\n<li>Open <strong>Main.storyboard<\/strong> and set the class type to the Window to your class name that just created, &#8220;<em>MainWindow<\/em>&#8220;.<\/li>\n<li>Open MainWindow.swift and:<\/li>\n<\/ul>\n<pre>\/\/ create an instance of the ViewController:\r\n<strong><span class=\"s2\">var<\/span><span class=\"s1\"> vctrl : <\/span>ViewController<span class=\"s1\">?\r\n<\/span><\/strong><span class=\"s1\">\r\noverride<\/span> <span class=\"s1\">func<\/span> windowDidLoad() {\r\n<span class=\"s1\">    super<\/span>.windowDidLoad()\r\n        \/\/ and assign to the contentViewController\r\n<strong><span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span>vctrl = <span class=\"s1\">self<\/span>.contentViewController <span class=\"s1\">as<\/span>? <span class=\"s2\">ViewController<\/span><\/strong>\r\n<span class=\"Apple-converted-space\">\u00a0 \u00a0 <\/span>}\r\n}<\/pre>\n<p>Now your storyboard start with MainWindow and load the ViewController as usual.<\/p>\n<p>Add cool things now!<\/p>\n<p>in the <strong>windowDidLoad(), <\/strong>add the two extension method that you&#8217;ve created before:<\/p>\n<pre class=\"p1\"><span class=\"s1\">\/\/ smart window, add the cool style that you want:\r\n\/\/ - hide the title bar\r\n\/\/ - set the window in full screen\r\n\/\/ - unified the title with the window\r\n\/\/ - set visibility of elements\r\n<strong>self<\/strong><\/span><strong>.smartWindow()<\/strong>\r\n\r\n\/\/ activateWindowDrag is another cool thing that permit you to drag the window clicking anywhere!\r\n<strong><span class=\"s1\">self<\/span>.activateWindowDrag()<\/strong><\/pre>\n<p>Build and run!<\/p>\n<p><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1068\" src=\"https:\/\/i0.wp.com\/www.albertopasca.it\/whiletrue\/wp-content\/uploads\/2018\/06\/Schermata-2018-06-14-alle-19.59.44.png?resize=1184%2C764\" alt=\"\" width=\"1184\" height=\"764\" srcset=\"https:\/\/i0.wp.com\/www.albertopasca.it\/whiletrue\/wp-content\/uploads\/2018\/06\/Schermata-2018-06-14-alle-19.59.44.png?w=1184&amp;ssl=1 1184w, https:\/\/i0.wp.com\/www.albertopasca.it\/whiletrue\/wp-content\/uploads\/2018\/06\/Schermata-2018-06-14-alle-19.59.44.png?resize=300%2C194&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.albertopasca.it\/whiletrue\/wp-content\/uploads\/2018\/06\/Schermata-2018-06-14-alle-19.59.44.png?resize=768%2C496&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.albertopasca.it\/whiletrue\/wp-content\/uploads\/2018\/06\/Schermata-2018-06-14-alle-19.59.44.png?resize=1024%2C661&amp;ssl=1 1024w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><\/p>\n<p>Better, but not yet complete!<\/p>\n<p>We want now to change the background color of this window&#8230; you can&#8217;t. Ah no, wait, we created an extension for doing this!<\/p>\n<p>Let&#8217;s use it!<\/p>\n<p>Open <em>ViewController.swift\u00a0<\/em>and in the<\/p>\n<pre class=\"p1\"><span class=\"s1\">override<\/span> <span class=\"s1\">func<\/span> viewDidLoad() {\r\n<span class=\"s1\">    super<\/span><span class=\"s2\">.<\/span>viewDidLoad<span class=\"s2\">()\r\n\r\n<\/span>    \/\/ yeah! Invoke the dark background method from extension!\r\n<strong>    self.darkBackground()<\/strong>\r\n}<\/pre>\n<p>Build, run and voil\u00e0! another step is done!<\/p>\n<p><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1069\" src=\"https:\/\/i0.wp.com\/www.albertopasca.it\/whiletrue\/wp-content\/uploads\/2018\/06\/Schermata-2018-06-14-alle-20.02.19.png?resize=1184%2C764\" alt=\"\" width=\"1184\" height=\"764\" srcset=\"https:\/\/i0.wp.com\/www.albertopasca.it\/whiletrue\/wp-content\/uploads\/2018\/06\/Schermata-2018-06-14-alle-20.02.19.png?w=1184&amp;ssl=1 1184w, https:\/\/i0.wp.com\/www.albertopasca.it\/whiletrue\/wp-content\/uploads\/2018\/06\/Schermata-2018-06-14-alle-20.02.19.png?resize=300%2C194&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.albertopasca.it\/whiletrue\/wp-content\/uploads\/2018\/06\/Schermata-2018-06-14-alle-20.02.19.png?resize=768%2C496&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.albertopasca.it\/whiletrue\/wp-content\/uploads\/2018\/06\/Schermata-2018-06-14-alle-20.02.19.png?resize=1024%2C661&amp;ssl=1 1024w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><\/p>\n<p>Very nice!<\/p>\n<p>Now, the last thing, add the toolbar!<\/p>\n<p>Open the storyboard and create a new NSViewController dragging it to the storyboard. Select it and change the class to &#8220;<strong>NSTitlebarAccessoryViewController<\/strong>&#8221; and set a &#8220;<em>storyboardId<\/em>&#8221; in the Identity tab like &#8220;<strong>titlebarViewController<\/strong>&#8220;, just to call from code.<\/p>\n<p>You should create something like this:<\/p>\n<p><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1070\" src=\"https:\/\/i0.wp.com\/www.albertopasca.it\/whiletrue\/wp-content\/uploads\/2018\/06\/Schermata-2018-06-14-alle-20.07.15.png?resize=1730%2C378\" alt=\"\" width=\"1730\" height=\"378\" srcset=\"https:\/\/i0.wp.com\/www.albertopasca.it\/whiletrue\/wp-content\/uploads\/2018\/06\/Schermata-2018-06-14-alle-20.07.15.png?w=1730&amp;ssl=1 1730w, https:\/\/i0.wp.com\/www.albertopasca.it\/whiletrue\/wp-content\/uploads\/2018\/06\/Schermata-2018-06-14-alle-20.07.15.png?resize=300%2C66&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.albertopasca.it\/whiletrue\/wp-content\/uploads\/2018\/06\/Schermata-2018-06-14-alle-20.07.15.png?resize=768%2C168&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.albertopasca.it\/whiletrue\/wp-content\/uploads\/2018\/06\/Schermata-2018-06-14-alle-20.07.15.png?resize=1024%2C224&amp;ssl=1 1024w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><\/p>\n<p>You can add buttons, images and what you want to customize this accessory view (like my\u00a0second screenshot, with Info button and Settings button).<\/p>\n<p>Let&#8217;s come back in the code, in MainWindow.swift. You need to set the accessory view of the window with the new controller just created:<\/p>\n<pre class=\"p1\"><span class=\"s1\">self<\/span><span class=\"s2\">.<\/span><span class=\"s3\">window<\/span><span class=\"s2\">?.<\/span>addTitlebarAccessoryViewController<\/pre>\n<p>Exactly in the <strong>windowDidLoad()<\/strong>. This is your final result:<\/p>\n<pre class=\"p1\"><span class=\"s1\">override<\/span> <span class=\"s1\">func<\/span> windowDidLoad() {\r\n<span class=\"s1\">    super<\/span><span class=\"s2\">.<\/span>windowDidLoad<span class=\"s2\">()<\/span><span class=\"Apple-converted-space\">\u00a0\u00a0 \u00a0\r\n<\/span>\r\n<span class=\"s1\">    self<\/span><span class=\"s2\">.<\/span>smartWindow<span class=\"s2\">()<\/span>\r\n<span class=\"s1\">    self<\/span><span class=\"s2\">.<\/span>activateWindowDrag<span class=\"s2\">()<\/span>\r\n\r\n<strong><span class=\"s1\">    if<\/span> <span class=\"s1\">let<\/span> titlebarController = <\/strong>\r\n<strong><span class=\"s1\">            self<\/span>.<span class=\"s3\">storyboard<\/span>?.<span class=\"s4\">instantiateController<\/span>(<\/strong>\r\n<strong><span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0     <\/span>withIdentifier: <span class=\"s5\">NSStoryboard<\/span>.<span class=\"s5\">SceneIdentifier<\/span>(<\/strong>\r\n<strong><span class=\"s2\"><span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0       <\/span>rawValue: <\/span><span class=\"s6\">\"titlebarViewController\"<\/span><span class=\"s2\">)\r\n            ) <\/span><span class=\"s1\">as<\/span><span class=\"s2\">? <\/span>NSTitlebarAccessoryViewController<\/strong>\r\n<strong><span class=\"Apple-converted-space\">\u00a0 \u00a0 <\/span>{<\/strong>\r\n<strong>            \/\/ position of title bar<\/strong>\r\n<strong><span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span>titlebarController.<span class=\"s3\">layoutAttribute<\/span> = .<span class=\"s1\">right\r\n            \r\n            \/\/ set the titleBar\r\n<\/span><span class=\"s1\">            self<\/span>.<span class=\"s3\">window<\/span>?.<span class=\"s4\">addTitlebarAccessoryViewController<\/span>(<\/strong>\r\n<strong>                titlebarController<\/strong>\r\n<strong>            )<\/strong>\r\n<strong><span class=\"Apple-converted-space\">\u00a0 \u00a0 <\/span>}<\/strong>\r\n\r\n    vctrl<span class=\"s2\"> = <\/span><span class=\"s1\">self<\/span><span class=\"s2\">.<\/span>contentViewController <span class=\"s1\">as<\/span><span class=\"s2\">? <\/span><span class=\"s5\">ViewController<\/span>\r\n}<\/pre>\n<p>For the last time, build and run! You should see your application complete!<\/p>\n<p><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1067\" src=\"https:\/\/i0.wp.com\/www.albertopasca.it\/whiletrue\/wp-content\/uploads\/2018\/06\/Schermata-2018-06-14-alle-19.40.52.png?resize=1168%2C808\" alt=\"\" width=\"1168\" height=\"808\" srcset=\"https:\/\/i0.wp.com\/www.albertopasca.it\/whiletrue\/wp-content\/uploads\/2018\/06\/Schermata-2018-06-14-alle-19.40.52.png?w=1168&amp;ssl=1 1168w, https:\/\/i0.wp.com\/www.albertopasca.it\/whiletrue\/wp-content\/uploads\/2018\/06\/Schermata-2018-06-14-alle-19.40.52.png?resize=300%2C208&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.albertopasca.it\/whiletrue\/wp-content\/uploads\/2018\/06\/Schermata-2018-06-14-alle-19.40.52.png?resize=768%2C531&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.albertopasca.it\/whiletrue\/wp-content\/uploads\/2018\/06\/Schermata-2018-06-14-alle-19.40.52.png?resize=1024%2C708&amp;ssl=1 1024w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><\/p>\n<p>You can create your own class for the accessory view and attach the button&#8217;s action on it!<\/p>\n<p><em>Lazy<\/em>? Download source code on <strong>github<\/strong>:\u00a0<a href=\"https:\/\/github.com\/elpsk\/Swift-macOS-CoolApp-Skeleton\" target=\"_blank\" rel=\"noopener\">https:\/\/github.com\/elpsk\/Swift-macOS-CoolApp-Skeleton<\/a><\/p>\n<p>Done!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>So, what I want to share today is how to make windows with cool UI in a macOS application written in Cocoa\/Swift. This an example of what you see when create a new project from scratch in XCode and run it:<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[1],"tags":[671,666,663,197,670,274,241,667,665,46,669,668,661,664],"class_list":["post-1065","post","type-post","status-publish","format-standard","hentry","category-generic","tag-accessory-view","tag-background-color","tag-cocoa","tag-color","tag-desktop","tag-extension","tag-macos","tag-nsview","tag-nswindowcontroller","tag-swift","tag-titlebar","tag-toolbar","tag-ui","tag-window"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Swift | macOS - How to make cool desktop apps using Cocoa - while (true) {\u00a0}<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.albertopasca.it\/whiletrue\/swift-macos-how-to-make-cool-desktop-apps-using-cocoa\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Swift | macOS - How to make cool desktop apps using Cocoa - while (true) {\u00a0}\" \/>\n<meta property=\"og:description\" content=\"So, what I want to share today is how to make windows with cool UI in a macOS application written in Cocoa\/Swift. This an example of what you see when create a new project from scratch in XCode and run it:\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.albertopasca.it\/whiletrue\/swift-macos-how-to-make-cool-desktop-apps-using-cocoa\/\" \/>\n<meta property=\"og:site_name\" content=\"while (true) {\u00a0}\" \/>\n<meta property=\"article:published_time\" content=\"2018-07-15T20:33:25+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.albertopasca.it\/whiletrue\/wp-content\/uploads\/2018\/06\/Schermata-2018-06-14-alle-19.35.38.png\" \/>\n<meta name=\"author\" content=\"Alberto Pasca\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@lupasca\" \/>\n<meta name=\"twitter:site\" content=\"@lupasca\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Alberto Pasca\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.albertopasca.it\\\/whiletrue\\\/swift-macos-how-to-make-cool-desktop-apps-using-cocoa\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.albertopasca.it\\\/whiletrue\\\/swift-macos-how-to-make-cool-desktop-apps-using-cocoa\\\/\"},\"author\":{\"name\":\"Alberto Pasca\",\"@id\":\"https:\\\/\\\/www.albertopasca.it\\\/whiletrue\\\/#\\\/schema\\\/person\\\/d3cf0df774eb4aac797f246a795e9fac\"},\"headline\":\"Swift | macOS &#8211; How to make cool desktop apps using Cocoa\",\"datePublished\":\"2018-07-15T20:33:25+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.albertopasca.it\\\/whiletrue\\\/swift-macos-how-to-make-cool-desktop-apps-using-cocoa\\\/\"},\"wordCount\":514,\"publisher\":{\"@id\":\"https:\\\/\\\/www.albertopasca.it\\\/whiletrue\\\/#\\\/schema\\\/person\\\/d3cf0df774eb4aac797f246a795e9fac\"},\"image\":{\"@id\":\"https:\\\/\\\/www.albertopasca.it\\\/whiletrue\\\/swift-macos-how-to-make-cool-desktop-apps-using-cocoa\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/www.albertopasca.it\\\/whiletrue\\\/wp-content\\\/uploads\\\/2018\\\/06\\\/Schermata-2018-06-14-alle-19.35.38.png\",\"keywords\":[\"accessory view\",\"background color\",\"cocoa\",\"color\",\"desktop\",\"extension\",\"macos\",\"nsview\",\"nswindowcontroller\",\"swift\",\"titlebar\",\"toolbar\",\"ui\",\"window\"],\"articleSection\":[\"generic\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.albertopasca.it\\\/whiletrue\\\/swift-macos-how-to-make-cool-desktop-apps-using-cocoa\\\/\",\"url\":\"https:\\\/\\\/www.albertopasca.it\\\/whiletrue\\\/swift-macos-how-to-make-cool-desktop-apps-using-cocoa\\\/\",\"name\":\"Swift | macOS - How to make cool desktop apps using Cocoa - while (true) {\u00a0}\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.albertopasca.it\\\/whiletrue\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.albertopasca.it\\\/whiletrue\\\/swift-macos-how-to-make-cool-desktop-apps-using-cocoa\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.albertopasca.it\\\/whiletrue\\\/swift-macos-how-to-make-cool-desktop-apps-using-cocoa\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/www.albertopasca.it\\\/whiletrue\\\/wp-content\\\/uploads\\\/2018\\\/06\\\/Schermata-2018-06-14-alle-19.35.38.png\",\"datePublished\":\"2018-07-15T20:33:25+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.albertopasca.it\\\/whiletrue\\\/swift-macos-how-to-make-cool-desktop-apps-using-cocoa\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.albertopasca.it\\\/whiletrue\\\/swift-macos-how-to-make-cool-desktop-apps-using-cocoa\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.albertopasca.it\\\/whiletrue\\\/swift-macos-how-to-make-cool-desktop-apps-using-cocoa\\\/#primaryimage\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/www.albertopasca.it\\\/whiletrue\\\/wp-content\\\/uploads\\\/2018\\\/06\\\/Schermata-2018-06-14-alle-19.35.38.png?fit=1234%2C878&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/www.albertopasca.it\\\/whiletrue\\\/wp-content\\\/uploads\\\/2018\\\/06\\\/Schermata-2018-06-14-alle-19.35.38.png?fit=1234%2C878&ssl=1\",\"width\":1234,\"height\":878},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.albertopasca.it\\\/whiletrue\\\/swift-macos-how-to-make-cool-desktop-apps-using-cocoa\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.albertopasca.it\\\/whiletrue\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Swift | macOS &#8211; How to make cool desktop apps using Cocoa\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.albertopasca.it\\\/whiletrue\\\/#website\",\"url\":\"https:\\\/\\\/www.albertopasca.it\\\/whiletrue\\\/\",\"name\":\"while (true) {\u00a0}\",\"description\":\"notes from a developer, tutorials, how-to, ideas\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.albertopasca.it\\\/whiletrue\\\/#\\\/schema\\\/person\\\/d3cf0df774eb4aac797f246a795e9fac\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.albertopasca.it\\\/whiletrue\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.albertopasca.it\\\/whiletrue\\\/#\\\/schema\\\/person\\\/d3cf0df774eb4aac797f246a795e9fac\",\"name\":\"Alberto Pasca\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/4d8fe43c412d0bb34a71c41f60dce53eff3afc027853cbfd20bee6ddc7e93f35?s=96&d=retro&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/4d8fe43c412d0bb34a71c41f60dce53eff3afc027853cbfd20bee6ddc7e93f35?s=96&d=retro&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/4d8fe43c412d0bb34a71c41f60dce53eff3afc027853cbfd20bee6ddc7e93f35?s=96&d=retro&r=g\",\"caption\":\"Alberto Pasca\"},\"logo\":{\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/4d8fe43c412d0bb34a71c41f60dce53eff3afc027853cbfd20bee6ddc7e93f35?s=96&d=retro&r=g\"},\"description\":\"Software engineer @ Pirelli &amp; C. S.p.A. with a strong passion for mobile \uf8ff development, security, and connected things.\",\"sameAs\":[\"https:\\\/\\\/www.albertopasca.it\",\"albertopasca\",\"https:\\\/\\\/x.com\\\/lupasca\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Swift | macOS - How to make cool desktop apps using Cocoa - while (true) {\u00a0}","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.albertopasca.it\/whiletrue\/swift-macos-how-to-make-cool-desktop-apps-using-cocoa\/","og_locale":"en_US","og_type":"article","og_title":"Swift | macOS - How to make cool desktop apps using Cocoa - while (true) {\u00a0}","og_description":"So, what I want to share today is how to make windows with cool UI in a macOS application written in Cocoa\/Swift. This an example of what you see when create a new project from scratch in XCode and run it:","og_url":"https:\/\/www.albertopasca.it\/whiletrue\/swift-macos-how-to-make-cool-desktop-apps-using-cocoa\/","og_site_name":"while (true) {\u00a0}","article_published_time":"2018-07-15T20:33:25+00:00","og_image":[{"url":"http:\/\/www.albertopasca.it\/whiletrue\/wp-content\/uploads\/2018\/06\/Schermata-2018-06-14-alle-19.35.38.png","type":"","width":"","height":""}],"author":"Alberto Pasca","twitter_card":"summary_large_image","twitter_creator":"@lupasca","twitter_site":"@lupasca","twitter_misc":{"Written by":"Alberto Pasca","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.albertopasca.it\/whiletrue\/swift-macos-how-to-make-cool-desktop-apps-using-cocoa\/#article","isPartOf":{"@id":"https:\/\/www.albertopasca.it\/whiletrue\/swift-macos-how-to-make-cool-desktop-apps-using-cocoa\/"},"author":{"name":"Alberto Pasca","@id":"https:\/\/www.albertopasca.it\/whiletrue\/#\/schema\/person\/d3cf0df774eb4aac797f246a795e9fac"},"headline":"Swift | macOS &#8211; How to make cool desktop apps using Cocoa","datePublished":"2018-07-15T20:33:25+00:00","mainEntityOfPage":{"@id":"https:\/\/www.albertopasca.it\/whiletrue\/swift-macos-how-to-make-cool-desktop-apps-using-cocoa\/"},"wordCount":514,"publisher":{"@id":"https:\/\/www.albertopasca.it\/whiletrue\/#\/schema\/person\/d3cf0df774eb4aac797f246a795e9fac"},"image":{"@id":"https:\/\/www.albertopasca.it\/whiletrue\/swift-macos-how-to-make-cool-desktop-apps-using-cocoa\/#primaryimage"},"thumbnailUrl":"http:\/\/www.albertopasca.it\/whiletrue\/wp-content\/uploads\/2018\/06\/Schermata-2018-06-14-alle-19.35.38.png","keywords":["accessory view","background color","cocoa","color","desktop","extension","macos","nsview","nswindowcontroller","swift","titlebar","toolbar","ui","window"],"articleSection":["generic"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.albertopasca.it\/whiletrue\/swift-macos-how-to-make-cool-desktop-apps-using-cocoa\/","url":"https:\/\/www.albertopasca.it\/whiletrue\/swift-macos-how-to-make-cool-desktop-apps-using-cocoa\/","name":"Swift | macOS - How to make cool desktop apps using Cocoa - while (true) {\u00a0}","isPartOf":{"@id":"https:\/\/www.albertopasca.it\/whiletrue\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.albertopasca.it\/whiletrue\/swift-macos-how-to-make-cool-desktop-apps-using-cocoa\/#primaryimage"},"image":{"@id":"https:\/\/www.albertopasca.it\/whiletrue\/swift-macos-how-to-make-cool-desktop-apps-using-cocoa\/#primaryimage"},"thumbnailUrl":"http:\/\/www.albertopasca.it\/whiletrue\/wp-content\/uploads\/2018\/06\/Schermata-2018-06-14-alle-19.35.38.png","datePublished":"2018-07-15T20:33:25+00:00","breadcrumb":{"@id":"https:\/\/www.albertopasca.it\/whiletrue\/swift-macos-how-to-make-cool-desktop-apps-using-cocoa\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.albertopasca.it\/whiletrue\/swift-macos-how-to-make-cool-desktop-apps-using-cocoa\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.albertopasca.it\/whiletrue\/swift-macos-how-to-make-cool-desktop-apps-using-cocoa\/#primaryimage","url":"https:\/\/i0.wp.com\/www.albertopasca.it\/whiletrue\/wp-content\/uploads\/2018\/06\/Schermata-2018-06-14-alle-19.35.38.png?fit=1234%2C878&ssl=1","contentUrl":"https:\/\/i0.wp.com\/www.albertopasca.it\/whiletrue\/wp-content\/uploads\/2018\/06\/Schermata-2018-06-14-alle-19.35.38.png?fit=1234%2C878&ssl=1","width":1234,"height":878},{"@type":"BreadcrumbList","@id":"https:\/\/www.albertopasca.it\/whiletrue\/swift-macos-how-to-make-cool-desktop-apps-using-cocoa\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.albertopasca.it\/whiletrue\/"},{"@type":"ListItem","position":2,"name":"Swift | macOS &#8211; How to make cool desktop apps using Cocoa"}]},{"@type":"WebSite","@id":"https:\/\/www.albertopasca.it\/whiletrue\/#website","url":"https:\/\/www.albertopasca.it\/whiletrue\/","name":"while (true) {\u00a0}","description":"notes from a developer, tutorials, how-to, ideas","publisher":{"@id":"https:\/\/www.albertopasca.it\/whiletrue\/#\/schema\/person\/d3cf0df774eb4aac797f246a795e9fac"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.albertopasca.it\/whiletrue\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.albertopasca.it\/whiletrue\/#\/schema\/person\/d3cf0df774eb4aac797f246a795e9fac","name":"Alberto Pasca","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/4d8fe43c412d0bb34a71c41f60dce53eff3afc027853cbfd20bee6ddc7e93f35?s=96&d=retro&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/4d8fe43c412d0bb34a71c41f60dce53eff3afc027853cbfd20bee6ddc7e93f35?s=96&d=retro&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/4d8fe43c412d0bb34a71c41f60dce53eff3afc027853cbfd20bee6ddc7e93f35?s=96&d=retro&r=g","caption":"Alberto Pasca"},"logo":{"@id":"https:\/\/secure.gravatar.com\/avatar\/4d8fe43c412d0bb34a71c41f60dce53eff3afc027853cbfd20bee6ddc7e93f35?s=96&d=retro&r=g"},"description":"Software engineer @ Pirelli &amp; C. S.p.A. with a strong passion for mobile \uf8ff development, security, and connected things.","sameAs":["https:\/\/www.albertopasca.it","albertopasca","https:\/\/x.com\/lupasca"]}]}},"jetpack_publicize_connections":[],"jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"jetpack-related-posts":[],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/www.albertopasca.it\/whiletrue\/wp-json\/wp\/v2\/posts\/1065","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.albertopasca.it\/whiletrue\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.albertopasca.it\/whiletrue\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.albertopasca.it\/whiletrue\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.albertopasca.it\/whiletrue\/wp-json\/wp\/v2\/comments?post=1065"}],"version-history":[{"count":3,"href":"https:\/\/www.albertopasca.it\/whiletrue\/wp-json\/wp\/v2\/posts\/1065\/revisions"}],"predecessor-version":[{"id":1074,"href":"https:\/\/www.albertopasca.it\/whiletrue\/wp-json\/wp\/v2\/posts\/1065\/revisions\/1074"}],"wp:attachment":[{"href":"https:\/\/www.albertopasca.it\/whiletrue\/wp-json\/wp\/v2\/media?parent=1065"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.albertopasca.it\/whiletrue\/wp-json\/wp\/v2\/categories?post=1065"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.albertopasca.it\/whiletrue\/wp-json\/wp\/v2\/tags?post=1065"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}