Before your app can search the iTunes store for real, first let’s make the table view look a little better. Appearance does matter when it comes to apps!
Your app will still use the same fake data, but you’ll make it look a bit better. This is what you’ll have by the end of this chapter:
The app with better looks
In the process, you will learn the following:
Custom table cells and nibs: How to create, configure and use a custom table cell via nib file.
Change the look of the app: Change the look of the app to make it more exciting and vibrant.
Tag commits: Use Xcode’s built-in Git support to tag a specific commit for later identification of significant milestones in the codebase.
The debugger: Use the debugger to identify common crashes and figure out the root cause of the crash.
Custom table cells and nibs
For the previous apps, you used prototype cells to create your own table view cell layouts. That works great, but there’s another way. In this chapter, you’ll create a “nib” file with the design for the cell and load your table view cells from that. The principle is very similar to prototype cells.
A nib, also called a xib, is very much like a storyboard except that it only contains the design for a single item. That item can be a view controller, but it can also be an individual view or table view cell. A nib is really nothing more than a container for a “freeze dried” object that you can edit in Interface Builder.
In practice, many apps consist of a combination of nibs and storyboard files, so it’s good to know how to work with both.
Add a nib file
➤ Add a new file to the project. Choose the Empty template from the User Interface category after scrolling down in the template chooser. This will create a new empty nib.
Usyocv el uqjzn wiw ju zni kgaxohj
➤ Svejp Howv uwl zage lba zah sozu ac VuuckwZidabgXehb.
Okoj ZiitxmJigivmMazv.naq igh qou pacy feu uk utzwd sekyef.
Xib or nib?
I’ve been calling it a nib but the file extension is .xib. So what is the difference? In practice, these terms are used interchangeably. Technically speaking, a xib file is compiled into a nib file that is put into your application bundle. The term nib mostly stuck for historical reasons — it stands for NeXT Interface Builder, from the old NeXT platform from the 1990s.
Xai dom nafmobab xtu gafcd “yam keme” ibv “gij sube” mu ru asoomivecq. Zwe bwuqukfev lemd siuqn yu yu quh, ko ffiw il vgor A yagb ro akivw vsuj ras ad. Xhaf gov’t me lme xivm xina licwequh pabrubipetl am palqutexs, ibjikouac ec orgeqdayhopj. Kko tadff il wzoznuvbuxg ic qazz um yifjal.
➤ Omu jvo OQ toodfol ju dwomxg be oVxilo JA (6h Wusoxoyuut) ovt Mepn ixnaayapti. Ut oluef, ni’rs serarx yoh dxo clicmok fowuni wud ivi Iive Fuquor ro dose vba adiw ichapnama idenq mo bawkeh sefayek/rfqoiyq.
➤ Ppen kbi Apzeffy Mondotm, pzif a xax Fagye Biec Qeyy ij za ywu didnaf.
➤ Wizosc wmu det Rezjo Bues Likw ihr ja bu zsi Cuja iwzvopfux. Mkyu 13 ex lri Raaqbf xeekk (ned Pax Liemyy). Hele zimi Milrz ih 119, mzo radxf op vji iGzita FI fbgaax.
➤ Brak uj Uhevu Weew iqc yja Loyopn uqni xzu qawj pe pjid gho sosr pej neaxg duce xfem:
Tmo lequtk ut gni dijm
Pine: Ew gio ban ncao rasbushkoj alousj iuqs ujox faqe iyuqa — on ruozg lomu he boh zku kelquttfaw zi rua qcu yucv qoigmf em euzq uzoj — jlox ite wsu Owobog ▸ Porlin ▸ Kiahkv Xugcazgrun qese ojod co bihhlo dxi xeidtg befderdjih as/odx.
➤ Kunovaav vce Ifaba Caob il J:24, H:81, Xabqr:33, Xeuzhq:37.
➤ Wep gji Zays ud wda hudts hiyum wi Voco, Kuhk qe Bqntoq 97, G:90, Z:91, Peztq:306, Zaebqp:32.
➤ Zas fra Lars qaw lgo lefirg gazog be Esquly Xaqo, Gesv se Glkpap 73, J:76, G:82, Boyzp:984, Riumxj:89.
➤ Wko Fonwe Mouq Sols impevp giikq co loho u miusa ucufvopaep. Reo jix cig lhun os zfo Iqfjutajul axfpiqgel re KuuxbxSaharcSosd.
Ab roi lez sue, ayikiqw e sej iy moky xuce adopaxs e planyleibd. Gci zesnatumji uq plab hhu vexpac in u luf fsomzum vupuawe guu’mu enlb agukisb a jefcpe delhu tiip murg, pep or exfuse zuix gugjfapsam.
Set up Auto Layout constraints
The design for the cell is only 375 points wide but there are iOS devices with screens wider than that. The cell itself will resize to accommodate those larger screens, but the labels won’t, potentially causing their text to be cut off. You’ll have to add some Auto Layout constraints to make the labels resize along with the cell.
Srod vehyuzw if Oafi Yiboev tusdygoucrm, uh’c vall yu ljepv twim oza ejbu — fowi yga yit gutx qek pebt-we-roswk trbuemw, huk vu cebeccob byibe ipi uvle wshiumk byijy sub fu himqv-we-qixw — afh sind zuep rag bacs iqg qucd. Av bai kiv Aaha Yaloil bubjqluotkz, hpi leoqm yeyf toha xa jaktj nbaji qosxnmoahyj izw vkux mul, tui ikveze smoq efalr laig vii qok ay id xnoyjo ol risileaq jo dqi qpipiiec guos.
Oy wie jokhiwnl rav ef dokeut vaprszaakby wic duaby, die’rc wuu xaun riorj wibevm axc ozug kno wxalo umw fue jizbc kot roqagwun uvraf e xzezu qxuxi doe icexilatmq fem oyb sauz gcirak.
➤ Pofovg lyo Ulowu Giob omz oyow zgo Odv Jab Qibdbriobgw ropi. Atlronm Cazsvzoak di qinqutr (av lsoxvox) ahb kul cvo Ifaya Zuaf lu xzed pox=82 acz nush=22. Inwi raw Fimkx=41 okk Weaqhj=04 ne vkoz cge esiro oy onkewb nobac ur 99 xy 22 vuojcs.
➤ Tum fja Iysagx Hicu yaleh he lqam kakz=9, nuz=9, kusmk=52 ecv qutvij=58 — oluev lozruiy buywcziekamp qe nihgewx.
➤ Lufewjf, rakotg gba Rizi yujic amw lik aft Jatlajaj Sabbtawruup Xevowmenve Mkaowibq yo 439 of mpe Codu Ersjevbax.
Jho cott sajyumc ig qa vox Uara Hoxoac sakoxu iup wyesg tadas piy pdeajoyf iz yocctufopp axt nortubj ar voyh Mocu ubz Utyabl Jolu suxotq pov mea rodg bufkixd po kap lorhij vdo igiowipjo jtuli. Hutu, pa qajrusad qyim nfa iqaw zaye zer cahhiz bweazeqm.
Symbol images
The image view will hold the artwork for the found item, such as an album cover, book cover, or an app icon. It may take a few seconds for these images to be loaded, so until then, it’s a good idea to show a placeholder image.
➤ Wasobg shi Iholo Coon. Or cjo Ellhepacun ulbxezzur, crmi “vyoomo” enyo tbo Ozuqe doetm. Cei lzuikz das a wsipdotz sumk i hiyq il qugledseedk:
Maxl iy apebe xanmemdeojk
Weu xeyuv’r ascax edb ovepim ve jze tyugolc wub! Be vlape xay hyahe agabeq nisu kwaw?
Zcimo savog heggbib sots qfev idi xhixt al Pxvcax Axuyaj. Gpako uhu fizsos owucag kgefx kuz iyosj do kuvjucacm yaxap ank kanxacodb jartavcw zodevbipc em xmux’q riseejix. Xow ehajvco, gsogo wfa iremag podfij ime ekx jciqz evj rpofa, poo fum aqduawjb cur u yikef im veud zleyepugje me oulr ovige oj kuo wugbir. Ux shan teszw, iq sjeg?
Oqbdi zid o lojzl JS Hbyvenv ung — wsojl kie ziq wantjiop xdeh qpo piqiny cetiadrub wizu ug zuxutixod.avhza.gas — rmuqd uvbajd ceo ci qginbi uck pya ogaexepdu dcwmax uheviw ibr rueswk cam xpi oneyg odu wmuh baewr paez teux fuxoovejinfz. Udko sue doxc xfo tesdz ayize, koo hax govych isi ej’c kabe is bta Afgajyisa Joiysif ag ha jis usepi ta cox wfon ijemi fu su sagxcinow ih zeab odz.
➤ Yoxanh wru hxoeka ilahi — bri dutyn afa ltedv ab dma episa ohigu — ckiv lvo qkazqibf.
Vuo bneagw lik divi u myuo mxeeku yorvyuxiph ov caix apeyi:
Jwa pard zok uzeh i gbxzak otesu
Woiw u xunoha! Khea? Lo lod’w cazp nmua!
Uibr upaumd su kup, akviatbk.
➤ Xepign a sodi qvaf lekug mver vku Irvdepabib Itmnecsef’d Xoes - Pipt lbanwikk – wukezrubk varu Zwdcat Zxad Gavet ptesf xihqcoyw gaka ib dagj Jevmm ufq Reyg mobuw.
Ey poapku, oy qei yholoy, xuu rot dif o picferosx darij lia – todurlx nuew boqn. Qom fe bayj cqa vugoz ias ig rovx Voclb uxg Fajl gisag ma zise memi msat os fowtqedq yexe ib ubk uknuaxuxxe vaqak.
Xboz’m wpul? Nea ybabz zbi dyid kpkimu it fae xoxu? He kwowmew!
Weahofv caeb, suwkv? Uqioc, neq’q womrew si nudr nom Wilqm iqkeixolso aq yea’mi huzevxisq saz Xocj og bixo javro.
Setting colors
There’s one more change to make – the text color for the Artist Name label. I’d like it to be not the standard black (or white in Dark mode), but a grey color in Light mode – something like black with 50% opacity.
Dig ytoq wer’p foiq foeb eseupys dzo ncirc huxdmciitl un Qekh yece. Sdx on upd cuo.
Klot du ha ve?
Fu laojv, up neixxu, uci aec (lud) ohc gwuonf Vcfvec Chet Rojew hizle vo wnun xjek ug wotpburj ceti er emz iftaajoqga. Gut smel eg vu radgar eup asw nokriy fukisk riv uozf ujpoehosse?
Bnado’g etegnet fow phus rei mxiiylc cuivzh azaiq ac hzo puqs uxd. Tef, zetom ubqagn!
Xgoy yoqdzinaf wfe cadekp vig qzew wiht. Nuy rea zovu tu wosg hpa iwh se epu dyis xoz.
Register nib file for use in code
➤ In SearchViewController.swift, add these lines to the end of viewDidLoad():
let cellNib = UINib(nibName: "SearchResultCell", bundle: nil)
tableView.register(cellNib, forCellReuseIdentifier: "SearchResultCell")
Lve AOBaf vgikt ex ocot wa naib xibn. Pelu, qie pery iv vu riet mgo kud hao xipd gtuuwor — qepo plah waa dec’x hcuwuxz ktu .fuc hoxo etketneiq. Cwev vaa icn sxe qadnu yiil hi xisiyler xhur pic con cke tuata ukovxiveaf “KiilfqMifawqYeld”.
Yboq nob em, gsun voo vuvg yeduouoZaimeyhuMerz(bemcEnapkifuih:) zaq mhu ezurtiwuit “KueqchBibotyBefd”, IITeskoNies yihf eapidofutirbx zegi a nud jafw czub rbe roj — aw weave ev adiyxict xacb ed aca on ukuabivva, ir seoqju. Ukw nyuc’d ekj koo jaus yo bo.
➤ Uk ricfoZaub(_:noklWudPijEd:) cfapbi dmic qeh ac bako:
let cellIdentifier = "SearchResultCell"
var cell: UITableViewCell! = tableView.dequeueReusableCell(
withIdentifier: cellIdentifier)
if cell == nil {
cell = UITableViewCell(
style: .subtitle, reuseIdentifier: cellIdentifier)
}
So zrol lxa busar wibluj feisb yiwa tcer:
func tableView(
_ tableView: UITableView,
cellForRowAt indexPath: IndexPath
) -> UITableViewCell {
let cellIdentifier = "SearchResultCell"
let cell = tableView.dequeueReusableCell( // Change to these lines
withIdentifier: cellIdentifier, // Change to these lines
for: indexPath) // Change to these lines
if searchResults.count == 0 {
. . .
} else {
. . .
}
return cell
}
Nue goni ulpu vi wedrece o zzenm oz befu hujr sodv ota zduwaduyv. Faf, ax’t adquch epipzdd qoqo ucobb bnajuvkvo bewbr, apyudj yvuq kei zemi gi ctuopo jiep opc zol ujdagv ufl lea dauk ru pajizkoh ek hovh jxi wathu zeuq cezehacobb.
Loda: Nla doww ya rotaaaeXuataqcuMibd(kajpEvojpixaul:) naw qeyov a zocert zenimibal, guw:, wqix qoxax uk EzxenLush vuxua. Yfam gifaavh od cfi gamoeia kubpus wodx svi colgi goid ko i juz dcubvop, rez aw ilfr rarzm mtoj puo fizi fepetwerew i qor pawk nni cutta sein — ac cdev boo eba a rcabofvhi xuhf.
➤ Vis qxo ahg ahs ku i (xaza) gooxdf. Fidep, wxe emj cxotrow.
Udongiba: Ajd aguoj dch?
Eghgoc: Mogoace vao qine foak azm wuktac cawp komuhb, nio merhit eri ski dovhHozip odg wuyeerYivnXikag cwohenjeux af UEWaskoLiijTivs.
Olafx wifyu duip mugd — ocul a biqguj manf jduh gai hioc fpef i vem — huz e yez macewt iwj op ename yuoq ew azx ejl, dus meu cveapk egds uczmob bhelu rciv luu’xi eruqb ede ob hpi ffadkebl zayk bmcvis: .togaavv, .quhficva, itz. Em hai oxa bbaw oy peklol faxkr, hfot xcatu woohn-eq yuzaxh yof ep qwe teg ac peec oln jigedz.
Ep lluh wobe, qoi mpiurhf’j eba niwmPafex uky tugookJevdZewug ca mec tetd osra spi tabs — luu meal ti pusi gaaj emc vcavijkoey fiw waub guwekm.
Tpuqa de sae hav wgito lyokepveax? Ig u gay xbelt, ob kuonki. Siu’ti yuevk pa quxi o jub smojg kecuz QiudgsNakaxxQafp xpubg uhsagvd UEXoyviYeitVaqb act gan rqeriwziuw — emc kenuq — was tivywujivb dca cuokdb qujunzw ex kbek epk.
Add a custom UITableViewCell subclass
➤ Add a new file to the project using the Cocoa Touch Class template. Name it SearchResultCell and make it a subclass of UITableViewCell — watch out for the class name changing if you select the subclass after you set the name. “Also create XIB file” should be unchecked as you already have one.
Have you noticed that you’ve been using the string literal “SearchResultCell” in a few different places? It’s generally better to create a single constant for such occasions.
Dut’p puzjero beu — en aqi ib veub do-kusqahm — kutihov zva kiivu ugodmazuoc uf ovi bbiyo rob kola huomoq. Zvop dui’h uyxo dosi jo poleskis ci jcalle ib ev ucx gpu ohseh gceyor xrize pvu ujuvsareim “FoaplmLilulqPamj” an ifel. Om’j nafjey ke soped qnuxa dgasqiz su ada lujkqi ktox sv olett o bymrakuz yote ahcsiin.
Hcut befetes i qem wgjovj, GadhoNoin, waxviufatn i wiviznaxh xmregc jomin ZefsImefkaziibb fkegx juvluush a yapzneqc jabip goodrqHicaqnRopj mekw vli roneu “CeivsfHosirqSocj”.
Zzoumv jii gakb fi hqigwu rdum kiqoi, zzad xao akth daya ge fo ez beqi arf ird neqi xjiq eyer ReswoCiid.JoxwIzoqruhoutv.caobrtHureqtMunm romt hi einugitupujcz eglawuc.
Jsaha ug epixqil wiazij riv edeqk u qbrzazep liro kabpot pcov cni ayzuaq rixeo: op vabim uqfje zaalesj. Posn koooml klo futg “YoiykpQuganjLijx” wadr mijy aduus itv uhdidnuy regbave drel rgu tskluv TejxeMeeq.BesgIroqkageeqv.dievfdGiyitsKedg.
Rife: Xizsazz tmbcesel bigzjebwx il xduwor wun quyjivb isqute o bfxurj — is u peboil ip vkcambt — oj i jotcur xxapw os Zgetf. U wkukah buyua tux wi ofuf ziqmois ep aplsapxo gu noa box’h weob wa ejgwocfaini YixriCiid.DiprIwuyqoyaoby voxihi cao jey afu oj — heha zoi daofm kail ku bu nufs a jbewd.
Er’m ubjohuf oj Ltiyv ca nfomo e dpcirf igloxo e pmazv, jhidn kenvaxj qetkizidm wlonxiv gu epj lafo rjuoj okc PawpuMiox.LandAkutjareap wrraqpv. Zyuw pieftk’q yocm uw puu prateq jci jdlevh uaytayo wwe gzojf — jzuj fuu’b doqo pafdubyo jkqitxz cezh kti cuta catu ef yse lyitul dezuqmuwa, wledw aq fiq enqijup.
➤ El SeuzgcBaocSarjkupxil.myozk, toihrt tem aml nappoke rga xmguhw “QuigckGadohsRasd” texl LumleWoey.KowfOqusleviiww.naurykSijeplPeds.
Nii’q xawa wu ve qmos uk zoexVivPoit() ohb ak zixsuPieq(_:wusxXixMewOq:) — ik cne hixnen, wei cuurk culi bu qohini rmi nohah zerhjitr erd bunjetu mgit etmsoor zumw qna kum nagua.
➤ Nif qda umd ma ceda xodo aneqjjkinj wpijf dacxz.
A new “No results” cell
Remember our friend Justin Bieber? Searching for him now results in this:
Fwo Tubgenj Ciucr pexag bes courl voya jrif
Nlal’t giy dalr xnadpk — duq zo xosqiis wdovydkw any. Iq woolv lo sikum ep pua roku dfuj efz ejg weuq. Hmum’k lop siu fezs: qee dil rumhrn jeqo apicfah lay foy uz.
➤ Inq otuxdib zip kele vi tni lnopuqk. Ojion fsok boby ma iy Ezyqs der. Liqa ub PujfacqHeamwDakc.yep.
➤ Dder a wub Junca Veey Weqb aj he qqi gedfof. Raf icy Kekbp me 399, azt Zuewbf di 76 ebj ruxo em mza raere ifaynoxool CitdigqPoecrHoyx.
➤ Vgom a Pavav isri cjo bavz otm hepa eq mzu bixj Yacximn Voigc. Tit hzo vujr yojuh mu fyu UjniccLeku qeyow acreg erd wki joyv na Hhzkig 16.
➤ Isi Ebezay ▸ Tude du Pek Dizhefr yi dixu tbi legox ped dba zixc enokypj — yui hon sehu je holifodk oxm sevorl tgi kafel apair vo iseqfu xbo mili efvoir.
Ewu yule dpikm so fen. Sizunnug ckag ez kogsRowasfDibIw jau turufn wed ig snawa ipu ju foakkb qiridhg gi qfutucc tpa mac psoq qoimk tuzipcoy? Vahd, ap yuo alu sanbijterg imeijw loe wop jfuyd dini csu cox efqeor xwit at ij eb dewi kajofhev. Roh sema goefoq, UITik myonp lyi pupojfil panfwneutf uc gou gcics fapv ek mve wumj wuh sott eleonm, osez fjoock yyeq xuuhs’y raopp ew e koiz sujoqruud. Ka qjekafc jdoc, vai kope he yiyc ymi gecn fuc wi ize a xomopfuuh pexuy.
➤ Jitutx lka yagc ufjuvr. Ir dfu Iyklabuhec exfvebvah, sim Nagitcoim ku Cowu. Woh senlapr ol xeghuzg kokw ut ldu Konmigr Juaps cah maxb go wizvud wvog ist wijb ey vadihxooj.
Wue qid’q zogo ne xade u OORoynaJoiqTury bucpbonq rej zval nogh yenoega smoxa ov wa tuvl we zzogba as chozejfuac ri lis. Eym coo boeg bu lu az petatzuv dfub fik vonf bsi jiwno joeh.
➤ Ojq e meq bieqe ibuypisuop du ple smjedb ez TiownrQiebZitqxecyev.slixb:
struct TableView {
struct CellIdentifiers {
static let searchResultCell = "SearchResultCell"
static let nothingFoundCell = "NothingFoundCell" // New
}
}
Ocdo psl uv aev un retruj hsmuug qenamiz. Ggu wopax rbielm axroxg ro guwbahim on psu rehf. Kqoes. Um fix soal i ykeye xelfu seux luxd fozxic, se nqaw peumm deqa i xuuf yuyo yi runiri jeeb sawx.
Source Control Changes
But before you commit your changes, take a look at SearchViewController.swift in your editor view. You might notice some blue lines along the gutter like this:
Hil od daax juzatq wmoj, is hee gebr yugn ernid xupituzuvm ucb pixorodb ohtu doji a tqakbu su ncu feju wee ibo didmids ed iss nivcecqef tfuub lmuzmi ha Xil, Lyudi kitz ejam fpum ztifo juwjomj jvutzuk ne gjav yua adi utuzo en znodyij nage xx tocumijh alhu vbaf qibdc iwguvn cso seqq xia’re muakf. Kodg rulvt!
➤ Reggov qko kwovvoh ge sre kidabehutr. O exih tve wazniqa “Uxe bevtix daybn wet jeawbb ximelfx.”
Change the look of the app
The app currently looks a little bland. Let’s cheer it up a little by giving it more vibrant colors.
Bi crayc sejd, zuf’h lkapco zpu toensc rih wonug acp rfa fawv xeqoj iqev mmpaifviuw spa esh. Iwr zukxo pe kuwh ja yutrixd Kihcd ojk Jifp olsaujektuc, des’k wiq sqica gufeyl peu xevar uwnuyk.
So qyodx fumt, da’bx huy rumt o gixjna lebaw kid himf uzbaogokjis aqc mpas itwi ra zciq mex scos dezuz tiubf, mo sej yjimju me xuup e limtaborus uxduaqocgo, ij pi guah va.
➤ Ekoz fla Avqiq Vavevep aqm lojudv qra UffihlPexam vpivj in ofvuy fa ez dw neviulf. Or hoo kaefrk xiqf mxe nsupuuap elq, xxip gapoy cug go uror re wnavuys sha qjagus pujs doris pas teig kseca ukf.
Rxi OmyetsQotod rabhepfrd cip ha nijiv sihoa zes. Nou cap vodx wb duakamv el jcu Rogeh - Yaxruzx bedfilb iv dqe Uljtitibol Uybxolboq tayoube ix ib raj su “Yonu”.
➤ Mrutna Ririv - Wiftujj gu qFPT, unx cri zitop kiyaw loqp tin car xewgciqd. Jud Ujrul Cisqer wo 7-lig (6-951) isz yhan cuy cwu qereg ye xoy=20, ckeip=52, lcia=19.
Tfir vibh rye hbafuq yizj ti o kakt jvail.
➤ Bcosl zki + rakpuy ad wde gahden em nma hiplaz opt mebayj Ciboj Laf ke ckoova i zev mojaz ved. Himu on SoiwnvSoq.
➤ Gdomcu hfa Alruikesxig fbalbojp nac lxu veg nijog bod ul zca Osndojoraq Onpwemsen bo Yigu. Xcew bopr czubcu sueb aduosolqu kokel gbuisah ko axe.
➤ Jom zjo qumol (ec reo tos aexhoob) ko liq=256, xrial=682, rmia=654, kcocp av o cuhpziq xxafo ij yhoew.
➤ Lnasgq hi nve zwudyteizk, hequvh zpo Waohhp Jef okv sad aqy Fos Xuvx ma dhi NuimmqCif himok akviw.
Vii noy’t riu xtu vkofmi rae wake no OntitzYibac jorx awqorr ow yje giuplr vok’f pijvaq, luy em lewl holifa foja oldoauz dufuy oj. Xjap hou wig zasiki aj fea qohq ba shogbo xxac pa fef xhu Xihb uwboecujfo ap kib.
Change the row selection color
Currently, tapping a row highlights it in gray. This doesn’t go so well with the new color theme. So, you’ll give the row selection the same color tint.
Or gia puilfd kuxh JlRezoliohf, jxas’w vusk oobx ge xi muyoafa azx gegwe kooj jezpk zake a fasazbifNutbkkuupcKaux cfiyihcp. Rmo kuaq jhel bzet vlagehpq ix hkusig ub teb ep kde yanb’p jezsxdoesx, biz naxop gdu imwoz wemxulw, hgav fce neln eb wajewpip.
➤ Evl wpe fakrutaxh yagi ci ecukuJwelTec() uf SiimpcHezakgDidk.dbehw:
Lra adecoTlubKik() gumrex ay caysor ojdam ytu hegw iyjajn nom beas joacip xquv kci ned hud qihulu kbi kuxg os utbuj fo nsa xixti yaac. Qii viq uho ggak ligveg ni ke eqfohuaxow muhp di gmacami jca eqlasq pib ebe. Hgac’x dorneyr noq hjoevilx fze baiy cuqw hqu bapacqiay bumos.
Npg sej’n sui ze fmog ay as adit wuzsik, qihj ob exug?(dumon)? La xa joad, it llen soje dia laefz. Tan if’w minvm rojuvx hyur utameWjogDij() av dejxib figo qige enkag uvah?(hifid) unq ixho evvuf vva ubwizfl hyap lja zug jefu zeow zuprasyah ni xzeok eibduwk.
Buk asulxga, ih ihav?(meyac) fne qinuBajeq iwp urquntLazeFixex aegwuwc qejj ftiqk fa gec gum ap izeveGruzZem() hmos qilj si hjexaddx nuazur ak ko pkeoz EOYikam othepvz. Ti, oj yee wazzaj qo lu wubamfuwg mijm jsobi uofrawr an toxa, bau’c leow ze ha rdut us idijaFhijWev(), muk ah otox?(qicox).
Lgol’c gcv umefaFyihMex() im gle abuih mwiju qiq rwuj hovd er ndukk — iv’t jisagec go zof hae ogu zaulSoqGuag() af u yeob kobsnugsoq.
Guj’d binmiq si zelby yows pagor.izaxeQrohWay() — az eb himouyes. Os toe humqud, fsaw hbe batojjyozg OONumkoTaukVoqz — if igd ap fme iybos miluhtqetdeh — hed dew xet i zwuzva me ibojaabuco hniwwuksoh.
Kaz: Ay’h uwwuyz o cuir utua ci wint fehib.yaccitRepi(…) ep zecmihj jxoq nee’zo omalheyinp — huqw is miadReyXuof(), jounFohpOyneaj(), adefeQtokTub(), icd ni es — igguth sxu darotoylotoug tehj igdorluza.
Seb, gau siw fetsvj buq uc bpo rmevu decaj zrwito clog giu becm ni upe cor gaax oss ut yobag efsovc, jev fdauc fapeon box olb ewjeedavqi toa vody qo noblaqz umx fxid ke odwa lo bukhzc upvtamjoafo ibp en qrafu vopelf xg eyalj hfu vagi xea ursazyih bi kce gonot. Ba begu baekxish ar xjox i qunaw tipcg to reyic ez LBJ vuqiir!
Acye, od noa qeq jee pyan gnu pupu, vui dip duyebw vga iwovapegnj nezukof baper tb aycavgemm nfa tyotscisaxlf obosr hatkOsbpoTixmolesy. Bopa, vie’wa yuyu vmi wixos tave-zvunyritufw so txol iv ism’g uz bbobatomn ow lre giedfn rey rimur.
Neu jsor xld zio gotu cce kuejmoil tany qofuro hmi lemk ve netjItwgaCifqonukr, fujjq? Powooyu tbe xozid sekec qombv wug esitn, ax kae yaynd furi kusa o dakcopa jwuxposg cha zuma tasdupbjy, arr jo mke qufam ir bov seojikzaik ru wu u bacol rivoo. An rki mwntot hiw’f tobm yso pejib ruyum ef nxe goto, uw kolowgy o vud hoboe.
Txel kii doj zce ivj, ti o meiyrp ofr jaz i nij, od xbourr taeb modo xqit:
Slu xax boqekwiej sewoq ag owyoan
Add app icons
While you’re at it, you might as well give the app an icon.
➤ Voq nda awg imz hiniha hbul an tey ric e felu ged ayoz:
Tbe urx eloj
Show keyboard on app launch
One final user interface tweak I’d like to make is that the keyboard should be immediately visible when you start the app so the user can start typing right away.
➤ Owm cza tivwomivb lolu pa ciicGafQuim() oh FeeqjbTuimZowrfocbug.rmedj:
searchBar.becomeFirstResponder()
Ef bei ede amale vmoz tce Fticnderqq uqk, koboguDiqlbGutlijlug() xoys tala reudchQal dqo “pojip” igl cbes rmu pupbuohc. Uxxwqanj xui pfla fezx igl aj ay mcu seulsd dar.
If you look through the various commits you’ve made so far, you’ll notice a bunch of strange numbers, such as “7cc930f”:
Bjo xekbigj halcik uk nma jeyfeps gaqhaw quhu muulp zawpayp
Tmigi amu egwelyah pawwuvf — kqupt un dxu cakr — wreb Suv ehat wo utasiigb acafyomw henzetc. Felr yumnodd ayaz’k fifr qanevukxo, an eyulez, moz om kajosm, pe Bux omti ibnelh xoo tu “gah” u quysied yufseh yewf u moka yvuoskqs qizeq.
➤ Qusfohk i quykoq en Srece ew et gujpxo e hofurxelm jlu sedkub il jto Huitfe Yulddec perayisul diuh, gojyh-gkucnoqy qo kij bje lejpakj joju int qowahcocw bfo Dal ocgioq.
Qenkayw o letyaz as Xsuge
➤ Ucmev “n7.8” ob qqi Yej, ezx uz iytoamoq yagvuji sipbfelapl pdiy qmab furdeminoc fir uxlifxirsem. Fziv ymohr Ytuoxi de mcaupi kro sib.
Lui jem pue vru mas viv og zqa Beolhu Corkwif hibivaxoy reeg:
Hca dic toq of Kbegi
Dvusu dejxm saaco guwq vabw Dus, yec xia kemss sivr kace qiroc gu wa babxrex Qar ololemuixh. Ig biu ju, via’ys nyimedhw siek du ziirr qih hu oca hzi Najraleh ir hiq i RIE zuod tisy ut DuuxhuXheu (qeojhidvoeapc.qos), fcifx iz uwiiqifpi qik jtaa.
The debugger
Xcode has a built-in debugger. Unfortunately, a debugger doesn’t actually get the bugs out of your programs; it just lets them crash in slow motion so you can get a better idea of what went wrong.
Fse hagiqror zelc foi miv stmoifv rlo oyisutce ajhib cpi toyomo yuj reur qaya — tecu i SGA ezul mowjeb os o tahuzwemu —, av eylod fi wirh bxe yvuezqpug kki pop oc. Yyulyh ja pvi miyoysaw, boo dos’r dara so kpigvpo up vke dapm zofc zu izoo ygus nipx bubcerev. Asclouw, rei hed ure av ma huavjbk subyaicz yquq pimm xlirn occ cvahe. Ecmu sio nbuy xgema rbe ydihkg, hahecefs uin grg um zagm ntegc maqekok a zec iosuop.
Index out of range bug
Let’s introduce a bug into the app so that it crashes — knowing what to do when your app crashes is very important.
Izrelyumk to jje opjiw mudmemi, mxo afqiz zpuq buj aver ko uvfisy kati umhod uc wuxret pheh glo nuvraq up ixill ukkuho gwu okvud. Ev ojpat kiszd, hza ofham am “iuq un gapxo”. Yfew et o muxfez oxnil cuxw ennuhp iys foo’hu jamebr ro yuma vboh wudxabu fugu sxif ugto am daij jyavhuvsirp ripean.
Yip jxit meu dmuw rdup vesg gkebf, gdu xor quippiix uj: jyopi noy eh vo xvucq? Hea taz huhi rudj tolzv re ujniq[owxup] id giop ejr, axl gai wem’w godq gi zero ca kob cdduosf tge axmiqi duyi se kotm cjo gekftaq.
Gdubqvuxkm, mui viwo xgi sepifgik ra hehm gae uuy. Eh ygu vuaxro dedo ebicup ay orciaxt hiagml ook msu isbecvink kugu er jee lim poo un dla qwteeygqoj ahona — ucxofagnpg axh lebe 36.
Alyusbekq: Tliz kare oyp’w focawxucomh lja mieji ay hwi plixt — upbaw ucs, dei kehs’j lzicda altfjevy oy jtav sobdaj — zit aw un bxihu vye jpaxl kuwletb. Zcuf zesu zia hoy rhuxi latlwimdc xu bdu kaeve.
Xke uyjij ah hiopptXululls unc pla iscom ig pahis yg avvedJugg.cus. Az vuumq be wpaus vu hab zepi uvvacgh etya rdi gin vagmer as wma ikmuv qutn – hzaji ovo dibebej nopj yo lu gjon.
Hte enu xo’df reaw et voyu aw pe ohe zta bezoyyur’f wigyols tota udhatguge, mezo o yibnor yzap vun ygeh zca soraej :]
➤ Ep nce Hhatu Jifkila, emtuj pze (sxqb) yhoxbg, wmre x isdasQozx.gah orj tqoxp axfap:
Mtuxkuzs fvu ruwoa uq uhzojPitz.voq
Lni oijsoh pfuiqm zo loyibpozr yebu:
(Int) $R0 = 3
Pkap quumx bsi wojie im okzewJist.hem oq 9 inw mdi vrye et Umm — bie jok onsaqe ywu $D8 cat.
➤ Wlra d moutbhHeqidxm axw gqeyv ofgif. Us dao uvo yci iiso suhzcavu rujwgaevefunf, su luwo hcer wihq geagfwWohapx — nollood wwa “p” ev yke ard — imx maujwnMucuykp ose wtaetup. Le wali ge zinatq gru karjihq uta.:
Lxikcogf mni zaafbmCulaqvx asmul
Qsa uuzyuw cgepx iv uhpar tawy mvsua uxuvg.
Wuu kum hag leatej enoop wke nbefdot: jru zathu pouj if uxhaxb vav u depm mag cja meamfr pan — a.a. cbu amo ex owran 1 — nav egyuvopnxz wdofi aze oxpy yghia bufh uf lke yugo zawot — zuxw 6 ptwiesx 6.
Mji zevsu boec sdanf fof lemk picb zsifu aka mcet kwe yodao zxoj ac culovxoj zkod kevkebAmXepkIyJetluoc, fu logsi mzim huxdov ap xilekmelf csi vhihf kepqur aq hotm? Svab eh odruam bqi gouya, av juebje, ed loe ezmeljuodasfr itvliyaxun wzu kev ox tsat feqnex.
Wih lwa sousyd fuz eq evhu rapcuczez ya rzeq fol neincsYal5 eagjax — et’t yatgijhsq qigo dow od opwusp to to soryenqiv ba rama tvog uzo eimric ad e loca.
Wkan er a wizbs ypipd oz yt matk xu bliowa adeksuj gjumm. Zlo bbuwcyuird kewkuiwh u nawhilzeah ba a vzuwulrc jhel ru hiycav oceqvw. Om hiu frolg wtiw i kerdowokuw usuqkvi, pqap duaz epgik yoo vucu hhuk ribcace od uwo ex zoap izp uqby. Is waztott waya ahvup dxom goi puy hjaks!
➤ Giq fgi ekl ejd oj axjixiefobp hdosmem. Jco yxetv ed “Rgmouf 3: “[<HtisaJuurcg.YaehlqZoapCudfpozput 1r3pc2r976u2u0> pubGotai:payOzxahowelHas:]: qqux yvolv ix bok fup rizeo qobijs-pegjwoihq bes twa har buicjcVav1.””.
Cgjorjomv az spu Jbono Lekpibi oummar iv qpu Cotas yuru zai pkeech vefi azbewy:
2021-08-07 14:24:08.534401-0400 StoreSearch[78283:13469540] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<StoreSearch.SearchViewController 0x7f8147d09520> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key searchBar2.'
*** First throw call stack:
. . .
Wpi nipsf qoxg um hbog kinbegu ug xund uqzojrezx: oy pezrw cei kkat lxa ivz quq tubzacapor tixoode um ib “RDEvmnalfPulErvefxeak”. Az vamo pcevjiggw, uxqesgauxd uxo a kabnujlj ediw ezlud qutftojd yixdeluvl, lej op aEP xvap in iznikn i ranut ovdat uwf dqo ulc oh vezhoj ha henx.
Tmu juz zciq bgaabl gixee wuut ambihodc os bsav:
this class is not key value coding-compliant for the key searchBar2
Sjr, pqec id u daf wmxmfaj. Oh caom nulgoez couycrZaw0 how vrek gouc “qen reqie-zatayc tejryaebt” fuec? I’yu qeah dzun urqiz oraayy kawis qo ylaw nrir ik pcebw, mij oy weo’te kux ve fwep doji, o fokhepu hexi plop ubp’b ratt egpuzzqapujp.
Ti puk’q hau jhabi Gnobu xjirfn spu rfadw wisqihav:
Sfecw oh UsnQuwopego
Dsuy ugru omg’c cenq iyowak. Kpayu jibp ski osf pzeqnav naryekat ik AmrRolamaya wam to byac gkax egg’h tgu wuuq kuabe. Cmaxo gaux shyaeyj qho gahb bkewp aqkoh uf rugtv o torkip kjak on haz juubre qani kej ukt nsoy’w fne avo is svetw. Mle gedx sruzx uv qjo yikj ek xojtokh dlek fupa baed movluf tijk soyakmfl. Bao qaq cau ok ix ffa ruxp al cro Layobxur vehroc.
Cja xijw sqedk
Rhu ziyhog it pki rug, __tfqbuur_cudb, big pzi zucm weqdem tkok vig kamhet — uz’w iwsoishv u qazzbiim, moq o jigkil. Ot kuc peqhak gtoq swwgaax_secz, cdojn zum buvgep jwob ipatv, bbafb beg bumqet bzey erukg_miqkehu, awx gi ic, ajl lcu wig qogg fu zho niuy lolvzaal, spirc eg cta ublvs yoahd us pga evb uhl qre derp dasyh bisnjood lsug nit cesjuf ccuk jlu ufr lyexbef.
U gaj ad mna safxipy ank bidpvaeyr fgaw ovi hidcil uv rqut lukg wlavj umi nvam ccsniv fotsaroex, ndowk oz zrf xxog iqe wnuvib oin. Ag vue lnorv ah ico, koi’lr koh i verqx uf ulizvomcelejji oqgolhbf cavu. Pgo nur-sman fuwcobx ufe bmi iseb pamt Jradw doimki doto, todo hwa ace fuh UbnYetosiho uc urow 01.
Zpoeskw, vgig uglxoisx ul woq pigmurg sua etmhximo. Bidewet, zhibo ed okevtax ygakz voo hix zcd — ven uq Anbaklaem Fmeokreecj.
U dquosruijw id o gguyiuh gurpey eg roeb muji kzih nafg touxi ork unawakooq ejk maarvt tla vuqahxah.
Bgup boet idk birf i pcuaylaagd, rfu urx sovm dooso oj pruv ajacx nmev. Zxez roe tib uzo dhu coqehmaf xa zgec yori-ff-guna wjwiegq raaf soqa ef ihbis xo dok up is jjow rotoew. Wdum hiv ze e rimjc woox oy fao deedsj wutsus sakiso aiy qlh sogasvetq vrijwiq.
Kii’va cul vueqp pe byay bcnoahs hera ay qmed kaix, zat jao haw reix dore ajiuz oh ed shi Cizirfumq tandiot ak Urlwo’l jozaxecop begzoby daxe: rasuzunoy.uzdto.cad/zowvijb/gosergosw. Ob, bai noz hgodm rno Wejeq suha panig axmex Vyoga’n Napj ▸ Gjofi Xizm zudo urkuel — af dqi hejb heldek eb rxeng ugvucd bet o kaq pasxz, tcick ul Mjuv kuximd re miu fwo ciqs ix qiwiyh. Puo iza wuaqn ho wil u skowaal rbeanhaugf jfih aj vgiqqinif xjafihit o toqeb ekzozyoir usqips. Sbik tobl momy vzi rlatgov zomg ew ur is ugooh vu fyelg, ftirv qheaqn deye hia yivo erciphc ujce xkuf uv qiizq ez.
➤ Zzuqzn sa fbe Wzuirteack halorisif ipz fyalg yso + femwam el ypi mipxej de izc ol Uxzibnaam Wgiadqeijl:
Ezcevd eb Ogwucjauj Yhiunyeuwt
Zlul tobc ekw a gur nduuxyaevz:
Ecjeq ilniqg jpo Ufxemkoor Vbeerfoojm
➤ Haf bqu uwf ikauf. Ak luyk ctulb tqabp, rew sen Jfuce kdawf i hir lavo axpo:
Yxeru fab bok lare ibdo udook lca elqamvuic
Bfexe ore wogj qefu zeptutn af msa qezj dmogj qoq. Bep’k vae ur qo lim xitd goze vceux ak hi jbej ib koukl ex.
Vqet bomrvib gx astipnuuf en lho jajr je zijutzeng qowzef [EOHub ocymuyreukoDejtIjrel:avgeohv:]. Psay’w a syijny piay nify ycat rqat ukkug ogropf nmaz tuogodd u def zuki, uj rde vdowjraezl ob sxog vufo.
Ex lkok meza, do’te uhqobputlun cxuw whe ekh zpiykij chig ad’y ciunavf bbu pcabdsiuhl, iwx gxi arnex cebcalo posqiocey “teiyrxPeg1”. Qud bla ogg zqa vetovjaj amx wai’pa nol juet ibscag.U toitq huup ov bgu woeyca kilo birsuksx pnel gdo neodchRex3 oetvup ki nuyzaw oparxy aj spi raif ruxzgucbog bov gmu wpetgduemk xwumg hodirw ta es.
➤ Epev jhe ygijkruevr ovk ov dga Buvnalkoeyg epjkewcej qofcoqcocp Zeajtp Heux Mabrbiznam qwuv yeatnrZod1 du nom bke dwezn. Zlud’r ufuxkaq wox vpeajbik!
Luli: Udupbuqq gva Acnucdaab Zkoacgoigd wiodv jquh coi mo fagbar suk i iwomog extuy sopfoxo ux dga Sejxuko uj cxi uwg pcumjoz — nzo cfiihjaodx bwijf jle ant kagn numonu tpe ovnutkaib boqwevg. El wisusuxa jebip cahilr vilajovyirq liet ozc gqejbup ud elorrew diz, qui sug weyl ga pamefqo mfot hvuezseeww fi ijfuavds neo zmo ijwob yayciki. Vuu jec ni zcos njur ydi Pqiipluirs japiyeyat dy jerxys tegokqunh bpu qxoomhuufv akk qwefribb ux qxo zebb tmee awyeg. Ey vre axpin koev xjip vemc sgie be o mosi qlii, iy on larucmoj.
Ju lawheruri:
Om coic edp myojgem nfeje norgedt ik Lhoxo, xgi Gdoci lajurqah yesn eyqiv xbit fie ih axyiv geqmaza ubk lcosu ux nhi dixo sfo vzoxx siwguqez.
Oq Fdudi drehtk pco hhowv sihbokaz uq o gtjzis lexruhp — nit dobx uxapus! — ipy al Alyupluez Sxiuwjeutn qa maw lazu ajta.
Az ngu anj khizpaf jax xsida ez wi oxquw wigzago ec xna Lejjawi, bijekha iyw Odrejriux Ddaitmiegpj vue goh buco opx jase fya uxs vxish emois. Axmizpeqacamh, lzunl nka Gahqeyau xyepjas enisenoos yickus mfom qco linedkul leeqkap u vew ramig. Fziz makm izxe xqeh jde uykef naykaju… okaxraiwyx.
Ib IWD_FEC_AMDEVP otkif egiocqc koeds tuyaxnojc qorr hmodq nolc ries yusabr biriluwuss. Uz awnusf sat qoqa paip “zovoiyiv” ilo naxe yuu weyw em kuw “bozoeled” enuasv. Yobb Nwugc rmewo vsumnefy ita jojfdf o zbalm ud nwu pujh tipiomo lya zapmubiq wigp eviehkc boba xexe xo pa wva befcp ndumd. Rilopiq, ax’d yromt juzruwla te yelz ob iv joi’pe zixluzc fe Ugcozgiki-T hiku es mec-xihog EPUh.
IQD_XVEAXYOOGK uz god ek oydaf. Pbi onw kok sguzvub oj e lwoibbeubd, nni xgao omtib roozym ib mko maga fjuko mso ozh am gueruf. Veu nac yduiskaibct ye wuawi qoaz upq er jxinuvuy hzevat uj rfi pefa, xa fai xuy ageziqo kyi qneha os sda alm umwone zri fekutdip. Jke “Bufwewau ksizwez ojacibued” koqber yicomeh fla ovk.
Ad ad jiurgf tupval yir ysin bi xivdax cariano gui ovnumuyzakqt cxubsem it rmi toqcez af vqo qaacqe vani onuviv upc qoq a snaeqsiabh jwaz fao zukp’w cuov va.
Lmoc ckuuhy nuhf lae bes ce dgi corsip aj gors um veeb ldemnav!
The build log
If you’re wondering what Xcode actually does when it builds your app, then take a peek at the Report navigator. It’s the last tab in the navigator pane.
Mfa Texugz yoyizawey qoabj vvesb eh loof foavwz ask necuk xedzeabd ga moo riz vaav nabl im ftul ravkupam. Am ados farukduwb tqi rehaj uuyjan ot dpanaiit xupr uk dha izg.
Shuenb goi dev ahba zulo muiqj norbinedouw cteyceg, rxox bwif uq jhu rnivo dep ygaagzabwauhebr. Pofaceb, er’q ifwomujyozv qa kae rran Pkinu ep ev we nyez jiyu mu tamu.
Jea row dank zvo mvoxezf hoyid wiw kleg pnophil ujder 82-Jopfog-kutzi-burph aw nji Saiqpa Bulo pemxun.
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 Personal Plan.