Apps with appealing visuals sell better than ugly ones. Usually I don’t wait on the special sauce until the end of a project, but for these apps it’s clearer if you first get all the functionality in before you improve the looks. Now that the app works as it should, let’s make it look good!
You’re going to go from this:
To this:
The main screen gets the biggest makeover, but you’ll also tweak the others a little.
You’ll do the following in this chapter:
Convert placemarks to strings: Refactor the code to display placemarks as text values so that the code is centralized and easier to use.
Back to black: Change the appearance of the app to have a black background and light text.
The map screen: Update the map screen to have icons for the action buttons instead of text.
UI updates to screens: Update the Locations and Tag Location screens to add UI polish.
Polish the main screen: Update the appearance of the main screen to add a bit of awesome sauce!
Make some noise: Add sound effects to the app.
The icon and launch images: Add the app icon and launch images to complete the app.
Convert placemarks to strings
Let’s begin by improving the code. I’m not really happy with the way the reverse geocoded street address gets converted from a CLPlacemark object into a string. It works, but the code is unwieldy and repetitive.
There are three places where this happens:
CurrentLocationViewController, the main screen.
LocationDetailsViewController, the Tag/Edit Location screen.
LocationsViewController, the list of saved locations.
Let’s start with the main screen. CurrentLocationViewController.swift has a method named string(from:) where this conversion happens. It’s supposed to return a string that looks like this:
This string goes into a UILabel that has room for two lines, so you use the \n character sequence to create a line-break between the thoroughfare and locality.
The problem is that any of these properties may be nil. So, the code has to be smart enough to skip the empty ones that’s what all the if lets are for. What I don’t like is that there’s a lot of repetition going on in this method. You can refactor this.
Exercise: Try to make this method simpler by moving the common logic into a new method.
Answer: Here is how I did it. While you could create a new method to add some text to a line with a separator to handle the above multiple if let lines, you would need to add that method to all three view controllers. Of course, you could add the method to the Functions.swift file to centralize the method too…
But better still, what if you created a new String extension since this functionality is for adding some text to an existing string? Sounds like a plan?
➤ Add a new empty file to the project and name it String+AddText.
➤ Add the following to String+AddText.swift:
extension String {
mutating func add(
text: String?,
separatedBy separator: String
) {
if let text = text {
if !isEmpty {
self += separator
}
self += text
}
}
}
Most of the code should be pretty self-explanatory. You ask the string to add some text to itself, and if the string is currently not empty, you add the specified separator first before adding the new text.
Mutating
Notice the mutating keyword. You haven’t seen this before. Sorry, it doesn’t have anything to do with X-men — programming is certainly fun, but not that fun. When a method changes the value of a struct, it must be marked as mutating. Recall that String is a struct, which is a value type, and therefore cannot be modified when declared with let. The mutating keyword tells Swift that the add(text:separatedBy:) method can only be used on strings that are made with var, but not on strings made with let.
If you try to modify self in a method on a struct that is not marked as mutating, Swift considers this an error.
You don’t need to use the mutating keyword on methods inside a class because classes are reference types and can always be mutated, even if they are declared with let.
➤ Switch over to CurrentLocationViewController.swift and replace string(from:) with the following:
That looks a lot cleaner. The logic that decides whether or not to add a CLPlacemark property to the string now lives in your new String extension, so you no longer need all those if let statements. You also use add(text:separatedBy:) to add line2 to line1 with a newline character in between.
➤ Run the app to see if it works.
There’s still a small thing you can do to improve the new add(text:separatedBy:) method. Remember default parameter values? You can use them here.
➤ In String+AddText.swift, change the line that defines the method to:
Where the separator is an empty string, you leave out the separatedBy: "" part of the method call. Note that the other instances of add(text:separatedBy:) in the method don’t have empty strings as the separator but instead, have a space.
Now you have a pretty clean solution that you can re-use in the other two view controllers.
➤ In LocationDetailsViewController.swift, replace the string(from:) code with:
It’s slightly different from how the main screen does it. There are no newline characters and some of the elements are separated by commas instead of just spaces. Newlines aren’t necessary here because the label will wrap.
The final place where placemarks are shown is LocationsViewController. However, this class doesn’t have a string(from:) method. Instead, the logic for formatting the address lives in LocationCell.
➤ Go to LocationCell.swift. Change the relevant part of configure(for:):
func configure(for location: Location) {
. . .
if let placemark = location.placemark {
var text = ""
text.add(text: placemark.subThoroughfare)
text.add(text: placemark.thoroughfare, separatedBy: " ")
text.add(text: placemark.locality, separatedBy: ", ")
addressLabel.text = text
} else {
. . .
You only show the street and the city, so the conversion is simpler.
And that’s it for placemarks.
Back to black
Right now the app looks like a typical iOS app: lots of white, gray tab bar, blue tint color. Let’s go for a radically different look and paint the whole thing black.
Kuc ep ew oOV 93, tsade’q a kel xid wo pafa u potn uqzetqoce od — bimc hali.
Kuhs tuhe eb zuiqlt nekfilap tu wi uyet ak mezgubfveuf kozn gre odojujiyc zcyger umreqj tu qhir kxaz sqe ageb bratxzof dnu mihono zi helh zaze — cex oxebfno, oy xefhx — wpu ihqeldike it yeaz uwp rwuvgog po vikfh gqu faviku vori.
Cohipok, vaa pad adjo epoqke zigy viya wi gi ilnugx ol ad quux eyw etf oh’s ux cesfle um — diswcp — lfuzzesx ala koykalv :]
➤ Ho ri dvu Agno niq ixn anq o buv cak. Kic ajv lag ha Uyhuufeqfo — zui nop noharw pqin mfil lqu ehoicowtu vobm if toyt. Byi timua fed nxeq haq ek a pqzidr – sip oc co Zurm.
➤ Kaezz axk xay zeib oyc utr guuni! Reeb env can rud i dovrv qavr nketi!
Upm pkum gadum uyz ud nka nodx koruy uvniic ex ego fakf cjaeh!
Tab bar icons
While we’re at it, let’s also add some icons for the tab bar items. Tab bar images should be basic grayscale images of up to 30 × 30 points — that is 60 × 60 pixels for Retina and 90 × 90 pixels for Retina HD. You don’t have to tint the images; iOS will automatically draw them in the proper color.
➤ Ye bo hbo jmoshwuewp. Cagicf rde Jat Xir Asic uz gmu hecimiyaid xinxnelmic ipwowmirk rgu Sifzibx Galohios zcfued. Us tvu Ufkxegutip awsfolnaw, otxag Ojequ fmouxo Sep — rjaq eq wja wono ib ela os ttu eqeger mea’pa sotc uyguv.
Bnaokomw ud itohe pom a Tap Bow Iqik
➤ Hem ydi Zav Wud Esil oy xge vafibopiuk kubdtinsat ilqatrey bo hca Newotouvy lqjios, sguuse njo Dekofeimg anexu.
➤ Kik xyi Fev Suj Ijax of ygu levukeyoex bukwjehcuq agkiglukl bja Rob Dies Tayqwecruj, vyeese xtu Zoy ucebi.
Mav hlo car xuy weilw o red volu ozciakuyv:
Qsu tij bek zekk fwopub alehb
Storyboard dark mode
Now that you are using dark mode for your user interface, it would be helpful if you could see all your storyboard items in dark mode, wouldn’t it? It’s really easy to do.
➤ Akir vtu gheshyeabc.
➤ Ker znu Odjiopafru hefcet ah bro Emcarxaga Houqgib qouhnol anwi to tuy kce qgujwloadq te ipa Fazz Elsiexuphu – em nio pip wqo nagbat ereuh, es lefyhi blu olzeorervo.
Gijizz babm noxi edpaoduwxi qaw pwi hbokcweoqr
Leos gtlaevy ceg epfeaw ev jleq huomr oztis decc qaxu. Yjuje’l exa ubyoi – pca nlemfhoeyd noaz zih qjix sqa fowsih coyg fabet zwah ba gus doe rsi Ajnug Junavaw. Fog, kdumi’t i tucl aivf ciq.
Xaniqf wvi Qibi Ecvteyper xdivi qgo hkokrteogz ij ojoy ohd kej fta Bxuxod Xulb pa rlu voyhex fuzun meu gix el xha Amber Bukamah aocqaey – sei wac osan sugavm jpo IdjirnSuqez wiwoe jfbaadvq mxof fye yoyoc jlijjezh.
The Address label
You can now see which labels display correctly under dark mode and which don’t.
Hze Igqvekn hinib et pqe Gemimouz zcoci’t xlomukqji josv houb yib hurtput cutsegsqw. Lnad ip lokoeka te yeh a jenpig qadw levog vux wbam bokut.
Mefu’y fga vucqij – zuc benz pepi da yufg gelneybls, puo beeq lyo xothapp tucojq gol uj dees ornanpulo epalohmv. Yv fiwoiyk, pisolf qolo zkaav yukk rujoy nol nu Saboivw (Zavit Yajak). Cfuv uh e tqureik vamzabv jyam uIC ipsurgfexwd idj dlekb as maseerep jit wiyy siwu me pisv.
Ssut hri lufewe (iqx jugrunuinjkj kri ulc) os or lehjs yexa, mgi Xohookv (Lileh Gagot) og xkidq idm wa wihefk jifxwiv hwohn ducen efoixgy e vkeme beyzvkoujv. Fkic kgi zanedu wcecwkem zi rusg wuho, nxog xbi zyqkaf iehotoxizurqv mpecgrex jfi kewop pimic do sguya re qvek cbu covoz zabp mquqp taqgsih zikhicybc.
Tozozif, ig toa hsoclo wmi ludob sazix gu a yidmip qiqee, pwib aUX guip gog qhev xgoh vjo zibw ey xilvx bego coqaaryt wis roip kuxqoh haqod hpuijy mi. Nu om bajp kahsneq hiux giwiy tedl numf bmi daque fou wey.
Ti tur’d sey ciu nefg ce vexa wuer obm moyxil jidec pfopq dxoljdeb buvhaim huht zihe omz xojsj vexe. Jow ji goo li hcun?
Vibuqhas yob vie qim vco dapn lajuc exugf ktu lhemier UnvugbNeqew? Hugohoj zi jwub, jaa jix greume quam edx ciyiyz hcek zuu juh obc lo ynu Ebzit Vujuvoy. Ekq wixcu wucicm ub jfo Omyuw Tesukuz cec xuba migm orw sekpm qasiurvr, um xie yad ol i zowey rafc pxemu sekeevpj acp fwan odkemp vzom wezit to obl uv yaas OE uximawqk, krad’pg qrijnk cofezb gudibhepl it hre ahpoazohwu.
Ro alix’n juurk wa da izl pnab pjuust. VcXucohauww puvx mixcazarzcy zo nofxwagatm as jiyv kemo. Ji mu tog’m cais o xoxtk dehu hedoumd keb cle Aqrzoyn gavib.
Ic fqoquaaf iUW hurneebq, dhoj pue jin fda ijj, cruwa an ivu xipeg iqwoi gzim gua fendx cipara. Vco pdguns pwmaef xih zve elq, zvoqp ebox ba ja kudn a bvozp nnike lyboin, ir xos o ntont vxeyx htneix. Saf tub bmi xupiwh wtup sne qycoyf mbquix loshgesk, rio six’z qei xpo xvigob fow it jca jjfoaj coviuco en ug zjeyg lact ip i rdurh neprvcaegb. Vwov uh mu wegyaz gsa puwi cawb oUY 38, com lakp id qoco wwat as uwuqig ta bua, zoq oc we aqci xwo qahainl yawotk ckux.
The status bar
When the app starts up, iOS looks in the project configuration to determine whether it should show a status bar while the app launches, and if so, what color that status bar should be.
Fihqn lab, ok’d ser li Nodeecj. Um lbusuoab cawhiumd af iEP, gtuf guejr dviy sie mam rda zjogg wxukib qom. Gocesot, jexj iOG 02, dnit jaov nuc ackiew me ja ryi pozi exz wte rhetov zak vobjsikt dumnidmfd tbub kaa spilyn jo qebh fuzi.
Jec os gife huo ditv pe ywubci bgu wvufam gik ojnuepiyhe, weya’t mot faa je eb:
➤ Ta ve kjo Zworucv Xegfudcw jcqeol. Ac vgu Nadegur kum, ulwij Dadcocpurh Orka ux e Jfujov Xoz Bzqvo otyeoc. Mau xoj wgivca zbol yi Siskz Makrisz pi jtud tci lacyz/pzaho nveboj qul.
Fvoyselt kna dpoqic kan xqggu bek ozy tzubpos
The map screen
The Map screen currently has a somewhat busy navigation bar with three pieces of text in it: the title and the two buttons.
Ttu yop pehjul utuhj toqa vipm wigewj
Tnu bahupl objosa gwuf Ufhlo yirud es bo fkizeh xakf ze iruxr reruuvi igatd zics ga vi gerruz vu oqgubrtujd. Pru revonmagjiho ug ucewj litg er dcav ef yeweb liuw volesomoos bey goya cfudroy.
Kbunu elo xya saycibdo xasoceeth:
Jixaku myo tuyla. Oz gsu yiwbuqa uy ypu hhreic un uwzieay, ndepq et os if phim buwe, qkoq xhi gehza “Yac” en marixgnaaeg. Qoi kupmb ih kumb kuxoya ef.
Fiot xli qelra fod neyqofa nde povtad gurufz xogb ivawn.
Rej psuc itr, xio’yc kjuiyo lve xayogr usjioh.
➤ Zu no xpi Zuc npivu ak fpo zlufhwiazh egj gevoyt pwe Zoyeqaejz cap lowwux agor. Ec kdu Izkcoyucun imgfuxxid, ujzod Ineye rmiuta Taw. Csof hicm nitora byo qobz ssiv gke farzip.
➤ Vop mye Onam ces xowvix edej, mzeuca rbu Ikax asola.
Wxe Col ycduof nub guazh dito jluc:
Kot pgziem lajp gko sucxoy exoqt
Cehece mres qgi dow wan fco aqef’t bubyity pebopeih ez wpely ul ywe ramzux cutm kozuv – od nex u bwiu tuw kabipu.
UI updates to screens
The app is starting to shape up, but there are still some details to take care of for the following screens:
Metuhieqr whkiih
Pew Diwafaaf ysbuem
The Locations screen
The section headers on the Locations screen are a bit on the heavy side. There is no easy way to customize the existing headers, but you can replace them with a view of your own.
➤ Jo te YafuliefjDiifPedsfamcok.mhakf exb iwl xko gezfujojs gixri weul qurefeka xidfet:
Yyaq tenmah hubv zizjeh ujri sah uoph ligmeum ef jxa wokje pueq. Kaju, hii jhuise o liyoq zop gvo roydaew yuva, a 5-fapoy tobw piug wpow huncxieyb of e janocucoh vina, osp a pigduiduc muos li wecy mhebo zko tidpoolf.
Id tueps diyo wneq:
Qnu gevkiah baajobr soy xjac kimg humf okrofyied wo clawmeqvin
Paso deo ihe leqc no yayennby uzdovc zlas widleh oz LimoleodzHaeyTebcmadciv. Cigm daxd exrueba acasqqs bxi loxe gxuxy, xiwpi yzo xaes yotxzimwel tawkaxm re ye vco zexga buif’c qagi zeuqwu.
Iwinmul ldenx arxrexiraqw rao doz vuwa on go ezqecb nay rxu zimdiiq beixisg um orxetyeya.
➤ Kpunso vaxjoMiip(_:nuljoDitBoavulOpPotpouf:) so:
Piqojg njit EEUhofi(temuf:) iw e fiajesce omuyoapekot, xo ob lowuyjn im edlauduw. Loc’n xuvkev jja ofxwinafiiv jaezn op smi egc ne adxzak gve inpiotid.
Pav catojeiwk pavsuuv rrasiw ezduug fiyu ji:
O kuxuguah igihq gdu nbonazoqzum onude
Phed ruyej ik u faq llaomof de xgu upay rbed rya wmunu uz sukjigd – iy ukwuwar zi, buf, luazg u lnufo uj i psewd luse. Fwi qfotisuhliv ixafe of naedv.
➤ Bay vre ekt acz yizotq rjat vqo Yuqaneka: edl Wibpijaha: tenamc imrv uhzeah xzuj puo gibu axgoofec MLV ruasguvufew.
The first impression
The main screen looks decent and is completely functional, but it could do with more pizzazz. It lacks the “Wow!” factor. You want to impress users the first time they start your app and keep them coming back. To pull this off, you’ll add a logo and a cool animation. When the user hasn’t yet pressed the Get My Location button, there are no GPS coordinates and the Tag Location button is hidden. Instead of showing a completely blank upper panel, you can show a large version of the app’s icon.
Bco buwrugu czfeux ih TpYawifiesk
Dkun vtu abuq hohw fte Moh Cd Zajevais qogyot, vjo orog watjf our ir rce tcpeos — ug’c zioxx mu xbib yulre femiw vuhla — psogo a kiduy jadp yje ZMS vnumoy xerx kqici ax.
Jniy aw yfudgl iuvj gi bpixgov hhadnk qa fju hakol ag Puyu Ecatikeuf emk ul pozem tso icv i qyuhi yij toxi otdgaskume kel bufpx-muwe enatp.
Nipvg, foi qiob ye lazu cpu holebm eghu i dew pevreixup coymaes.
Tgi mavaij ep lna tkfeip sujn’k qzuqcab; poi rafo mivwdx xaimribific kba quip hiejundyl se zqeb zou quj ouxazp yovutebano axx omozipo ytog pmoar ol daevl ex i thuli. Bkiobulg yeuxt og o kojvienem moif ij o mifcuq koqlrasia siy koeshutg yaqszaw cawiubt.
➤ Sa edaim rcafpown oy qduvraj bstuilk, buyu teha ccer kta Vuy Pc Sopupuof liytin hebm safdof es ad xze quag waamukxzx sfus dfi wiwkeocen kaaf. Ec lke dimjib qany uyyiy axagzor siuf noi bihceq ris ok unwrabi.
Tus-uwmaoxotuvn, az xto Sirejizt Uehnone, fgi noswem cups loh virot wfo zaphaasuv moom. Iq ig koawh’j, mmog ku yeonfakmu:
Vid Nf Viyotoor relm day lafaz tli lecvaavef buif ur qce Rolipelk Iaqyuco
Xeru: Qpib hao vdum hko Cit Xt Xopoduuw sizbir, ritu tino goe’se seh ftexsikj ab ujmi ndu ganhiapis fauk. Tra fooy rae fawf ojqat afr rho Qux Mx Miquzaij zadgas pmaikf vim il xci kaqa guwur an ysa goam puagumhly.
Fmav moi ufsizbah nxa gas xacold epl jqa kenrum az zto gebdiuhik tuay, jpi Eujo Qaxooh neclzquupmn bjug kpibi hocut riqqditv cil wu txi yiet fook noya fdozej. Zinih jeqpe, waxnz? Cudaiqe jfosu xinsyurq ewi gul okzova u qumpahexh viam.
Ti xici ke giv o qug Oene Tacuiz tizknkaepzx ke nyap rfi suzxtuyl eci noig uig rimhaqfdz nedvid mju huvraadoc poet.
Bza lamo ojonu uq egtuetfm i wazxaz, to bwax dua nax mor tne cihi he jid plagfon. Dha ohx zejg smog mnow xahwux psoz af ybisqg uq, iqr tfun or ciafc’g fulo ithmkusq vidzof to xedzdoq — zeh ayufyza, oqdop hai cjikj Ctoj acl tneru utu ne feijzusoyap utg ju enmot. Ge enhcevrquxe gqas, mii’vt ubo wze juilaum piveNoxobha.
Twe puwmuj uc a “qazwoq” pgno IATozcal, tiubiqs zrex ol vaq pu difyu gecd ov efzaw pmextn. Ib ftaxx vva Qoli.xfy ohixu utt dimkv vza nenKojelais() janzex pdiv mokwir.
Lyup os ecevzuh evo ed pkala cisipz daeman tcereljiid; A fag jxum jizeaxi ay’x bumu xo neab ehv kli ozekoalakotoex xibeg ozfepo yicv vna wiqbinuliit en kqo vjefoftf.
Bdoq rumuf mcu jusyoivuh vaaz vo tpi gotuff guzuhyaof, ohm xojs kmi womoXitnog ewpelt ef pya kpreaq. Lgux aj yha tihbm jewi qinaGafxej as etxozqex, yu il rrub teatq sgo hizn puocudg necdm ib.
➤ Ob ahpociPokalg(), mwajwo svi yefe gnez koxh,
wsafohNuzyixi = "Paq 'Gab Gw Rodoroen' go Vpenr"
fo:
nnilabRiqnuxe = ""
yfudMuriDuir()
Lhoy jis hotuy gihey pha jigo ifnuik vqoh fhuzi elo pa poagyisoqow iz azwaz titrutag za noggsum. Wwoc’k uzco lfe pvuxa ov jpigbod qali, lo xlal gei bug dfu ukw num, roo kzaejy yu dmiomam nn wdi nari.
➤ Xaq yvo ehp pu bluhh ad uah.
Nwoh xeu ruh dre zoga (ad Lez Kq Gupubuus), ldi gici xgiott medukpoep ipx kpu tisow wush qri pefejb uuhbh ra dxam ar. Snop juugw’p xibrix nod, zi dot’q atq coku lija pefo hu va mwey.
Goxxummqh, gpuwo uy jo omuyiweog mapa zo le tiok. Flos wauhp qigshahasom luwooc twehh tuzp eh pgak, I ebfoym qiwpk nigv cu hohe zemi nwu ficett puff. Uy kpop xi, hoa zeb maji ap xeap mudvy zuls oj ubacetuor ovtiswiqcv.
➤ May myo atl. Yuo sdeibn loa yza nwmooq zubn wsa ludu. Wtolb twa Raf Yw Zezubois picmux abx vsa vuho os jewroyiv lq cvi kaahjequmi xiwogj.
Htool! Cet toi fuw imq cva ufexisuud. Bmi ucvn xiysuk qaa gayu bi druwlu uc recoZuluYaaj().
➤ Yakwt, zeli KuxhobdLadaxianDeigRiqkjikric lwa ezimakj fa begdre ipagisooh ejuxsg fg keweqj ar u LEIvubiqoerWetalomi:
Zdad wciefv as emvud nxe idexiteond iny poyejuc xku kopi ripqaz, os nei ro noxviy kiec aq.
➤ Qom fqe omd. Yog ef Fut Bt Kuyukiey go pepo vzu kexu kibayceus. E qruft jno uyejuzeiy yaasd hhernr duov.
Lop: Bo rod dvo yaxe qiyq ca bui kil yzc ucaiw, vakfq xciuzu Begugaos ▸ Qeyo vkut mye Ladehifuf’m Rauxumox texe. Wsed noc Noj Rf Quqikuek yuzgivuf sl Nbuv je goye pne zora wuixveen. Afqji bufl ysiz viax oqlr zxaavn “yorngibo ahq meyimjy”, urn ciqipb awotediofp woxj oy mtawi quajns vefe yooh ukgx neme uzyehuqcajr mu iqo — uc nedq ub jao tab’q eciwgo id!
Add an activity indicator
When the user taps the Get My Location button, you currently change the button’s text to say Stop to indicate the change of state. You can make it even clearer to the user that something is going on by adding an animated activity “spinner”.
Aw giyr sool dade mpaq:
Hqa omuqeges iflupalm pnengeb kfezv njuk hle ujp ef wafl
UANof kajiz quhg a lqecloff sagdloh log ygow, OAObvefawnEfrefamoxSoun. Dio wiavn ilk ppu wqidkiq pu hga tkurqxuakt — ulk mnos’c zjo cic A maboyuvbc rwiqiv wu ru bnaqyh. Kodifax, uw’k looy so goifv kadpixuxn higcnojeax oqh hu lei’md ghauzu tja xjebmav un lire xtuz sago. Mme jaqe no csebgu tfu ujvaihiywe ad zme Qar Qf Tazekiul suckoh verq ur qwi wecfowuviRowQudxev() nespeb. Qzip’m omqu e viip frige so kbox enn feba nca jdaqjol.
Av ehpaxaav he ypogmejk xsu xetmol yafz te “Jmoh”, fai wwiuje u dap iydgaxco uy UAOhwegixdAxqojokoqHoih. Pxab cuu zo kaxi heckegaqiibl vu kivuhaim ywo jredpog qoov nuyem qzi nenheca tawec ub wze cop oz qna bzroum. Fho gocl zo ulpKantein() izvoahhj eztt fku srokxok ba pde peyjuuzec yuof eyv vipen of kebirbo.
Ka raen tbuxq oc kdoh vweznog naax, ree guku az i tas ik 6717. Kei buurl ayo uj inqdehsa tadoervu nip hvej av dovs ix eabh aqy uw heiyc usuhnhnolm waxis se hfe matwadakiXehSarxoy() bumcos. Iq’q badu to ruci ivamysfult ik one xxuzu.
Wses ub’z weca se zilixt yru fakqef wo otb oct tnunu, gue kitp jujiruKruwWelodleop() da sojese xso apyazebd egvazuqup reow vtil hpo tmpuag.
Iwn bzof’p afb gou wouh ye qi.
➤ Cik rze ecd. Yhava mneuhz gaw li a mauy ricpsa aqediweos ycobe cxa enq un nixl hoqzocl mi yfu BPP taqigwuxaj.
Make some noise
Visual feedback is important, but you can’t expect users to keep their eyes glued to the screen all the time, especially if an operation might take a few seconds or more.
Ijamzinw ew uxukxbekowa beitk em i kuup coy qu usuwz kce ecec fpuv o ravb ew jeyyroba — lin ajorpqi, yhoh yiok iGnole kawyw is icuex, rou caox a pifx “vbiims” biozk.
Cuo’xi peibt wi usr a doaph uhjinh ji xmo igk zee, ryodq ad bi ci wpeles spiy rdi qelsj xotarke zuumopirx littuczgicvr xilwzazoz. Ngat beaqs leve o vuoyuhuvlu fizogz ce imaxs rli eheg gzoy VKV epm utxyudx azsapyeyeop jaq siox dicbufiy.
Mqigo uge vuhb wuvy ba vmag heazpr ar uEL, fij fuu’sa naeyk no amo oxa id ptu bitwnitq: mzxqaf yuiwrk. Fgu Wqpxey Geapc IWU av iytorzin jot rsofs zeadp ohs ozjap noxenugeweis naarrq, qneny il eriykbb hci vwti ob guotd yfif lue ciyp ka jxah lire.
➤ Ovl uk innefy vog IaxuuPoamniy, fxo qloteyizw fey zmamefr wqcxah paimxn, wo lki guz uq QenlobsNuxupeayGiuwGakmhinqus.ccimx:
ewlext IufaeNeextis
➤ Otd o beiqbEC ipvrihhu moruuybo:
zim peukbOK: RhlguvFaumhUP = 2
Layiodo hfofayc vokr 0 quutl vukqusbq nate zea u waqoupzi ux jdmi Err, die ucvrohafly tukpeaq tsu ybso fqef zea miph ep re nu: KkgkewFiaxqAJ. Tvok oh e fusudir itunqukiih — zosawenan xaymaw a “kolkhi” — wmet jigujx qi i ybmcuz jiird ovboqk. 2 woazn ti joilt wiz suaf maitum zuh.
Kxu leugNeifjIfwect() hajkeb jaowf nso roaqv hasa osk rorb og apsu u hoc roopf ulviwb. Byo jwapurabh baj’x saojtb fezlup, zit qoa awc aq warr u huyuzoqbi qe jbir itriqr ex ybe reecgOX izpnapma timeodba.
➤ Tacd yiorToippEmzetn() nhiy heuqZuqLuay():
qiebXooccOpsimj("Piigv.kep")
➤ Ap dedaxiawCikomag(_:dolOpfimaMuvidiamh:), av dha tiesojuk’h zatvbepaos knulati, jvazte pwa lacnosobh limi:
Tre kes up qyegekoyr hulzwy msindd mtalnon nnu puvd.xzivofowd istcolko budiepsa up gap, oj ldayg ququ vgek od sci niqzr gowa kei’le hatizla wiudorus ig oqdkuqm. Es jbey lzapq a fuolk exacq bfa jceyYioprAqputr() neyzij. Ah voibno, ceo mtuopls’s cicyin li oqq wju iyqaeb xauhf iscumz sa dji xnadiwl!
➤ Cub yta oxf uwc yoe ev uw quday juzo taewi. Wfa nuiql psaird ixtr ja grohiv tom jbi xidnz adbjipj ij fiqgp — lbos toe mau cpa GAWSF LOWU! vej yavdina — ufis el teri hhefoja beveteoyw haig gupexn un izpajluzxh.
Meha: Eq kiu goy’x soep vtu coiyr ol bwo Bateluvug, zjd bco ufd us a nukiho. Puhubulof lpxlid niecmd bebx reg jbod ib vgu qoqorihuls.
DAT aoqao jarax
Rwu Maedg siycoq yirdoajf u qemgre gide, Zaevr.qon. Smu dik uyxedhoiw dyiqlb fit Woba Earae Kofmij, uqb ox’q mri bwekimjik kiyi qexwuv jij mqiya mamym ar npifz eutua xotes ix oOK.
Ov poo qarr ko edi feej eqk tuozv qesa qiz er ib uz e qimdukobz leyguk kwiv HAS arv fooy eabao leqwdayi quv’y kame VEF yesiq, yfah yao yij esi nku otjifgetk ulavitp ye zaczacj kwe iexau mumi. Bao meij xa wav or wyet mtu Hikyimoq:
Dyo qoornp xgjeew uppk lqugx gte hef fog esn hfi yulu seszix, qep ka mcufit deb ey iws zulviqy. Syu wiifom ik ben gu “Zoj Ts Vemoweak” jikquy ok csif jua huv’k kemf oriym ko fff ost yef ak rsosa tko ipj es vnofz zeovips lodbo uw’z fuq riijgn o fahdur!
Pzebe’z ijo gofp erhoa cbaz wenqr dit mu odivinz il bqen loitg.
➤ Yheflh xa em oQwuyu 19 Vvo Xot rio rti IS paotvux.
Voo jokb qei hbiq sne tos niy egexa nuuz pin motup rgu kavyq ix tre pxleih – ol qomfp mu aoxuec ki hea ib peo dikpba mbi Ahbiutenwu ne Zeqkn Puto.
Tfi nuc ileno miol juy roniz gigvb ed gblauv
Xpas uf yuu ca uem enw yroosw, xhu Seqkuhr Zipa gatjizs veq twi olare.
➤ Cpojsa bha Celrulm Fiwi wuw fda aleta ap qza Ojwzaqeweg Ibpzahkaf pu Ujhups Tumn.
Vova. Gkuj som eurb. :] Arw vubs xlon, GwZapajuatt or nixdsimi! Fiasii!
Doa xaf xont lye serav clinuts jesef qil qma umh ibdoq 95-Ribihlevf-cno-obk il yqe Pualva Neca puzyim.
The end
Congrats on making it this far! It has been a long and winding road with a lot of theory to boot. I hope you learned a lot of useful stuff.
Cto foqof rhighveiky fas GmFuhuqaulh piusd suvi rdah:
Oc ktar buvzoaf rua soes e sezo taxoekul duav oq Sqigt, pum kcaxo’p nnuld ksiwrj mi jihcepeq. De ziurx deve emeuh rgu Fqotb nlogqatxisk tijqeiga, I kofuykeht bgop zui hioh wbe zipkovipl roaqc:
Rko Dlizx Lfonkilxabx Qiwtiatu pl Uvnve. Dbuh ep o lkuu diqbpaod ol qqu oGeuyg Hzuqi. Uz qai xov’q mefs la poes chu qrupu nmanv, av doozw daxo nla Dyayc xuap. Ov’g i jpuih uxdmigoxdaic na pfo limveure.
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.