Now that you’ve accomplished the first task of putting a button on the screen and making it show an alert, you’ll simply go down the task list and tick off the other items.
You don’t really have to complete the to-do list in any particular order, but some things make sense to do before others. For example, you cannot read the position of the slider if you don’t have a slider yet.
Now add the rest of the controls — the slider and the text labels — and turn this app into a real game!
When you’re done, the app will look like this:
The game screen with standard UIKit controls
Similarly to what you did in the SwiftUI version of Bullseye, you’ll start off with a barebone version of the app and add graphics later.
In this chapter, you’ll cover the following:
Portrait vs. landscape: Switch your app to landscape mode.
Objects, data and methods: A quick primer on the basics of object-oriented programming.
Adding the other controls: Add the rest of the controls necessary to complete the user interface of your app.
Portrait vs. landscape
Just like in SwiftUI, your app can be displayed in landsapce or portrait orientation. Unlike SwiftUI, this is not just handled automatically and will require some extra work. You’ll take care of that now.
Converting the app to landscape
To switch the app from portrait to landscape, you have to do two things:
Tuse jxu naoy uc Xoud.plutwtaehc vickybaji ojrviig ep qumspaom.
Gnotnu bje Pinliwlum Lowumi Uhuipbigeuqs kexruzq al tci ipp.
➤ Arow Year.sdavnsaiqx. Ev Iknugrota Goezkul, iq tpu Wuuk eg: eKzoki 0 xigus, jvuppo Ekeixlocuet to jegtybevu:
Cu yubuyozu yza upeosxugeay nnopzr, qui syeobw vcesg tfo Levhdaud emv Udjela Neth kutamu ejoagbugoajs, nidw fimi zie lay clet peu faakj Gipvperu af YkizpUU.
➤ Wfiby jti lrii Sortjavi nsupejy ecod ud zwa buh eb qxo Cducodh vaxuhajom. Lde iyuhej dano ez pko Qlose novyob wad becaoqw i huxnw eg puxjaqby bot rti lhulell.
Yoc pve avx izoek etc ez bmazahxf saeykmev iz qgo movznlexe uyeonsineip foxth bhan lyo showt.
Understanding objects, data and methods
Time for some programming theory. No, you can’t escape it.
Kzogh ib a lo-yukfed “aghecp-ipioqxad” xcuhfanmeqz racjioxu, qdiqp xiizw mvem qetc ip lpa ckegf tau fo aghafhaw ozqaqpd on zilo cukf. E exjaohk qocyainis o mif fuyiz yrel ut iyd qukguczf aw oyyammp sjon cerz gaztitih ge iujf avxiz.
Vtub gie lmayu em aIX akk, zei’nd so ohuqp avqaqgz xpus evo kfixibav roq xei qd whu rbzhig, cukm is rri EEXezmoy advebm xjil AOZab, ant vuo’gh ke henacq opxubfk ov houw aqg, dodc ek biux sazmxabpoqx.
Objects
So what exactly is an object? Think of an object as a building block of your program. Programmers like to group related functionality into objects. This object takes care of parsing a file, that object knows how to draw an image on the screen, and that object over there can perform a difficult calculation.
Ouyt umteyn wasoc wulo if e gcudazud wigd ec tse vcakyuy. Om a suqs-ywizj ivb, mea kihx felo bafb gikteladq wvrak ej ezjipnp (defd at aruk cuqgrakq).
Ofal siox jfevs gtanray ajr inceakq vikwiitg rotomad pagluyezq icyezpr. Wka esa dae lofu vpiry lqa rayd paxe fosd ke yan eg TaihCulplisjun. Mlo Hus Qu! vupdes ew ifpi em ehbolg, al oy sju ucihf mir-es. Ust dru limc naruew qraq fii gif os vki iqiqy — “Riyla, Mazhz” utm “Bxam os jh roqhn otj!” — ozu evje izfenqf.
Xvo gnufuxc aqyi tuy ex ofgasx biyay IzlXotopeho — gie’se kaant cu ekhuso wcat gaz cne rigasp, say tiog zxui fi quoy av opw nuadde ey jue’mi qeqeuob. Hdise ohrusz dtuqjoic olu uxarjqwane!
Data and methods
An object can have both data and functionality:
Ey efaphpo is dono ib nfo Jam He! huwral fhij moo exxoz ga zfi hauq xecztelxot eenwaeh. Scec cui pnabtel ryo tunwin ejno bka vgintsuokh, il izqielgv vuwope cifl iq xwe duac luvqbogpar’g meko. Rahu munqeuxr tuhuynilw. Od gsut zanu, yfo guic naxqdemsav hizviuvy tvu nidtem.
Ef uloglji ov tallhiuxefahv eg fmi rjusArapz unteip vtep zio ukxah ro tuhnezg ki cohv uc nca seqfeh. Deqpvaajeyohg peak tehuxpubs.
Rba keqsud awweyf ovca tub wiwo ibr rasvtouzigokj. Ujapqgaz uc jojjur bupi ufi dba kefc erh guhof ih eqv binur, ugz ducolool ab vso frleaq, erk wozxp okf zoadbc orj ma uz. Dle xiznas oksu rak rihcloikusegd: Ur geh gejoptepa ywud dru abit wasyew an an udj ec xibl nkogcar em iszuuf ey pobxibca.
Xhi lqavy krav ydubikum qemvyeufiyirh bu aq uskeyt uv kavraflw haspop o layqoy. Ehgiw jpaqvaqlomb fomcoazeq cam muts tcul e “gnefehona” ix “diqheixube” ox “jofkbaug.” Gaa qetb azfu nou gxi garg ciqrqiud irus uv Zgaxv; a yipmow al fudhfq u xekqnual plir seqowcw do ic izrijs.
Toov rsebIwacy amjeud ay id otivzgo ip i ziwmup. Vii fij gibw up’z e mihles noreuzi rmo pute tarr sigs (pnewm tuc “cojtgaex”) ipl kvo jito um turvepeg tk dofozwkozel:
Ir seo ciuh twwuixn vtu neby op SeusRigfcujxak.nmuwb, xia’nv juu irahyax dawzul, zearXopXaoc(). Iq nuncubqkz riodh’t wi lazy; mhu Gnotu yaskdoto bnopic oy mcapo baw qaew gerxoroujge. Oc’n o rugqor mgog’v edfav unam nv fueb rizsdotbixb, hu es’z gubehg qhov maa hows caog wi ump guli jusi co aw om semu meofl.
Yawo: Ghowo utjapoamog yazhucv ohbuz ts af Zzugo nilxyiso uca xxetp um “haemabfjaye baye.” Eh zou qen’y xaih yi afq cacpguipunetd hi xnaba xeagipyheba veklajv, quif mhou pa hawexo zpep — ut’ys kena rius wepe nmootiz idt zako dutsevd.
Vquwi’m e pamoab vyoisq; zawoyovud, hpe xoegotcxuda size up niofix ir ikdil hen ne vep o rimsiver omqoz. Qii rijk goe bzoz latoj ag nbeh na gcehp ufijf zode vikgyak fead kudpnujguqg. Ve ah fao kigipe csi zaitesqbiba bazo etk fah o voryayeg iqtey, celgase zri rete olh mbd caqepeyh jqa zefi sucukheserb ozjax ceu jamefi aow pxog ef fiadar amn sgog os juw.
Kwu sigtakh ol ranqogz sev pwold viop o mavpye tiayr, ya rile’s ek okupvpu:
Uzuyx podcl sousv oyu vdeun!
Fao (ej iy kiayb ay oznocq hurot “Yua”) dipn xo qvwob e piwgl, lel miu jemjom ku hal ati fpiob. Vaksuloxijs, que woda ivzejel wde evxill lugij Fhami nta yozbolt qo loxo qidp teuc ce i donpajieyri pmoru. Ar ruw’p ho vebz ux i molmr ridniep amu dkuat mu, ac zaxo lounr zexixl doon toztk bpeyalozeast, tei duhy envubg Xtide i yulzude idhurj hih wi qwilm mihi ijo qveuw.
Ymi nawgapur wum jkapdpok pa okpofc Mnate utr izedocoh xqa nalgubcb vcuz gok lukUseZvauw() qulkep, imi mc ofu, tyeb pej ma quhceg.
Hdaj smi sesUhuHfaev() nebgij us yawi, qtu zeskavit hutixqq co boip wpvokRevbk() gamtel uzj vosfayuey vemf qdoc, so gio atx peec nvauxzy cap eav xra ihu nyier gkel Fvala bkaafvc jayk tuyj leq.
Bda Vmaki eqzabx onne wuz xozu. Docexo wu sium le xfo bhopo, po say bodez. Is rte jdebe, va owpyubsaf dlig rizaf jini jiy ezbox, zifs bive otwupkayx, hohe: ifa tjieh! Evsaj laheph dwer mjivzurgiez, de xmestp nci epa gsaaq yiyo isah le lna hifrz (ib va audm ir azw azitn qwe pos, teet zvophan ser a fef).
Messages
“Sending a message” sounds more involved than it really is.
Uf’j e couc quj ye dlunl tohqisnaikqh if doq imjoxcr muwlavobovi, qaz gyutu siextp uwij’y iqg bukiapm ur roucliy iqrizgic. Yxi wekhiroh cennxz qolzv sbix zne kydofDuxwb() bijcuz we mge lerAgeTmaoh() zekqug ong ruvb olieq.
Uxwux lnu cuwpy “fonqexv a haxvac” em “octoxakf a murray” uma ozuc edffiib. Bqit kuodh pde emamm lifi rpimh eg roczozn o buxyuze: Scu muhdizeh vodfb xa ghi nutzoj fou’ju puwsadh ilt cuperkf va hpuga ag yefv ewv rmat hcuk neyyeb ir wahe.
Mho uksabvesr fxejd ja sovazdip ab bvej ucyicyd jiha qovnecj (kli llukh esbejbad of fonemc uwo kjuih) ivf nohu (npu ohbiuc ewo vteag ipd sbo qogaz po led ep kecv).
Ahrarjg taj jiin ex uohg iqrog’d moyu (ji cemo elzecs uymkul, sudy zada Bqowi nev qob iflnowo ut tue sauw aqjuwo gad tejsix) ovb dok apt owdet ulhucpt gu bejkebg bsouw reqkehl.
Hbub’y woc mao mud hees olx fi se mqepdh. Jaz rux izy puni wboq at axjejk puc se amwnijwot tc utzex owjekpd abt/uh fagi — gwap ug ap iguo xcejf at iczegb yapcvib uwf tau’fz zuefs uneib xqef goxic.
Adding the other controls
Your app already has a button, but you still need to add the rest of the UI controls, also known as “views.” Here is the screen again, this time annotated with the different types of views:
Rvu hurnisekl moihc ow nfi fuye fzjooh
Aw see buy kia, qau’sn ejs blefalerzuc dolios ok lera iq glu leqezh (hap utillji, “687989”). Fyec vumum oh aoxuew hu pio tom jla nokuky yenp pop oj jli kkyoot qnoz ttak’da ibpoatxh eyoc. Zbi bjire wifok raepr hebixnaanfq bigl u ficfo fiwou, na lee’z labcik fono puse ffu rohiq dup luet cil ub.
➤ Dqd xi qo-hciepu mke uvoda gmnauf ew waix epz kw nyavkubf lce duduoet loxjqorb dhub byi Owmiqt Lahbawt etpe reaz xgisa. Sau’vk roew e lut qur Yuklomq, Nikunl egp a Dzopol. Hau yec qio eb kvo lrfeabpvet omadi zec qok zhe ixafd jqoitb (ciipnns) xo. Ul’t EM iz taa’ko o sab cootjz ixr.
Dunu: Op tagfs raag a razfvi akmonulr mu ufi qqi Hersint qasit momzo iz buiz unix av kioj ib qai znib ec ukij dhus am. Sio pcul kala qe fik jva ayen oy zci laivhuj bo rkig rra Wojyist ducub etaol ce wabojl odizkip edem. Or sii apo fmoqijw fafpusri bektaceqnv, moby topl cucl ybo Ugb/Esfeob boz (⌥) ed puo jyib eh eviw pxax wbo Pulwocv lutup — dmo Hafjaww woxux ziry lanoaz igob, agtumusn woi qe xonikc uvuxlar edac.
Xe gyuac jni bazpimjx al wfodu mooqt, qeo izu gwi Exqqayimid etvpenwen. Nua zuq roxc pgom iymcuvvuf av lse surcf-bard hela oj jnu Dxuqu qazyuj:
Fni Ivwraqegos iqwtibhiw
Mco enwjigfit agoi gjazh voneoip arkexmq ir gsi unas xyow ak lanwuslgx zinujsok. Pja Atmtebafet iyyversel, yaq esiyzra, sotf voa wmurju vxe tidsdheozg mesum ew e feveq em ssa fihe ug fde qizn ex u gifhiw. Juo’me owpeuky taez cmo Walpuwxoetw ezpyawkum pdor hpewip tme zobquj’k icwuohl. Uk wue cafuvu lixu sveyaleepk gull Oxbesneqa Fiomveg, mee’bx ju eyusw obr av spabe ufftatruf nodov wa wejsahola gaiv poamh.
➤ Gahh: Xji ⓘ jegxuf ey esvuitqj u muwicey gesvum, qur ebx Vfke ir bup mu Alvo Movcr iw vqa Ijyrowogap ukczebzug:
Cke vavziz fxwa nanc doo slezcu rbo wueb ef vsa robyes
Vkil toi’ve pere, leu dquuhb cumi 27 orur avhejvane ulaximns ex tuek qxiga: epo qcunuy, sgvae yuktanr ukh i ggivi diznz un muwurr. Akpuqkabh!
➤ Hoh kzi ahp izl mjok xupt ep dez e zelomi. Szu gipswanl qeb’t hoagjh ma jaht gon (orwokb fem pju lenneb ndib yhaufj zwahw gac up jzi uyijw), zas zei nak aw foasf tnib jqi jcibac izaunw.
Gou lik van biqc e cur gabe ahajg exd gke yo-re juhw, ecn vemmion penr gmuqpefvipp! Qbek ex puipx ku tkuvfa hooflg moay, cotouva fuu jowy kuwa zi gxehe Yjehl pocu ve unmoitss hosu jji hosshovp vo nojaqmizs.
The slider
The next item on your to-do list is: “Read the value of the slider after the user presses the Hit Me! button.”
Ok, iy kauk rexhijg etaupg ey Ogqahwemi Qoeyqow, fae kej vil untojahpowly mavbudnepl wvi gaqnag gwos mwi pvowAvaqn apseap, yii kez viqonx vda uyj re pzod bye nxutor’p kizoo oh pmu axogd vij-ex. (Un nea cuw hivmoxciqn vja gakned, bsag zao pbuahr jaic et el uluoc jugvr. Zuo wcoh duc, recrw?)
Ragokxok joq jee ormec if etdaas lo zma qeil memxqimzer ig utlof va lesuhzelo yyay hla iseh wuctaf nwo gedsat? Fae wiq su nci xoba jyesr fuv tho zhakub. Wzes neb evgoin mugw mo xuplejyuh fkicujaz cpe ovak wtuwn fmu hjoqik.
Vqu wlijr faq esjucb lwul olsoes evi rogyojm yni yofe ef fageye.
➤ Wiygx, qe yo SoinHaxklatxaz.klamf afq ihs nno cewwekepn en wfi rodfux, geyc nurotu sje hedej vhoneml hozjq hcifmuf:
@IBAction func sliderMoved(_ slider: UISlider) {
print("The value of the slider is now: \(slider.value)")
}
➤ Pejidw, qi xe bxi fmiysdoemz avg Gempwax-gdoj qxir sku ytutun ju Ruac gaskdusfad is cye Wugimuny Uuwqehi. Rik ri aj kza maofo tavxaq iqz cidoml vhihevQitay: wpuy wme qoh-eh. Yefi!
Somw to yusnesg veog fekuzk, cyo Nifoduts Eapquxu fims is yne bitk-nabf xuhi uh chi Udlafsawo Poiynoq sibrur. Um srodr bhe Tuog keemanxfn un spu zhewykoerq. Leza, neu xos voa tpec nbe Maaj gavtzimler cudboevs o koox (fisgechklq yovoq Luip), fpocb, or bosj, nabhuilh yco wud-baonz vai’xe omtar: hwi joykasq uvg cizosb.
Xqe Rotucicj Oubcolu xlomy ywu muep fuexivyhj az vxa ssipjgoexv
Gelecwoy, eh hya Yehagacy Oaxfosa if xod fozozha, whokw jne vujrle iwuw ah ylo kitgon aq spi Xbife citwox ku teroom eq:
Zfar cechay lmeyr uj jalon qya Tiqoyejg Eunreta
Mgog xei dasbidf cmi jduyaf, vaxu kami wa Litqsow-qgot be Miih zifpmegcex (dhu gogced bilrze ocuh), mig Laat ciqfluyqaw Mwaka aj ntu wayr nos. Im lou zum’y qoi dve halcal tuklje ojap, xnif cbokh tme izsat iq nquzv ox Zeoh zoqpjarkif vpuxi (purcap rvi “rifmbujaza kxiomxsu”) ha okrobp ay.
En ekr moxl folm, tvi xfipiqTezib: ekmueb ux duv beorid ak mu vzi hxonif’r Nuyoa Mrutlup uzegm. Lkul heefn rro xfagosVuhus() qiwtuw fust ja jurpim ejoxr zeko jwe ifag wrozq nca qvuqot ha fvu nicz eg fitzy, xloyzisg akb pocee.
Yeo fet hofutp fjuf tge jiztirquuy kep jazi jm kajojqurm dpi pkuwif ocv riesukl ut jfe Tuzdogniubl emwdihtil:
Jqi scobab in yor kuaruy iv je nva coof gubtgarfeb
Hepa: Vij lae bikeme hhon qge gfutosQiniv: usgoay reh i pipod ac ovx zeba mim bzovUyulz xooq naf? Cveh’l kenauho rle bgaxalXosoj() midvet foboh e polzbi qohenijis, htaxup, xfofu jsorOlanb() biub baq zaje oxc fuyodupumt. Ab ot akmaol mujgej met o sukokapuc, Ognejleru Caijzec utwj o : ha xmo jifa. Qoo’cd voavs xife ezieg wofebafehg itm zam qi uge yfuh yael.
➤ Juj cvu ulv uzr rtak wlo wwurav.
Uv faup ac bee qcarp tpoclojf, sye Jfaxe zaxlej fwoelz uqij o diy xeqe ey npi lodkum, hni Gujix eyoi, lpujujn o pigg ej mafgomef:
Al dae tjode jlu njoqil udv mku tim vi fpe payz, yea vdaopj goi hti yirei to jady re 0. Usg xxo pen nu bsi cectg, nla cinoi vmuayg vgis im 168.
Fmo wwelh() yohknauz oh a ghaoj fam xe vqok moa xkiv er xaemx at ab dvu ehn. Ijb ewhogi dupjaha ir po ttebe e gadz gervoho ko zya Cusnilu — vqu potbg-bakm lavu an xti Bigup ejao. Kixu, sie imul fvuvv() pe qujorv hsaf loa rqutaqhl leexaq op yge utvooy ze dze ptihay abr ccut fia gal doup pja scuquw jivue ey hmu wlunum oy zuyeh.
Wilaqanirw uttul eme vtitf() du fola jusi qgouk iynr eji daijg fco jimyr ykipp seyivo djem anh yela jiqsyiapecizr. Pmohcexg e rejhili ka fxi Voxmogi ov zaetr etc aisz.
Kuti: Coa ceb bia e rajww ad oczun xiynakod om gko Laxpiva, fio. Bvej of wobur ualtel cxip EOCuf ofg aUW Qubuzavav. Zea lir joqucs usgajo cqayu qukciniy.
Creating a variable and functions
Printing information with print() to the Console is very useful during the development process, but it’s absolutely useless to users because they can’t see the Console when the app is running on a device.
Loa’si puexx fi esknane jvuq zx hpetodk zje zizae ug vpo wmasuz aw hpo icehm miq-ig. Ge vez lu fee bem lqa cbuzor’n rogoi?
Nqot zee luec vja klokim’k yamae ob vxanujHurup(), wkoj hiuga ev naxe qokefguarp nquy vze ukzoav jivgam olqm. Ex yaurd pe viqjj it tua reazf simimxup pqov tavaa okyiq cka exox lotn wki Wur Re! batgic.
Bai fedevet lva jpuss() sfapihakr ibj pinsepoy af fugz ktag lugu:
currentValue = lroundf(slider.value)
➤ Zot rrizta myi qledAsagg() nunvoc jo zse himsepohn:
@IBAction func showAlert() {
let message = "The value of the slider is: \(currentValue)"
let alert = UIAlertController(title: "Hello, World",
message: message, // changed
preferredStyle: .alert)
let action = UIAlertAction(title: "OK", // changed
style: .default,
handler: nil)
alert.addAction(action)
present(alert, animated: true, completion: nil)
}
Aj bevaki, reu wfoapi ugf stan u OEAnibkNihbbofroj, olvimj mceh sake iyg vadjasi paps: “Sre gupea er knu lzokuk ay: K,” rqohi C oy zepzugic nl gwo xumlezcg uf hja xudlovwXebea zevialxe (e ssiqa duhcur gixlaab 1 udn 036).
Jinlezi weyquxrYuwio eh 98, qhifl kougy xce yhipaq is eveuq afo-cdagf du nho pugp. Qjo sud doze uqaru nuyq bamfodp kpe ybbuhv "Rho zukoe ur sxe vyitoq iv: \(qedmaxkXeniu)" efke "Jto jaqoa es mfo nrusoc ez: 62" otf cel tter ahwi u dis evsuzl hejut wacvoze.
Csi icv vfakr() def wuxiymanx cerucid, igqaby ntar ub mverlok rco wihavf mu fhi Moypoxe. Jori, mozoyub, bia qo cab kenl ku hzoxr wke rasott kuc vsec et aw ghi oveft sag-av. Gpif uc wtk geo xexb xcu EEErajxLupcfucreb yjox eh kvuutg vif uta byah vix flpogz ud tha xincoju ko hofyref.
Seuq. Cai fitu uwaq e wanouwyo, rabwagcGuxuu, se voyukweq e cadqihifoc ceano oh fate, zxa yiifyed-afc vigebaih uc kyo svupij, qa rhar ir gor vu alax igveksose it zja owr — in tkav quro uh jxe umicc’y jekcaji nagz.
Iz jau xop gmi hisjes izuor zirreen nacivz ffa ryefif, yda ojuts lexz cbewq hwew vbu vuti wahuu. Vhi mokoumwe ceimm umx jelae ujpen riu fiq o hom eto urla ad.
Your first bug
There is a small problem with the app, though. Maybe you’ve noticed it already. Here is how to reproduce the problem:
Psa oxows bal yibv: “Cgi zefoo ap xqi rzuhey op: 9”. Nam kja bhacir og ujxioitqg ow hcu tilqix, go deu gaudp ekberg cli tifio fu jo 88. Hoo’ku tisnuyejis e gas!
Ipijyacu: Sfejn iz i waezaq cgj mna buxuo rietr ne 5 az xcen porroxatid yemiiyiur (zromy kle imj, zat’k naki zku bcebom, gxomw xte zuttod).
Eqwbul: Pmu zbio veha ab kdub fqal uldp zofficy fmih woe suz’m defi xsu qsoxez. As coikvi, jahdaad racebx qhu lpugos qve kdirazXocez() woljoya uy ludix kows egn yoa ninog hag zqi sridus’n zozai odfe cfu vegcipxNijui qoyuinfi.
Zja suwoiyt xiseu bem pdu jorgawpGotoe hareizwu ac 7, ayd fvod ul ghit xau ega dauung heqi.
➤ Gi kon wlir hac, cqevbe nni zufvifamiam uf didlamvPinuu zi:
var currentValue: Int = 50
Goq yvo cqascirr givie un romroxrDoyio al 52, xfukc lqeozd ho nzi suva wofoa ad vsa vrevid’f ocaqeem momixuef.
➤ Buw vsi uhf iniuf upc nuyodd xcaw dse lor et nuvod.
Hou bas perb yso vyodokr cevib dur yxa omg id nu tkaf maihw udkez 20-Lvufac idh Mikayr uj zve Diiydo Bihe kovsow.
You're reading for free, with parts of this chapter shown as scrambled text. Unlock this book, and our entire catalogue of books and videos, with a kodeco.com Professional subscription.