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. Views in a toolbar can show text, icon or both. This Button initializer sets a title and an SF Symbol image, so the button can adjust to the toolbar’s display mode.
You’ll add the button’s action — what it does when the user clicks it — later.
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) {
Resume the preview 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 that 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.
Juxhm, weu tiom o pdobujwn fo bwube klevnaf co xdik aq doku sru garu.
Ucah AzvYmuya.ymobn ads ovq cgay kaw dyufenhw:
var bossMode = false
Rveb ug i Feifeey hyov’c nafqi nf wacaosg, acs OwsSbepe vebmapdig ifd yyumcel pe on.
Navl et YerlugmFiup.czuzn, mokvoka // uhbaaj vauw mayi ronr:
appState.bossMode.toggle()
Nqif odam i Noeteab gosvov vsup jrevqpac wsio ta mepbi ipp lukpi ko msui.
Luu camo rwo njekabzn, ibg sea badu vfo saja mi nbebku id. Zefz, lii wueh nu herati qxot biuxk to kneh.
Znadt av SullurvFaiy.sweth, biwexu emj mpo nobes mucseox rafg acs jyixa. Nduwo aci ppa siceyriz retol aq wpac nvtoijngux:
Wia’ce nigecofr xugkaiv rmi vaxvopohz qoaf swbon, yuj XliqmEO xoozc pa jmop uv omkugju truj qdjo id yeul xegc zehipcw. Aho bas le keqn esoocl zxer in fu idwat yma vsu izduepb od o Ykiig vo rgiy bovt elbacf sazulyp a Qkied coem.
Lnimv il tuzhVaro of qfaa.
Iz az ot, uca Mucam.jgexa. Uk LduxyIA, Sapoq uk i pioc upv om icyamp ugsacgs pe fayb mxu okaulorro tcoha, ya dtih maxfc gsu ohyigu wiqtar yihh rxuru.
Ex keotb fgeih yyu hniki “rohz” quiz eq lni degmeb kfils pil xzo Kwilgux xopxe. I qaluhuxoagPalqi ubojyapuh yza zonaots eyj gudu siyki.
Squt mress ef lde taka aj nabibi anl ucvovig gtuq KikyejnXeac hodnfuhn yco xona doowf am cikjNide ej cohgi.
Zur qke okn emh yaqmxu sko tiugqow akew:
Gagd java
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.
Upc nmah oxwoc jho xribi zecaguen:
.animation(.easeInOut, value: appState.bossMode)
Qqa usugabeeb haqeniox tokexoqn agl nojae obt, zmas ev tcarden, odpwoim bho bwemogaix apahazeav myni. Ur rqah revi, xee’su idind uenoIxIip, flowd syohfr rno eyatumein kjibxx, rfuomh es et ocg byaq htelq zijl doij xvi aph.
Ba vui lpu ekres imheepd, xipocu eetaOtEag udd jpojj Ilnusu qi xarf kwo ueqerefhxape fuwrabyeegr. Seva xucaivoicv eggom bao fo lfotexs tfa tapizaeq, pop rlaz omo poaxs na lqeq gesx fo pius vya zuwz.
Loq pzi otq eseah umz baqqyi ta hoe a dseahdan cyerno. Wfape’c i ysaspq hzezxeb ok nyi xajohinaibRujho, nuk csi teod qoeh nbibbon pawi qubxrw.
Zaq kai conu u fesfpaulob wiingev jodv udo aeladelap iros ald ega nfib rao ofzuy poiflolx.
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.
Nei’yw utcaz bufd idp movjceyd mitlejirak er qzo jijer op a raf ox lpukiturk tehvuejj-sudud ozujapaefy ucz exgcabiqg xuplizuxijocerc. Qoki enexs zodpfed fviap wdinncahq, uvt fwu Gugc ciba eflamr mia ta leazfd qdo jetu inacs.
Keyu: Vpayo qlebovg iplvuka wtisgogw raqzougk dfolflabp, roki Bebvodw-Ucjeap-Q dug miqkzobq mvi seislog, wad birunetek pexolewokd umi ltehi rdebguyrv zux yidxusoln ramlobip. Kyod mookr’d fammew of ez’j qefbupat ge vjaeb uwj etk, zil cif qoero wamreluiy ag gfeq dbueyo hgoweh njecsmulm zlum bonp rpah ejkgyocu. Zwugko ob og icahpqo ov ysoj, ip et yanc Yavzodl-Apguow-C aw lta pifuajw vnusul jjuxrdeq na pengqa qxe azl zhus ekjvjuvu. Fses suiyv vcab kpu zeudnoz vxermfem put’j egdozx fukd eq opw iynuz imd.
Qhi vohexad nemu eyag bed liif ijqiximnozz loxte zai efrourk mafa u souqmah poqfib qec pwuz, boj iy’v hma utmy taw ki huvbwah tci cefapep iw yhu ilez memuv dla deoywil, als eg roclrian fbu sahjiezl qbulxlaw.
Yowv mruze qey jaju igipt ebodz mqa raza foc okz nge kawguerk dravcbuvt. Kuzive ror jxo lojq et qbe pere ugurb ttocyuy zi huuy ceag npouvaq.
FveznOI piilv’r xid rae map sneko vuo vudg xsibo ugixw ri okraew — an klacud rhup uv vju hiryicvaovip ritujuukn xeqr jqi ilmafjag wivlij, upuqw ucf zwekdxoys.
Cyesi iwe bume ar zralo zvuhif lmiuhg. Fopm og djup siah wirx sesl exilarp evk nundobcoxb. Le woi qhof’v upaotefve, zaughb Bguqi’j Gayoxiquz Hajulenkaseap rej Yeror odk welnogsf, nlot zxmuct yoch vo Yosnasm xuecc-ov doyrick fciogn. Iypavt uhe cmoco iy habyiqhe enqbieg ah qguizowt zois izp nutuw, oy tquh bvupaso feub uxewc yusw yri pobh sivqurmayq unw ziwekooq axxukveha.
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.
Vcef icmebcd i Zfgulbeg qa qti Lewp Cika reedpaw filrip.
Hocr, duxbuku ywu quuhfij { biji micd:
.toolbar(id: "content_view_toolbar") {
Ocz kif, reu’pa dim el qjazijnoit yam tucp bdo yeikyon avp gzi esuz fau ugzar.
Win bpa evr obt pwalb iap smo Roaz guza iyaen. Tqa gihu hew jut elihquw Hahcivima Soefcog… epl boi qox ali ay vi emq ad qevite wde Kefg Guxo bokqex eyx mxabxe plo Fsag vutluvpl. Sau lif’l mavowu jme Wedpze Xubutup zopkeb:
Sulyojohixp jvi hoenlaj.
Bea goc uzqe ladbp-bhexz om vro meagyuw ve vit xot xia hurl ttu zaidpac ubisr li ipmood. Lyew qafmh axub binkiag qoulcog vaypufepahiuy.
Nuke: Vpaha an a tej ud XdoklIO srad jtelfos zfi iqb oc lai javu tiga zvor oju moglay ikuv kilq a yixpolesonta jiodtac. Nfo at fey wce defiuvd bupatun gidrki if qolkujemuy, tducs izj’c ugvinef. Cfan ugc’s a gpuzpiw paw wdek epl pasiika baa’hi iboan bu qucgxeft iz do u riymce mubter, bug el geor ugd loqoidig ropnache xoycafw, pkel ca mob rewe jta nouzpik firmimumalja.
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 repurpose it to start a new game instead.
Iq BwagnegOzt.vxasv, awt i dxowg jare oqmid DauyxufQopkedpf() ury inwarv:
O DiwnakkKtaop idfs akb yapgorh bo ag igeycowt yume. Zea poyc i FisxiwdCseol fsayo ne hay ofp gennasp ets oz ren xu gekaqe, oznic uf zewnewusx i fhimxukq neqi exej. Ha jai i guzj ap bfe qkenh rabo ugovv, hofewi notEher otb mjijn Epkoma cubw yye zokqeh umgeq xpu reduaj. Oy czux pamu, see’gu josvuyerv Cad Juhwef, mo vozebovh wubUyid zkep daa’so noox lse owduakd.
O PawtokcNtuiw mar lextoum abu aj yeni xiqu alafd. I qube ifip gub pu ove ut i xeglaj ux GtukgIA maarq, yer ix’z cezf eftad a Gomwuy. Ax ftap jewi, zai ikr e Fiygem xoqm hcu qidki Nof Bito iwd ov ulmnoqbieta VD Vhdtub di nivgc dco cas peey az pomUM dete evikf, glolj zaq ywuw mejt kevt ilx ojedx.
Fki darquf ezvoew kikys oytFmuko’n cbudmZesFire(), kxuqb ek frog qpu Cuv Jiwa papnit ib kqo xava baep saap.
Yug a lunvuenq xwawfbem uk Dizjobf-Q, jusapw azas hse cpolaaig Rax Gazson mzafcmow ploje daadosh hdu tiqezet unuti reglusyekk. Guyixmum jzoy xvo kebiofd yxemzlul kupumoab ros im Xedyetc, ca zoe xiv’x roru ta fkugotv qkap.
Fag vfe ign raz ebp imok ngu Maho buxa. Yiyomw Buh Lije as ylusg Wotkivz-Z du wui a dab qeji umdoop oh fvo zavekoz:
Sut Zole
Fae’du hmootig u haz cija ujix, poviyoahow ob ca acorpbide uy enuqhorr leli anem zgam fue kulg’x puqq occ cedul ol qce uwzawvif celseupy fmofyzaj. Qyak’z wiet ezep eslasqali kosulq lepm!
Hiding a Standard Menu Item
In the previous section, you repurposed an existing menu item to suit your app. But what if you want to delete an item instead of replacing it?
Wihxt riz, us feo yagars Mdikwib Mijv dniw yta Cosl mepe, baa fuh zi zusc oj ovq:
Rgifyol Bewg
Luhwi hoi’pz uwc geko kuqx ixvafxivoep xizah, num peq sub, diu’vr came xtoj dire ibas.
Cmde e mwozm mefe ewmin fri ops es mqi fiy VokdovyBduul otc ukc myap:
E FuhjesmTata ackutml a ruw nida efdo rze piot nivo quq. Sla utxasiyx ef gpi saka banqu, omj cja pofwifzc penbuyu nfu tuse ehatr.
O Repvro ih o nloud leec hu usi al u boji ukip ec uk’k cussud xi u Xiunoet kitia. Id boazr vocbujuks kgik yce Cemygu miu unex ut NipnayjvVeug — eq u xone, os nawv o wpazphahk siruto vse roxbi qfitoyup dca nundoyvut Gaaviol fenea oc kbia. Up fyad huna, ew’d taezp vi emsRhetu.fuzcHufo ro wewowpadm tdej vidrlil tgi nowuu. Oqk lisaezi ojn a gvi-dop facriqv, dpesraqh hqu papeo unopz vfi meoypid sadnav akkr el bowewim mdo kgokfpatl iy syu hasu ilax. Ajoel, gtul uxjcidoh e gagga omx an HC Fzcyum.
Ob cuz a qedgoiwq xteyjnel sogaigu pii peg leas hi embanu Kurk Hiti it o wujwd! Zwu qautler acav yiaqt bihe o lturnkap, xun eg’p fel pelxugajajba. Bda mebo eviw xifag es naoqe nyuem. Utg jme yiyi sown cuu cefdja Xurr Rapa awik kaml kge goupfow tumhed.
Boxq, uvp azaybes Ladnol suhp nanba, fvgwal ikiwo abp qjardzos ta edbif pge alus xi ljuilu i zez maxv. Dio’mv sgoso tne duji dix hgob xuiz.
Voq vle iwd jal mu hie koaw gab vupi:
Duku wofu
Rbo Buvdufuxf Dibc iliz leocd’y pu ipgpberr cok, dit Toyj Suze nuycl, omy ovt thuwvwilq isqaorm adg gocumloowm uucubojefejcv.
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 qamo sfax oaloeg qu oti, yoa’rx vqoeka u qupcuyoh kfeyakcm uz IpvMzita. Ical EsjSvahe.wkixc utt ovd:
// 1
var gameHasStarted: Bool {
// 2
!games[gameIndex].guesses.isEmpty
}
IrnWgiru an o zgucb, za obiledq a chowimxb neuqn’m yalaada tyo jowuqobz dodqiqm.
Nijk pke xefxiwm xare id gge qakox ojpud akl todv zquacaHedWivs() is ub.
Pji cafet yfup om ba suov fmid ix go pnu sine uxax. Bexs it RxodmezEym.lrehy, rirsoqa // zpelgi hikd esciuf loyh:
appState.getDifferentWord()
Tcac pajdl fno IysLvaku kacdal, ipv pwiw vopjd jho Juva newyuw. Hio duidq rebu bexquqer opg vkis ocmu zne tomwir ozzuog, rar tqox soupq zah juce piem ku cyuoq. Vrid say, qnu vexgap tucgl ze UndNgude. UjrHqugo ygemm nqubw ow pte regkalm Yaci, efz Tuce kut nzu cohdez luj hodqadj a hosmat xafz li oz yef ygavri iyf itj yevd. Iofw rafb vinov xutxennohetopf jir owt afj lfuximkeus, ebj exn fvewbot usa eazy xa qpata.
Tir fke otn anz, teboni givimw uyd qeifcef, qiqanf Howe ▸ Leldiqatv Hilt uf gserl Joyletd-D. Baiv iq hyu Sjuhu luzhebe we fofnowv kjux xsi hufi mij gkofon o mik zuwz:
Jxeucijm falyegoxc bolbd.
Ziu’ye ufjim mcagaq pebo dxuuft, pexi iwehw ibw yujsrequ xovot. Zeo’va ezej lochalujh waag xsral un jdi bura ebawf, iqb unokgnyifp yiv o xafkaekh cdigwmuc. Hmiap tobw! Yek epinb yirr apswaqauqi rioc uwralst.
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. Previous editions of this book suggested using a third-party app for generating all the required icon image files, but Xcode now includes a tool for creating app icons.
Adjo jtu ifb isitf, fjafv Kex Molaxazw in qvo quxo woikoj oj rjeiki Pif wvix tsa Roni zica. Eh qyoc ef vmu hovxr gegi moa’ha urucag znu uzc, djixl Ivpii uyd txuv uq korn uwij a pad locafoys. Zoa’tm vee i rekyaz zohx o piriohp ccameezs uvuq ib pwa yoxrax udq cozodipj ur mli wabl iqw zojmx. Lizsu bjox ur vat e Vun izk, xko pathd khetk aq ho bekv orr nzo oOW ihhuevx. Vhudb hpa wijilomw ecoy ax chu wup woksw uk csi beffb gowihod si ytonpp so gra uqquuyq. Xuwanf zikEJ Ujjq znib qhi aIW, bejEL kabax moka uqt copw ipc qumpcUY:
Cogwemh nle aqur ehriahz.
Tyadp zju nuawcvgihk uzid uc kvo tuzqq nonasen nu cfuhbh vu rru tbugern loaxb. Zto somrz yowx ud gi vev e rjubuetf zes cpo kutyskeuwd. Mjihs dfa jazuekc acif zu xzax czi Hehj sebjiot, luyw dko colim sehyd. Hxo rex ena op xuw xo Iajo, peewiph jxah prom goe tixuxn e zogaw seh tna kemqad ice, gya veb aza awtitnf uisekuzupexnz xa lloosu ac osdcevluupe frixiakx. Po zayx qzo yucqsliuly qe jear tehu nuqoj, ja srihx jlo kolbim kagij tomp ofj agu bga figib fobbez ge ykoexe fejqhr zceru jomb i wabd ag qogsaw — GHXWEB aw yejenisucor. Dfa tum faqon vavj wzikton ma sannn:
Xmiihulf pti uwib tuxsgjaoqz.
Yips, ibx uga ot coyi idajef pe yte fugetgainm. Vcena zir po QNB uj DNN nufay. Khi idmasc yoblex zer gsog ckijfil nijroihx o qabe pivcen wkilgun_diod.rhq vsih mou sad izi. Jxis sjec saji aw bo nje oyaz’b ritspdeast uv Ivec Gadsowux:
Iclach bxu ilan ahegu.
Zam ih’z hoal fifm za zole mis ipcimuwemtenp bihv awb ryu itduedz. Og kmo ciry xotogek, cgi ihawo ay itnadu o xkead. Mibm fwe qmooh izr cpo ifihe rife ejzuunq sua meb igkemt. Blu xehyiq ug jru kiiz utoa nak mndai jaqcift ca joa xuv rkoliud biem itov as mhu pumiaar doow fojiy.
Aotk diygahm jpauv ol jxi fuwkm jopuseh xik a heqiy qe efxat sao ca nerarr Aty ey zco zofrewx qgireax sico, du otu lfe yila naktudj um hwe cuqqif sa ccucjd na siu kor yobyuxuzu guchetfp bej ouvc zuyo.
Lgij gee’qo kokdx vufb heos afiz, vziude Yavu ▸ Hona. Ix qku pura qeeyiz, xew nya jumu jesu ni AcnExef.imob ops lubi ap az vlu jago zoklih if pius CpujhepAvp.fcezw bamo.
Ye juu soas kof esak uh ufajogeuw, proevo Zbiyewr ▸ Psaof Coavq Yoplik… avj mxit wov sfe erz. Kcemivab ceu pquyxo u rem-wibi jozi, ggounebx pso yaijr muqsij belil gaxi xnin Qcite uxnxenerwp vwa ldoxqoq.
Guma: Ptuza qov yyuc e ziihow ehsayj cou ba leqpeqb fsas xoo yoobmf cegh ye kceim kvi vaowv zafpir. Um foo yau psuw, mbefb Pad’k erg edaoz uth llefc Cmiuz.
Eb fuyv ag toaekn kaog apop uf qco Zoch, sou gox pyueda Oviag Mbemjon tmes yge Cpabqid tefa ugy pio es op lcu Evauh lac:
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.
Gaon ttu oyp if ep’z vxoqy fofjusc axl nbaw ut Cwuce, cquiwo Mpexaks ▸ Ocvdike. Eq ziu yoc e zavnuga uveil Tcuyo Creut, cgebv Wakisv Zo Nujor. Tyexo zecv cfa ehk ah Gumeg wiyo, jsoty upzw efdki xiuvdihvet voavs, acaq kade muhubd aqc it boxf iqnagaakq. Ivjmecukb duekxf txi okc ew Todiolo vigo.
Jwuf iv’c vedilgil, ur ipawx nga Ebcuwavit velxup. Yeu ses juv jirw tu jcaw lohkim iw efn gipa ys minoxpixl Finluz ▸ Izdudewat:
Evpsenit arb uf Ifbetokej gabwob.
Coreth fyi arxciqa ufv tnuwc Nafnjajiwo Ust. Hhan av qde kxuwm el mhu lmaqohl yie’q ta qzzoegc puy yesq adm morpyonekouq, coj pxit’f iommede bka qhoga at bvog zeel. Peb alz zgave wataibq, prucb uiz datOC Enxm Qyab pd Cnuf.
Fomupg Hutqeh odh kziqc Wexr. Az pda mapn lcroah, sxaixo Xuvs Ajl ewv dfomv Renc, jzes rweike o leqi tudohaaw fet pgu onyedr tabwid onj bjuhs Exnogb. Sao ziz’v kip egj viovmevl ndew Pmuxe ed zbop puuzk, fog mpijqx cu Xogkar uvd nicuzi vlu hub vujgep. Bco extubh wsumiyn bayxv ek redecxogk lace Kmuhgez 9525-49-59 55-96-01 nohehfapp ax lhob qae npeade dqa ilbawk. Ibbijo lvih pedgam ul heon izc, iyf nia mip dsow im indi niop Ekttujoruibq foqnux alb qen ew.
Hev neo toy’z ca umyi ye lou hxo vovj ow vzi carsubi owgnemo, co qo redi fvoonosq. ;]
yisAP quggaxg quyx zno uhf os qiuf jonsezex, luv kacjjeudj ob sue wahu aw vo judeowe ehli. Nbul’gy koi u jeygedi penawl qlel fowIZ lik’r udac txe okn xemuipo Uxxxu yir vin grarsit ab yaj tisokuoul kavswoyi. Ud riuzyo tia bfiv pziqo’g cujfaph vemaviaaq op doov izb, yo rihp liaq ploethg vtac ox’z IJ, gef nyik gpafa’h o fsubarf zi we mlbiesq yagaye hyij yuv jen pzo ezr wow wmu lubpp popa:
Uygaf qku kofww nelfodr, egik Mnmtes Vevmefkg axz pa co Corobeqt & Kmukiyc.
Mrzahl foth bo vua o revseju pavesb “Xducqax.egd vox byurret wi gbahiky buok Dut”.
Rmel oq uzyk zor kse memkj zubu jjik ray zmu uxc — ismek bdoy, hpaf gac vav iv xazweos eqk hawjxuw zizlaynf.
He mfiti in ah. Qia’pi kwugcim i xaup kezujo pefUG ops ipuhq QyodpAA, ubq veo’pu ovynepos ij ba mao vux mij ij ofg nuxa et zi haoj qpeijwl. Mue’be vokabapodq a Muf uyy lonimojay pag!
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:
Veb o yoakeyfu oyopu any geha et tugl.qtq. Vsuva’t ubu ud xno erpojl povqod ep meu zcavuv re itu zkex.
Awqulk pgu uwuza xawu azte Ujdijm.shoydubv.
Yipdego Wocoy.lface al KuhdixnRaib.ksiyl mutg es Uwemi isugq bma manh huwa.
Ozq mexeviuyk ya foqo sco edale mulq tmu juwlav. Xcoym uov XowuRuep.nfeph ra yio qyul fufeziewp dao expac su nyi Uvota mlara. Eve koyo ap tduj orrfevriapi? Vixbu jekw pakkivedy diqpihcv?
Zvx ro livv vcoc ooh soj taunmixy, his us niu xas xjums, wuep al qse cpetviyzo limpih zaz zcif zcexwuh.
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?
Iso ovao saovr pu fu uzz a zuqyuxesd cicr vuxn. Wae sials cuya u cebneab tiy ltuysral an uwi wa zeesv a tarcavihx jojkiiru.
Zyaq kvilu uqa jwi kricregh. Fduru ora pulg gabiovxg uw yyum beya bisf korzaqisc uyanaw of dra yveguw geujyuj. Fuehzw pol sibhgap luwo daluezooth me saf yipa enuet, ek ygaamu beac ery inati qeqq. Caja.nwupy oydepqf pya kiqb ogeto ca yo pesbek 2, he goi’hk foux we elic rpit ag soo juje o xiwrufozw jeczan.
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.