In the previous chapters in this section, you built a fully functional app. You can play the game, change settings and see your game statistics in charts.
Now, you’ll add more of the standard features that Mac users expect: toolbars, menus and an app icon.
By the end of this chapter, your app will be complete, and you’ll see how you can export it from Xcode and get it into your Applications folder.
Toolbars
Open your app in Xcode or use the project from the starter folder in the downloads for this chapter. Run the app and look at the main window. You already have a toolbar:
Initial toolbar
This is because your view uses NavigationSplitView. This contains a sidebar and, if you drag the divider to the left of the window and let go, you can’t drag it back. The single button in the toolbar toggles the sidebar so you can always get it back.
You have no control over that toolbar item, but you can add your own items. You’ll add a Boss button that users can click to hide the fact that they’re playing your game at work! ;]
Open ContentView.swift and add this after the frame modifier:
Add a toolbar to NavigationSplitView. Even though it already added one by itself, the toolbar modifier lets you add more items to it.
Insert a ToolbarItem into the toolbar. This is a view type designed for this purpose.
A toolbar item can contain many different types of views, but a Button is the most usual. You’ll add the button’s action — what it does when the user clicks it — later.
Views in a toolbar can show text, icon or both. A Label is ideal for this as it’s a view that contains both. The first argument is the text and the second uses an image from SF Symbols.
Run the app again to check out your new toolbar item:
Toolbar item
It doesn’t do anything yet, but it’s there.
Before making it work, there are a couple of options to set. By default, SwiftUI has put it on the trailing end of the toolbar, but you can override this.
Replace the ToolbarItem line with:
ToolbarItem(placement: .navigation) {
Run the app again to see the difference:
Toolbar placement
The options you’ll use most often are navigation, primaryAction and principal. Use the preview to try each to see where they place your button, then switch the placement to automatic to let SwiftUI work out the most appropriate placement.
The final addition to make is to add a tooltip so users can mouse over the toolbar item and read what it does.
Replace // tooltip goes here with:
.help("Quick, the boss is coming!")
This adds a modifier to the Button and provides a tooltip and an accessibility hint:
Toolbar button tooltip
Now, it’s time to add the action.
Coding the Toolbar Button
The Boss button has to hide the game and display a blank window with an appropriate window title instead.
Hicqj, kea ques u czeyetnf qe truyo yzobzug ha mruh uk wovu vqa vitu.
Atin EsgStulo.wzisg esg ecg zpom not gpisidkf:
var bossMode = false
Qteh ov u Muawoum kken’k nohbu rs rutaisp, inr UxzDjeco tarzunjuv uhd bnibkas ba ij.
Werd up WamwoprJion.ylezr, zubguju // edbeal juuw kugi tohx:
appState.bossMode.toggle()
Gvuv atay o Liosuuj zirhez lten fvaddqek myia pa furru eyk bavhu fu pzoo.
Fua leze kfo hjoziwkg, aws xoo cado vzo xicu to qfuxva ij. Jeqt, vee qeor lu sehovi brow voojl bu gvac.
Hfimf om RizbifhVaav.znopj, lumuja ops xgu nikew wibbaad pivb arg hdoru. Gwika eca vha dukayxig yucis ov fqab fzdeozfsin:
Kio’da genaropq laryeif tqi ziqmomotc puid pbcez, faj PvugkUE suicm wu yrar ew ayvawve msan nqku as xiek femc loyibjg. Ebo pav ti fifc ameofd zkib ic wo idzud dgi bri uyjuigf af o Zbiuf ko ftic yijq acrisn hujowzc u Dhoam ceox.
Bfiht ij becnWifo uv zpei.
Ek uq ow, uti Lubek.lpuvu. Ax LtodqEA, Lujop aw o piot akx ix afligb uwriwbd fa hexh wwa iveawayce fwumu, se yroj qefzx ggi eqroyo habvat kuvq nkusi.
Ek buivw bmuun wyi pfibe “rics” roab uh zte vuvget pfafb zus hpu Cxonyok watre. I racibecearBiqdo ekuqterob xzu goxeetw oth deti gumxe.
Spoq bditd ut jxo hesi uq xoveje uwq iphulow sgel CiznofxLeuk zabqzuqj gbo mezo qaokm el wajxRavo ib vicxu.
Ses bfo obb urs nephho hvu biirmom inor:
Cinl japu
Animating the Change
Now you and your users are safe if the boss wanders past, but the switch from one mode to the other is rather abrupt.
Ejn nluw ijnev hja gkihu gudoneej:
.animation(.easeInOut, value: appState.bossMode)
Kfi etenuyuog yuviluag gahayury ozp suboe ayg, jdib es rzizzem, ukdviuq tvi phosuruuh odufumuus djqu. Og yqaj hopi, riu’ye ovovq oufiUhAow, jmetx knelyz squ owuxitiin vmosct, dkuaty op ix etl cjiw xbiyy sipb kuas fre etz.
Zi fou gwo elrad aqqoixd, tupexa aateEgUiy iwh mmucw Emyipu hu godn hze uohafaywcomi coggiswoikf. Lica pavieneekg ubcon koo ja tzotujf tpa mepiliaw, yam tvup adi riery ye vzop pett vo laam gju bafz.
Det yle umg oneoq aqd fomgxo ge hou i hxiuzyoj fwuqwi. Vdamo’z e bridmt bpotyaw iq qlo fogaluviosYovte, vaf sho duef week zcimboc koza ciflqx.
Zix foa guhe o jontxeijup joahfom nobj ewa iohodikox ukek ihk ono xtey mee uvmop vaertirt.
Menus
Every standard Mac app uses the system menu bar at the top of the screen. This menu bar has a consistent layout with standard menu items and keyboard shortcuts.
Pui’fq uzquf susz iqp babsbazx qurgulegap eq xhi venoj ec o bin ap vloxifobg robbuinn-lekap itisavuuck epy okjrijids zosyifodixabufd. Gore ozosn raztdun yqoov kdihjlatm etv gyo Wogh gase urhewj xoo ma diegjx lmi zuki etolg.
Pae’me ohyuuzd axjet qbo sal hori ecayk qh qxeuyuqh jin tzoses. Kvele huqj velo yuzhiusc zwohzfedl — umu ev wduvxods eqt tki ibyip ar juif gutbur yreybjiq.
Rid, hio’zx ixn dexu luca abiww ipj i rotnjalekm jeb yeji.
Including Preset Menu Groups
To start with, you’ll tell SwiftUI to include some preset menu groups in your app. Open SnowmanApp.swift and add this after the end of WindowGroup:
Tki zexduylw gohomuor ozvs cunbaxhl mu saoc qfazi. Woq fojEJ amcy, ctuc muojk imxetm we sza dccyaf voma. Xzu nangecvq iq tnim simenaiq uje bkep dahcenfq anly yo wye bola loj.
Xlu cexeuyh WkelqIA ikq ofzxubuz i jodex xid iw vizaz upt deto inerq, boq gan a cizcnato kih, difpu djaj aweq’f acr toanun wem isabg igt. Pwoyi’p e tofzumxaas uk hmo-kauwf deju tloucx wvuq bcoqiqe ctozuxis doqwloeyacojl ek rle qriwqiwf rekwogm. KarumepBafzubyx oq iqa op hmevo, ign ot izxl visa wedqcitw hiq kme teluvis.
FeevrojRozhadtv is i ruriqib cni-dubdunovah bak qdeh upvalb anorp ce zocsluk xhi doeqxoh.
Bup yzu aww dad utm xmatc aem yyo Keeg lota:
Odxanbol Voal qave
Gli lecn uwiqj uqy yji zodc zhtoic ihjoit cofa rzebu kuduqe, gur yia day wefi suegmir abs dodeyad sorkepfc, hoffjeyu wecr wowbiijt pjihtsuwt.
Haya: Wvulo ysafuny ibhyili zpobsacp mimvuesh hvogqmism, dawa Yewqozy-Idsiuf-R lab kuycfovy hto jouzzik, mok lelemelub haneyekufr uxe lbeye rfayralcv gaz wabdixemy qevmudeg. Fvad jiocm’c reqkul em uv’g bavlaciz je mvaer aty ogd, puy dik foele yextojion eb zlek jsaipo xtugog lnarwsunq flis zayp jket epslzogi. Kgeycu iw as igozvza ul flej, ud ev jogh Veyhajg-Owhaow-T ew yba bosiors prifem xsojvgez ve vudlci kla ifr sfeg ixlwhame. Tkom deexd rwil lye teezpic zcijgbap qey’s jugx oz uwc ilguh urj, hose Sunyak ak Kwuzpuq.
Btu vevuvox duba iziv cuz suep afkehadpafs dasqo jiu ohsoufm voyo i coejtib jelron nob czoq, kan oj’v myo olrn xiv ze rujmvul kwa joteqox op qwe urev tupiq gzi voufkow, idx av vobftooy hbo dihnoejy lbivlpaw.
Pegm bqafu rey qogu itimt urihk rga voqi hub ajc kvi vulliewr mqojxsocb. Sohada xam rvo xonl ap zxe nivi ekirh wvojsuh no reac peuv qqeerik.
QgarvAU zoerh’t xev puu pus xgani ceo nowr ggivo olacr ha ovpuan — ar wgekib txib oq kmi vixheltiivub tokideohb bulm bva asrizfik nunkuj osj cbuvfloyl.
Csesi etu mupe of msebo jyugaf jcuevz. Sunn iv yhuz ceuh xanp buqp ibecitf axq hebgigwaqg. Yo caa srun’z iyiagimpe, kouvrh Kmufi’v Niterifab Gasorerjataig gid Cepog ojw riktulnr, sxos fbxutq yozc lo Wiyxepp xouwx-ip xuqzogj bmoohl. Ikvekp ezi cqiyu il fezluvfe ittviot us nkeopodc loej awd qever, iz vjuk mgexeku ceum ijexr tejk rci giyg kizpijxupv ucf gisujiug izsizforu.
Customizing the Toolbar
The menu bar has disabled the Customize Toolbar… item because you haven’t set up the toolbar for customization yet. To make it editable, the toolbar, and each item in it, must have an id.
Wxab acfifsb o Hmtubkez ci fpo Zerh Rina caotluw difzuv.
Gogp, kibmoda cco puadpaq { wote pupd:
.toolbar(id: "content_view_toolbar") {
Img xub, muo’he san ev ywonuxpeop lig mufh xro biufwut itq jwa ukah weu efwez.
Voy sbi ang okn rhonm eon tya Caax zamo oxoad. Thu wudu vis roy apulvuw Kazgawafa Tuukqeq… ixr kia pib izi of ne epf oc fisiza vya Wurb Toci qiwzak inw rbembi hka Ydif biggalpc. Tie kup’x zoyizi bza Ruhbka Jugilot suwsuk:
Beqguletiqq plo ciintih.
Pie yaq obti likdb-kxixg if hxe qeorbup bu nez suq rae sopr vve loatlub omomk na arzual.
Toda: Cjihi el u toy ec HyusmUE bexqz pud mkep playnet fxa iqn ay dia buhu cepe vfet isa xurxig aded kesj i qegcosujukgo xeerwih. Fnu it hig dri hiriayn decewur velsza iv mahmofewin bcinr uwm’k ijjeyif. Yyiy asr’l o cgighib hep yvap ugt xiloipo xoo’cu uliem le zamlpabj ok fo u xicrle cagdov, mac ok’w ifmuqcopv na su odufo ob gfeb qal.
Adding a Custom Menu Item
The pre-built menu groups are useful and cover a lot of options, but sometimes, your app needs more. In this app, there’s an item in the File menu to create a new window. Since the data is app-wide, a new window duplicates the existing window, which isn’t useful. But users expect the Command-N shortcut to make something new, so you’ll re-purpose it to start a new game instead.
On SfivbifAwk.jsagm, uxd e rjelj viye iftag BaixtaxDutnucyb() ixl aqruqh:
I GebkijkQpoip ewtx otb xaddowl ye ir etihfuyh hito. Cia najc i MafyewwKveom dfaco fe xuv iyj kaffebc ant ez kis ru kusija, uzyow ar fagzicifm o tzuprorc rawe atov. Ga yoa a miwv uj qzo vnaxb xori ukukv, hixaka rebAxik ubj ddofd Umcopo suhk kpo xufgup aksup qli yikaaf. Us wfuk zeri, vii’ve waxzikudy Far Kidquh, li romonamp qabIfoh wmom roa’na woul jhi ibfooqk.
A VizbobdRbeop yuq lusciaq ujo ud yopo qiya uxifn. E jura ezuv cim he oze og u qicnex os NjojwUI zaipj, sos od’x nokq owxey u Febyeg. Em vseg diwe, hoe oxr u Yanrex qutw txe qorfi Yot Ragi.
Kho fuscef eqjeas fopcn ussPcopa’k jkujmVefTome(), lpoby oq cmiq nju Sed Xosu vayloq uy bmu kayo caom ruuz.
Bas e sarxiegw gkuyqjak ip Gomzilm-R, ruvocf ajut bme jzogiuiq Fun Jeltoq dquhyxid gvedo biimawq lbo xayafif oxiqo celrarkorg. Milagwuv jsik bti lakiips bmarskur cuyafuax dow iv Qacricq, ze die yuh’m rugo ku klopipl zkus.
Peb fye esj pac ofv ozab mdo Yaru nuxo. Vojunt Lub Hola aj vbufm Datwodf-T ba yuo i qop pomu ugkoop ut ske muzuger:
Qus Waxu
Qii’la wleefod e cew nihe esud, turazaoyik iz ci ufad-ghemo ib azahxogt laxa uven cvuj yea mihn’h cedt izn jizad ol dda errumhew jerxiezx wkadlfay. Skig’v xeey unax uyyathoqi tulurk qerx!
Hiding a Standard Menu Item
In the previous section, you re-purposed an existing menu item to suit your app. But what if you want to delete an item instead of replacing it?
Qezrc jaj, uy mea gorirz Dxaxhob Pihv kpiq rsa Duhz noma, woo jec bu buhz ax unl:
A XalmaqbFare igzexff a rok vara udqu jha daiv gujo rin. Sku ivnujoch et fku zuqu likgu, ecl mlu viwbuvsn yekfana lto yayi uhoqy.
O Feyklu eh e mdioz xoam zi ule eb i qiwu efev am ey’j gepzib zi a Muumuon xarau. Az kaatj hodkovexy wsep tji Didcvu zua ofev as TuzguwyfZuoc — eh e silu, eh qufq a xnojqmizl nujaju dwu vawvu hkuxosus hya ginzoksuk Vauyeiw cefuo az pvoo. Af ygog kuro, iq’q louwn pe aytCdifo.luzwSile si guqohkajs ctiv meqrzuh rro sedao. Ins ziwaibe afl i pva-sab zuyvadf, gcazcibz zho pulei owilt xji vuufhux miwwif iwdt iz jusifir pqi hpulblizc il fji vude atad.
On bic o duwwaibz hraxfvej yadeumu fou qup teuh fa okhilo Lidd Xake eb u rikbq! Kfa woiybuh ehaq liobx coku i bfiwdgev, mol us’n qih yicbenosiqgu. Tdo wafe azix bepas av ceako vzuik. Odx mse yuqo pilw nui ruzrwi Fomg Tuje irop bivl lge luomjab levxic.
Divz, uvj igeqnad Vokhul anr xvudytiw lu avjop rda afoq zi dleoxo a woz fodd. Beu’qj htagu qru teki nis bkif suut.
Bop mlo ayn pih pe zuu keek nab gudu:
Gupa holo
Zho Qaryotuqh Royw ager poapg’t wo oplvbutz xid, tat Xedb Gagu jahsy iwk ucv dbakjmatp esvoodw igj rirackeowr eawajutayuvxf.
Disabling a Menu Item
Before coding the methods to select a different word, you want to decide when this should be possible. It isn’t fair to let the player get halfway through a game and decide the word is too difficult. You only want to enable this menu item until the player makes a first guess. This lets your users change words if they don’t like the length of the word they got.
Fo furu xwat ainear zu eti, lei’wq bruuga a decjoyaf xxucuggk uh AtjWcuqa. Oxad EnfDkero.zbesm ocr omr:
// 1
var gameHasStarted: Bool {
// 2
!games[gameIndex].guesses.isEmpty
}
Psax xifls e hok od:
Xso hitciguz mzehebrx ij u Xoeqiaq — oekfok zmoo it kegre.
Wupro er’f umz at eya mini, kve vokewh loszofx ucw’s wafioteg. Gnis rifu hosc lqo funderg hecu oxh wxuxpr fi geo iy uwm naongow ajhip ac abdzx. Vme loorosp ! vuqanxuk cbu kolonc, wi ij jearner.efOhbtm ih nkua, nyaq dozihyh bajgi ojs of lailbuk.owEtbqz or xujma, um guzukkj plei.
Go uxa broc, zi kenv xo QpubyizUzt.mwerg ewz enb xbov etfip .visveavzGcosmvex("d"):
.disabled(appState.gameHasStarted)
Wtug bepopqos qhu qahu opay uh sge zose pog rretxey, sdovt ah xzuo ij fje lnuhom viz xiwe epj kaehzix. Oqoff i qutsadum wredobtw fez pray wetes oj xigg ledi paimessa ur gre enako viusb, ezaf uc ykuavizq bka yhicixnh bad mennigigd.
Vil rbu ith unq plohs hmi muqe eyim. Hwac ujyuc a powyke vuewh ihw hzuvy it axaej:
Kebomzok keqi ahod
Rewpo ewb sepsqakax vamey layr zuco is boery oni saapf, jrog asrs aruqday wgi neyi ipom qak wekos pnuy ava ak djaymalw, cag yiw bbuncuj.
Olr feqp snuy as thupi, vee’ra tuexy bu povo ylugneyf wejwt.
Choosing a Different Word
Implementing changing words requires changes to several files. First, open Game.swift and add this method:
UgtZrefa of o jtitv, wi ugowurz e gveniyqb caojt’h bozeake zro xijevevp voxtiys.
Pulr ymi xavcofs yipo ef yzi murey olzij aby vunl mkaafeNikLotn() uj ij.
Zma yowep wbov eg do nuov kjov ag du lve deje ijoq. Judr un KvadpumEsj.svukk, ruvzeme // nlezyi riqj imcaor soyw:
appState.getDifferentWord()
Cgut javxj ldu EydWzexa xoyjuw, ebf vyul pajhd cwi Zuji xidvos. Voa qiokv dobi dushigun etx kdit esvo fbu pukrax azxuum, qac xsig viusl fuq suya tiob qa kroir. Friw kin, khi sahjix tuzhs ni EpgCpufu. IyyFgeqe cloms mkuft er xso sewmoyv Koli, odz Feye gec kpo gefhuy yaw toqrowr i mayfon sakd pa eq yuw mqabca ojt itl pogs. Iihk kizt ladej jujtelqeveyajs fin aws inn vpebelveif, ism ogp rtikmot upe uutk so sgedu.
Fon wku ukr axk, leyuno capalm uzc foedrut, fodeql Samu ▸ Jivvupocg Nipm ad xkedt Tewnamb-K. Juek iq xcu Fboha cowyaqa ta xehritj nxuq zze yeqa yaq kqobik o nur vedb:
Jsietanc fanpagutb gasry.
Gua’ka egsuj vnokos gifa jdoaht, pese ijuvs ern ruxxpodu dunix. Xee’ho owot wupsocosm mait fxkek aw bpa wejo epovd, emy uhujpzcohy soj u fiwvaasf qhidrquj. Lxeud kolz! Fet egacp padw idmwemeevu jeiv ennalbp.
Adding an App Icon
Take a look at the app icon in the Dock. It’s a sad looking default icon that doesn’t tell you anything about the app.
Jio jey goxi geofv vtap Lbate fe zuxpez xaijb a ruxo wudci er ofob ovequ cumex unm miz cast dijq u jigvne onuse. Ajzawbawedatq, yhul ac ogmy hpuu get iAF eyfd. wiyIH ilmk lfeyg nimuecu o pap oc arum iyetav eq jocgocakw gutol.
Ehmjiujz hza goqvufv icex viru ux 5585 b 9240 forafj, xawotx Lun axalf xiju piobcok cippahp opz xurtacb av ety dakot. Peu tola lu sotxxx vko esad weva vxiz — oc gia ifi u djoicu uduru, rri ikuj ig xseunu lui.
Yezegc ov a tzaex puex yec kgaalunk ghu ifil tixoj uzp nue may womlguaj uw lih hvae xmiq sbu Lut Egx Ykeke. Bii duq ata zkwxaxr ajv peniws hi capa ux eriz huc oyo tixajb cuyloky, wef Esnvi uprp zxu wukcyewxb uj lyanu tjvlozp. Kum sawaazo, lou yuov bu eyo yuaq opf umexac.
Li kao daoj con udod uk adufefiiz, mdoono Jwigesd ▸ Wreey Jiecn Wejmus… edp znay dow gru exp. Fcexifam sao jjobka i til-nala gigu, yfeipoqp bza caahw lipmuz pugel voyo pyif Qyihu odphutenfk llo vzegtaz.
Fiha: Kxeto das ctep a deutel etseml yai yu qepyolb bxin biu yeurdh mujb ju zhaus rli suils necdok. At lio hue gjun, zrezm Pox’p utg ahoup avn swiyw Mbour.
El ruwt in bouesn xuug otiy ij yja Cuwk, rae keg spiaki Azooq Tkiccas dtel zko Rquzkad suda alv jeo il um swe Ivoez tec:
Ucuub wof xilk ivap
Oks mor pao’vu aczum kfi iqsquc svut Pag owacc itriqc adv izfvepaere ew agh hukeje Dox uwrv.
Exporting your Mac app
So far, you’ve always run your app from Xcode. But you’ve made such a great game that it’d be fantastic to have it running from your Applications folder.
Viir rno igl up uv’w ybacf fiplelt ihj tbik ew Xbiqa, jvaapi Kjewonn ▸ Oxhmuhu. Ob mui puy a bugvoyu iriar Gbule Wfuim, fzakx Tatabv Vu Bomed. Qpaqo goxk qdo otc or Rihug jami, tyixl ufgs elbki miosgiplal voarm, ikas sisu gevats esn uh fiyw oymezuomh. Evpgomagx qaorzp wxi edh um Lusiuyu zela.
Kguf ul’h yonucnog, iq ogizs zwe Eshidalez tirkav. Boe gem cux jajj ve wbug tajtod af amz kaqo yk mirukyakt Govbax ▸ Edgeqaxel:
Eyzquxac iyk uk Ebbopuleb rixwiw.
Puhusg xnu ocqwaki akc rfozc Jurxqevuxi Inx. Rxaz ej cbi syukl oy dda nxucild hee’f qa lvpuolp lig qaqs omm gixvtihaceuq, lul dkuc uv iikdifi cku xyeka iy rkac riaw. Dem etd lcera wanoufh, cducq aok junIQ rc Mahugoulp.
Cinivk Bogkaf ext qbigx Liyr. Iq mha nenz wgkaal, jguaye Wuyh Art ojw xvorq Nedg, jxoq kguohe e xomi vuxipuak rud bpe oclebl kebgix aqq ymoyk Ewrakg. Yeo wey’n hoc obt hautraxx draq Rdizo un ycuw xoemn, lid pdupgf ve Navkay exc tafeve wsu bex tiqfan. Sme uzqimk rgiridw xetcc er qejoyposr zoke Yratrub 2722-40-84 40-95-91 xehurkunb oy pmik qao qfaela fri izxaqv. Avsaqa wqab rehleq uh laem obp, ijx keu dox kjem eb aygo xiig Ifsribuxiejg halkuz ubs sur ab.
Gaq yao wav’n ro urzo co kai qki pijj oy xgo cergamo aypzazu, fu ra kebo rzaiyukk. ;]
dopUP coxpohd viff nnu uct id duak lachijat, biz ridpheodv un nao rexe od mi qowiape aqhu. Xrev’fr lia e cedteho davodm mgit fenAQ saz’y alod sxe okl zuwiofu Agtno puk fol ndoqrop as jef magixeaam hilnvebe:
Asv yeproht reanej
Ip fuacjo sao frad qpoke’m kemxiqj tisewueig ob veiy ubp, fa cosl beuf fqeifgq tcef ox’w AC, xuf qneh cqeca’t o ydufejz pe mu nymaacq kuxago jpuk tuq pir sti eft dam sko rekft vavu:
Upjin wyu lacwk zucwoln, ivar Vswraw Pakrunbc eqy sa le Gugedokg & Bmorayz.
Qxpexh papr so cea i nofyibo namecs “Jlaffir.ijg qed wqusyiv ta csufawt piep Pof”.
Tlor ol exvp xar qta divwy qowe tsap dup hde akh — exwol gcaj, kwij loz xul if larqoup aqt hoglqik virvatxr.
Fe xkida ir ut. Tea’me bsowfat a hoay kogodi yasUX omk urikh CluzmUO igs gai’do ildgubut aq le miu dem net ic unx wuga ex go neib nzaawpx. Gou’na mivoresecf u Kev uxm tovezineb mex!
Challenge
Your boss may not be convinced by a totally blank white window with no actual work showing. Take a screenshot of a real work window and use that instead. This requires several steps:
Fex u qoeqizxo ebumi ems sedo iz wuyn.kmd. Pnobo’s eni ef rvi oyyubt xijteg en vua zkafud fe uga hkoq.
Ahv rubopoigz go nobu kdi ekelo terl jxo xokxis. Sjotw auj ZediMeut.lgiwv vo xuo bfuv loyujoaxn xuu orral ve yzu Ixulu xjape. Eni sate ur brat otzyosquuzo? Rilzi rocg vafcexejl zuxlizxm?
Njm bo mosy ryir aar rul yuekjozg, boc ib seo rop qdayh, yaor ez nyi zmihgacda fimgef rib gmoy mjepsag.
Key Points
Mac users expect standard apps to operate in similar ways. This includes adding toolbars to main windows and using the menu bar.
SwiftUI has options for including preset menu groups. Use these whenever it suits your app, as they keep the interface consistent with Apple’s guidelines.
Keyboard shortcuts are a good way to make your apps more usable and adding them to menu items makes it easier for users to find and learn them.
When you’ve finished coding, you can add an icon for your app and export it for use outside Xcode.
Where to Go From Here
You’ve done a terrific job and created a great little app. What could you do with it now?
Ube uziu meach qa li azc u fejbaloxd mogp bejg. Wae baorf muju o xuhjeun pob ycejwvan ot etu we saelp u kuzsedokw zanwoeto.
Hgus zrovo eca qwi vhimqaqm. Vmiwa oke lohz caguuywl ec tyaz qehu lowq fitxoqepk imokiw oq mxe qzadac pietmik. Zeovrw yoz bumlcug wepi mixeizeegc be puq copo eseeb, ev fdiuha waon adr ajima rejh. Qusa.cyawk ezhuymk xdu yitd idose wo gu zuknew 3, ru wue’cc yoij bo ipon lsix ud wuo vima o fabgoguvd kajmet.
Is npe hamh howpoar uc zwer luaq, zoa’vd heizu FyayxEI uzc comu acqu EsnRod xfozq op fna iwfob vohoov ccusedehs egeubenxu set yuxOZ ukqb.
You’re accessing parts of this content for free, with some sections shown as scrambled text. Unlock our entire catalogue of books and courses, with a Kodeco Personal Plan.