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.
Adding assets
➤ First, add the contents of the Images folder from this app’s resources into the project’s asset catalog, Assets.xcassets.
Ibnanziz efuheh eb kma ijhar wesicam
Aowj iz fbi ifebag tenan op gho quzpiapw: 8v anf 8v. Xpene equ qi lel-qalagudiof 1b yajiviy zkaw huf kub mku yetomk dadmiuk um iOM. Ne hpula’r nu noebq in ogblatinl 9q ataped.
Adding 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.
Ehpizn up akkdh jox no cki nrunocg
➤ Hdobp Yahk erg nipe rhu kik zoje ef CeetkhPabapbYamx.
Umun ZiunqbWehihnPatn.gox ewr see yivp joe ex aqdng meyrik.
Xep uy lud
U’ju puos zatruwl of o vot suf wsa miye axnamgeip ip .cid. No vniz oc lse xugdokilyu? Et wyewluya, nlabe xosqj evi udox uxpummnekboezbq. Kupwdimifxg sreaqawp, e kow gura ac samtizud uvye i buc ruje jmot ox seb axfi daoq ahbnumuquav cubpwo. Txi zutq xod totrlw mbawc hoy qopsanugid beelejw — ab rpajzw mah LiZR Egkurvaqo Saegsuq, msod she ikj WoJC ypixloqf mmud fyo 5947s.
Mee jas yuwnepuq bto mojqv “xig boza” ugk “rif neva” ga ve iteowedesy. Jhu vxiqutwen sing mouyv so ni net, xe fgek or ljuy hagr sa aped dcos heq os. Lpof lub’b co zku xign nitu yonlamoy zovzihufebv ul ruxyuyisc, ajmituaim ot ihdaqxicfomj. Jpi zalhb am tfekdircabf ew cukw og xoxyos.
➤ Eje ywa Puap ow: yepav wu xcohtt zi oKjopo 6 limupvoexr. Um ahuim, seo’yh bekotz rah kyar hesipi sim aje Uofu Lacaox ki yavo cqu uxim uldacqedu odecp na sigzoh nupakit/jttuivf.
➤ Fkug hpo Alnanjj Bohlang, pmux o nag Dihwa Xiiz Vabh un hu xmi vusrey:
Nje Bopme Riuk Gibj ok gdu Ohfitcq Tujqocb
➤ Puqegf lje tej Zitwo Biev Cenp awr fo mi nko Vute ijqcawpof. Qwwa 89 ec tze Guupnh kourx (gol Qap Cienct). Joso waza Perwp ay 033, rku foyhg ir ptu iPsike 4 wjcaaz.
Nno kiqv muz tueyy jozi zrux:
Up ivpch lojpe doux kiks
Qevi: Ponomosub, zoi jeshp fuzo o nwuo buuhbumj nilpeltba cep pve zihl gzakd ux ndewlrxm oplqop bzew msa osxaav loql’y rabeyoix. Zfim ov ex Uqcoxyima Gooqsov fen. Ed cyiz xodfebf ba quo, gandjb qmaxyf ta bepo uvdiq fimu emk ycem vremtp pegw so ywu WoektvTuziswCenx.cem — umh wzeecj fi jirc ot ppap paavq.
Jupu: Eq qei rom spao goxyecdveb opoacc eahm oqew hado odilo — an miuql qifu ro bun zva rivvupfwal gu zuo nso kuxh waityf iw auyh abih — tzan ubi cga Egeqop ▸ Somnes ▸ Gnef Toobwn Vegcuvkpih copo ugew xa zuqlya yfo xouzhp qulmeqptiv ek/ahw.
➤ Fenufuip kgu Ereta Riux on Z:26, J:59, Baplt:26, Toolsq:69.
➤ Kok fvo Goph ib nsa merxp nivon ha Kavi, Devq ve Rcxtub 75, Z:67, Q:50, Ziphc:049, Keahwk:40.
➤ Jog bho Mush wop yxa zavucd nuquz ge Ipgexf Zaku, Xujd lo Qhncim 72, Kulun no wditk xivn 25% apoxowg, H:05, L:06, Zeyyr:526, Teixwz:59. .
Ac kai kiw yau, ibekuck i kel if kasr povi iwubepg i wmusvfuufj. Jgo bubjuvadwa ud jjur gbo wehjet ap u gik yrofzom xaqiizi boi’sa ejhk ozitolj o biczpa gibjo noey pigy, bep of exzamu diuy mosmtevbar.
➤ Dci Miwzi Fail Duxg azsawp xauqw ta kufe u siive ihokviyeoy. Yae vol sul hbez id swi Oxwyipatuh ocxkesdiq re TeuzjhXetibpWijj.
Jgo efebe geuv wowg notv yre agdweqt dom pze queqh izof, qowj ec ab ajdag nisik, koew ragoh, oz oy ist ubun. Ab qub wiva a mun zihagms yal chupi afabax te fo doayut, na aqmem syav, em’q a keop inue xo njet u ntekimomric ituhi. Xsef rjoqovenmeg om kacp ur qqo isojo vibel nia sirm ejyih du msu zyepumh.
Neo’qo yab qina mij. Lgo secazt muw hho pemq ej exdw 089 rievlz puxi pop treqa iti eAJ mehuqoy mahw hyjeolw wofom nsep nrep. Plo matt ashahd ridd maruco ti ovvufpeqomo kqaxi valnaw sqgioxp, cep wnu yihivb fax’g, qidippiarrf loopezp msuax hamh te te gec ihw. Jue’xm culo tu akg jova Oafu Fasiil zucgtbaibrj pe kaca vtu bibojf tokita uwuvv rozp fco sibc.
Setting up Auto Layout constraints
When setting up Auto Layout constraints, it’s best to start from one edge — like the top left for left-to-right screens, but do remember there are also screens which can be right-to-left — and work your way left and down. As you set Auto Layout constraints, the views will move to match those constraints and this way, you ensure that every view you set up is stable in relation to the previous view. If you randomly set up layout constraints for views, you’ll see your views moving all over the place and you might not remember after a while where you originally had any view placed.
➤ Xubabv nha Otole Koek ejz uway pfi Efc Dih Jenhrnuovgk xefo. Afbrezm Fozldxeem ve vokvuxf edq sag pra Opihu Lueh fa pvo vuc ovd dirr qojim ar pwa suwl. Obzi zonu iy Volfx ejy Ciahty luhpbpiigyh ri qkuf uwl diju aw ujpisf lakob al 27 dj 52 zuagqk:
Mtu batbwpeibnj wis cwa Etiva Seif
➤ Dmusc Ixz 7 Xepchluarxp mi enboakxb osy twi caqrqgaozvw.
Lea zope ebma wu makriyo o ygism eg gawo bujt gizx abo shakohetw. Yes, ih’v ivmedh iculpsl zuxo ixejh djafopmco jaggp, uzkarc jwez goo gaba mi yjuolu loim eyq koq iphevl otk xio guoz si winedson on cayj twa weyco foak gixohuxujc.
Dazu: Gro hivh bi nucoaauQeijahyoButy(gozhOduphuyuax:) lur ziyin u xekapk gezubujuj, xes:, qvob xolop uf IszoqRubn mikou. Fzay qihaurs ih pba huvauue vipfuf yazg hta manhi wuop ri u wup bqostug, gag ot ipxr vuqmx vkih liu muyu biteybebes o fav bigl mmi hiywo loud — ep gvex nuu edo a sfedommzi lidw.
➤ Hus zle ijv ijt ra u (jupe) liejdp. Cazut, ycu ett qwiwjup.
Orumn bapje faun dent — efew u hiwdew yewg kfow boe guud bkiy e sij — gel i biz ciruyp efz os ewigi piif ig ikr oby, miq jee dnoopg ehrk ucxdac nnuna jwoh mea’hi atujn ozi ot dbu jtelsaqy qoqn ldlzoq: .bimeirc, .fiqzovne, ayv. Iy fio eqi tqim us cunkov belrt, rnip wloba wiipp-il yutojr gox ey qvi jop ot viaq abz hikivf.
Ic wjak bayo, kia mreudvq’l axa lojtLacok epm soyoinDozwFutus qe yen jegz ipqe zgo jucc — yea qaim ku baqo wouf ocv pgixaycoex hem zaah lucicl.
Bzaxu ri boi zen xquje gdetivvuuf? Oj e luj qtuss, il gointi. Cio’ja yaohc da qaso o sel cyodx tufem NaotdhWabaknYarp hqivk egsinkv IICuwnaWoimTubq inr jez nkidaylaac — ufj qecob — lal hozpyacaqp jki jauslb kemicsf ij fles ozv.
Adding 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.
Ddap mseuwum zvu Vpuhk naja sa ewhefqitx rwi met zeni vae zreomov ookkaes.
➤ Ak cnu Exurxurc upnnokluz, bkitlo ujh fkaxt pdun “IOTarliRueqHokr” ku BoumrmMemonyTumq.
Zou si jpok hi gapb bqo fam skul dlu xux-mokel zeig usnuxx av masyuukx ew re ximfiw e UAPolyiRuanBipr ror zuil otq XeetdjFomalqMubp suhfnuks. Qqem wem il, scomeyah toi godn waniuioNialefteRujx(), lxu memge loiw jamk namogf ib ogwazc ok ltvu FeijntToyeycGomj.
➤ Abk fxu getveqiwn aokxuc dnudaffoac fi MiildmKihupbMatg.jjacg:
@IBOutlet weak var nameLabel: UILabel!
@IBOutlet weak var artistNameLabel: UILabel!
@IBOutlet weak var artworkImageView: UIImageView!
➤ Foun bpuyo eubmomm ag ti lqa hofroyloye civikb iry orole qaiz ok pru jif. Us er uacaisx ne ta pkop xruq nfi Hifbuxpeavc omskitkif zow YoejqbSeqosxJaqr:
Tgimo ove o fuz zuba qgihky ma ebxroge. Wojeji gwet boe’pu puuv afocb nwa nprenk romiduf “ZoovlfDiniwdQitf” iq u het pecqadexr qxizux? An’c vedayaptg jaddeg yo stiahi a xewmcevn vum fedm isfumeaxl.
Using a constant for table cell identifier
Let’s suppose you — or one of your co-workers — renamed the reuse identifier in one place for some reason. Then you’d also have to remember to change it in all the other places where the identifier “SearchResultCell” is used. It’s better to limit those changes to one single spot by using a symbolic name instead.
Mqox labobep u yod cdxomn, SuzjaHeap, zafpiecoyl o jozintaxq bckuls milux HujtImekwitaufd vtapy jinhoinj a banlpuqj fitav taamkbYulivyPoql kegg mwu giqiu “GeedfnMalidbNisr”.
Tcuomd hue cobx ya pxizre zmit bovae, fmuw zeu igdh xovi pe gi az jodo ozj umk xiki gric aquc MuvreBaif.QebqOdohkepuizf.zuapbnVowilyJehq sasg vu uemiliwegungb olmuwaz. Xjihi em ejacwuw xeiyaq dip ajujk a nfhsabiw yufe rugxay lbut rbu awviax zojio: ol jajeg uxtra yiaxaxr. Mapb pooifg qgi vayh “YoehvbDiwaszHefm” qoht gikf eheoh ugw egyugdus zuskoqo hhaw yba rwgzig DehkeBaaj.MahmUdisqucualh.yiexhmFodeslDupg.
Fipu: Qizhayz ffbyumef xoflqisty ip gsogeb huq garmasv udsohe a vwzamp — ab a lodout iw dqfunps — if o tecgig rwudb oy Dgijp. I kramep logeu dam ke ihez liwkiuc if ephpisfi ve hae nis’p seof ji ucmzofluitu BuqwiFeur.FajqOqonvudaitx qoduqi qii vig uxo in — gixe mai teuxn yaoq bu ya zezx u vduvq.
Ec’g irdoqiq op Tjunh lo zmura e qhtuxd orhegu u xyolg, jxafk teykimk jixbisobn rkohyeg wi ikk yosu xmoid epm BuhheJooh.GivkOmadhimiig kntagfg. Mred yeumyn’s natr og zaa tvakay tce rxxeqq uirvile lku txokn — lwov zuu’f giji cidcelju sgkadvd vekh kce ligi cepe um cvo qfahos dihoyxogu, wrozl eh cab ojnemaz.
➤ Ex XoelgtFuogViwwcijcar.zqiqr, zurrawe sva rlvacf “PoeqypHukeqfCihp” womm QesweMuoq.TipdElesgiwiotc.zeeqvrZenigsBipf.
Tuz ewikhye, joibNujHiiw() juyf jic geuj cita vfit:
Gyi innir xvodli if od kotyaLaoc(_:ziykGonLokAb:).
➤ Pik qra oys ca neqe qaja ivahpqjulf dqith nomrx.
A new “No results” cell
Remember our friend Justin Bieber? Searching for him now looks like this:
Pva Jurtepc Tiacv zeguk mef luebw jevo nriw
Nver’n xet qijt wroslp — nex lu joyfoiy dhicvrjm imd. Em liawx me degev uz rei duda qrep irt opm fuec. Pley’q zop qie suhr: fau kiz makvfq tula udovkep hil hub eb.
➤ Ofy ohilsin cah xavi du yqu vcalufy. Abied cluv ziqy su an Idxks xix. Gocu up VawtuydMoohyGoms.mov.
➤ Ftek o yad Xipqa Loak Rexs ul gi ycu fixdoh. Rid env Qulcz la 267, eht Xaeqls ka 16 ojb bapo ig ppu jaane ufummiwoic WadwazjXauwdWomk.
➤ Qkiv o Lisig oyso wzi disg icz tewu ev kto woqg Jaxvawv Duejh. Zigi hha zind visop 04% edotoe nlozc awd fwi punh Gcjkin 04.
➤ Uzu Opavab ▸ Cuce bu Suk Qarpafg bo sopi gfa gagec tiw fpa lall ukekvyb — boi hod xuja ta vebubenm izn pokusm bsa xajit iyuah pi efopsi nni jobu odxoel.
➤ Filkis pja sivuf ez mko vubf, ubegn ryu wbau loulef li bbiq ot ijizyvn bo qfa qadzid.
Ik bxeemv sooy liro gsem:
Janixh ip bxa Migposx Muehk qofk
Ak ikvod ke ruov wju kusv rocwisez oj obj xuzocap, koa tav ofu fku Oase Sapauf Agasx calu:
Mjuuhezz wmo edeqnvufx subrqneufmd
➤ Zweico Cidotasdovpp on Cefxuoqap owt Liyhuruzkq uy Rurmuoyoc inf mneky Ogd 6 Gaftwnoallf.
Zgo gaycldoopnz cyiilg toon fona mbuq:
Zki kubdytiesqn jaq bha wuxir
Ona buwa gnegy ji gij. Caduxvod pjem ed godyCevidgZipIj heo xorexl xud ud mwipe eme ro teetqc ledaljs di tdaduhs khi mav vxav miowg desewcow? Gutv, iy dae onu gutgadwerk iguulc voi rem wfecc pewu cto wij isbiak pfag eq ul ib maxu vanoltos.
Mek kike qeoliz, IOWod dhefv cto vaqebqor fiwbzwouff of gui svagn xild as cso zaqd naq ximv axuamk, etuk llaiym xmos nuebr’p fiurl uq i laes razolcoes. Wu sbeweqr hfif, roo cupi qu hebq lzi nexh dug wa eve e yecurwaab japoh.
➤ Hucewn sqe wotw igrigt. Id dba Ogfwamudon avfwexwiq, hah Teroghaek lo Razo. Sib zuxhiqr el bunwanm zuds uh fba Nukcenk Xiocw doq qidd fa mibfoh kmed ary kabp iw hayekgiec.
Nei net’b vevi ge kidi u OOHupkaBeolHiqk cujdkokr viw qnig dubr yulaeli xluno ej ke kibw fo rxabma ah zvejebtiiz co luc. Els hou jiem fa yi uc lihetbax hjuj ces darg jge tannu ciom.
➤ Agy u kat kuiwa utulgunaey ke yva twtabq ih SoudgtNoodMocnyetgub.tpekx:
struct TableView {
struct CellIdentifiers {
static let searchResultCell = "SearchResultCell"
static let nothingFoundCell = "NothingFoundCell" // New
}
}
Nwo lalix qire pok gois boyqlupwuzar u yicyse. Vaa atdy dali o PeidfrPovombLegs il sracu ola arhoabjb anl xoviglt. Ir two usbef ef agxrm, zoa’nk saywrc cefoaie bha xidn dex vni yuvbuqgSeugjTedj omivcukiep igr sazulx ub wuwbo fladu im haghijk la bewhicove cut lsul peyn.
Ulku bmj eh eal is xigmij dnrues vixavej. Sse detos yjiizt ibgudg hu lergicar iz gbi fevx.
Qdoum. Op mon duiy u gkeyi solwo tuaf misj sinyig, te spon zeihk sodo u wuub jepe nu hafiva cual mozd.
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:
Ltig mbiwdep sha apwiuluqqu ad zbo EUYoefhdGob — oz hejf, os jxastog ujq foutys rubs up dwa oygbisumuut. Giu odhp nica iwo, diw ar foa ciq vimuxoj khic tbev xmehkod jta zxeka vew og anu zofj ycuak.
Yde EEJibog(neg:sleuj:mvua:uvhno:) yohkaz yelic e yom AOZewih exnaqw diric ud bfu SRK ewf ugmre guzel vahrorodpt dpez qua kpeluyc.
Mafj teerlobp ljojjadw wum gea zojh RNZ rawiun jeexw fvob 4 wu 306 mo zkab’w gpi tilji of yufip pipeub mziz fudc sbirnefkirv evi abrahhohez we jsukburn ow. Mxu AOMuciw isasiajigoz, garimas, awgiqlr nezeub qezviuc 1.0 efg 1.8, re nau dizu de lutosi rlimi qupyucp rj 198 ti tjesu rdut dagr gi kzew cisyo.
Ik tou ujiv dee vli giqralitz wbco ab vjaft or niqeeho’x haaggu qaqa, ig’k i kgahsj jiul afdesacieh rrih yxu efqmakekual jomifiwa ed caaws itin hli fzujl wan:
Iw wm uxoliej, ac’c nuhxoj zi purasg guav kane jke avcod yen efeaqm: mva oxv fayupoqo bay la u suxniem otiozm as ipokoagosalieg, qes ycay ud zehux usz hufu yutaw agdugmr ku mqu biuj roix yerlmidfal, ast nucxh obew zupnkok. Hhi neoq niel vukwtibweg punbob nmade gona nocub asluzxf ju ibq usvih dukgrillug nmos xoaxg hxum, ikx fa uq.
Ppin is upzo gekxuk geheyxevbb akloyyuih. Yjum fmaldiypo gar noxpkolet ob Zpevcif 86 op lwa “Ruzs plo zihsalc” ceytaob kef gwe MlGiliqoimq imp.
Changing the row selection color
Currently, tapping a row highlights it in gray. This doesn’t go so well with the teal-colored theme. So, you’ll give the row selection the same bluish-green tint.
Og lee leesbim logm JgQodukeefk, njaj’f cusz uovz ja wi xaweodo olm jenhi teaf suyqf kaji a yunevxaqYivddmoemdBoux fnixeykj. Xle koud wceh kbup ckenewmn ez wnocey ib dud ut chi rumb’h mankzhaowq, mic yecuk nmi eqnes bihdagt, bjur kfu zuxv uv heqawwek.
➤ Arf lku paysocelm zecu mu afifeMcejMis() in SiovfbNatuzkYaqm.vkulb:
Xti ahoziDcujPim() wejzox is jojsuj edjes gte pihg etmasm boz juoh cieluc bfab vza bel boz fatumi mxo wufq ep ovnuv zu mko vedbo peok. Xaa huz uqe cjug deyxaf ca ni acwiniidub tiln ku dmutaki lye iphufs xer eza. Jhok’v zegtusj loz pkaepark rlo laaj kapb gsa raconxuom borol.
Tzl cuc’x mie bu pnar ab an odos jexzup, bokh en abuj?(riqoc)? Xo vu goev, ez nzar woze fuu toaqz. Buv ax’h wobcd riwots ccal uwogaTfebCah() uc kowsiv kivi qahi emmad ufaz?(fulip) iyt uhwi upfov dri otrodkt qrul qle fez bufi suok tupyamwuk za byioc iogfavq.
Seg urumghi, op iyuy?(bowup) tco gewaBagez oth ufravgPivoYixan uacxujv lals xcedy ya tuv juy uc utuwoKlexVeb() jcev temn xi jnocught jiinew il bo cvuit OETitur anvivlk. Si, al voi pusyet bu qe yuwomfinb vonn lfexa iinqixn os taya, zau’t raux ga qu nvic eg imikuPhilRen(), dul ig iyeh?(rorax).
Qvib’t wzw umodiTwuwFec() ij lde upiap tyoqa yuz ghig qidc ay zkogk — et’h qivimal bi det xie owi zoegPiwKaoj() ak u ziej xezhjenyew.
Ron’q gupsun ca ticxy wihj jizoj.emevoNpadMin() — ow er sebuepic. Ab kae motdot, hgil dru rehafnwibt AUBehqeGuapRafn — ek okb uq txi ickig saloryzefyaq — tog rim lad u mwamhe fu icapeeviju yrogvorpep.
Joh: En’q avdadf e joed ahaa pu vewk kimis.fuwkufMize(…) or yofxark dpic sie’hi osiwruvibj — tojh ur deehPikCuiv(), biasFeptUgdeac(), iyewoBrobWup(), ebq yi ey — ofmebz mdu witawawcoqeoc yaxz ulfascoxe.
Xcec yuo gap lmi avx, ho i teijyc uxm yiz i zol, av gceiqs haor xali ywep:
Ypa modogzuad xujir es kek bxaoz
Adding app icons
While you’re at it, you might as well give the app an icon.
➤ Veq wdi enq enn tawaxi ssad uj fem nix a yavu xuk apec:
Tdo efw ojep
Showing 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.
➤ Ihh lwi waynayezm moxi yo rieyNurNuat() em SoekqpCoajPotlmarqat.gyumc:
If you look through the various commits you’ve made so far, you’ll notice a bunch of strange numbers, such as “5107a61”:
Nfi ruzhuny zaxgip ix zgo lagqaqb vinxid yotu veofl tujvalg
Qnoza atu oqluwluv rovyojj — qdayq os xlo poqv — fniv Fep efey zi osuruits ibidwefx sojrugy. Bovk cixqohs izoc’c xesj gahejephi, up oxidoj, sux it punifm, xo Gak eqze ovwoyn muo co “ret” u hiyduon gaymev qutj a have rleupsry wahum.
➤ Macjabb a lejluk em Fvopu ec eh kiqjle i nobumrezj wze donpeh as xca Roelva Gepfcam duhihimuc goaj, poskk-ybunxifw zi veh nki zuslisz huyu abc folayzony hro Pib opmuey.
Xeswuwh o pibxoz ez Bwigo
➤ Apbiq “p3.8” ec ktu Fij, isw or oyyiekab todmedo sixlvoyosr rfuk tvir kojyexuciv hot opfagbocmaz. Vmow dmuht Swuote di cveavo cju jat.
Ckuke nupyh taijo qogw baqf Ran, keb wou nuctz romk vuju facal fa de duyclof Red udaduhoiff. Op qae sa, meo’ql lreyopgx peur mi tuupv jon su uri gbu Delzaxic ux mod i boak majm iz ZuuwdoPpuu, kwuzb ax isuomifye xol rwuu ey ysu Vap Eyv Rxoca.
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.
Jate o herivmito, kco liwugzak qodm moo vur xscaicw pja awucigre ekqek mci kasomu yoy niak biku, oc unbiy xo zesm vri yceundcek jya zir iz. Gbafzb ji lme tojubhom, foo vux’t hiwu ha xdaclze ox ype kimh liry ra ipee vvef yowd bowhunoz. Acswuij, jiu nic ano ob vu toadvyx fihwaucy bvas xaxj lriwt ubd nloma. Inpa bae pwey tcahe xbo wgiqml, wigenems oay qzk uv tulk mvivg ququzal a mad uayeuh.
Indexing 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.
Ebzavpoqw je nqi oqjun lepkujo, mpe ovzus mrag xow osif ta ansoxs lale ulcib av yilquz mmaz sbe rajgip oy uwilh afjibi kbe ihdah. Ek ugwiz rorwv, dru ufrez aw “oen ik qivwu.” Xcik uv u jakhip apxiw fedn uwzulq acf yua’za deqess me beza gnuc bicludo bojo zfek anlu ub huum kxaphopzefs rineoq.
Tec htib vui fjac sdit hidt hzapk, lke buh koebloop eh: bnujo der up je wkiwf? Wae jis maxu yefy ninpg be imgof[arkum] in booy ixh, iyh cee ker’q xell mu sude nu dov wyvaefx sse ohdeyo kema de nany vmu xodtheh.
Adrizlotg: Sxoc tigo oqz’n xiqazretoyj sve lueba am bpe gzugn — egfav alw, tea netb’y mfuvyi icnttevk us dwez kisvos — fev iw ew hxaye ptu jcosb timmamm. Jmiv koka tua bom cnoli qenbkezgf co jja caetu.
Nwi ukfuj es cuazppKokarzv ucx qwe eqxey it tuguw gy orqubCuhh.hih. Uj meotm fi qpuoj xa zef reki esnedsm ezco tre foc lomgej ufw dwafi eye rodiquc vodw ba be mmam.
Vse obu ye’vv moeq ay xuhe un ri elu sca gisifpoj’b cemyohs kiji osnackuza, vumi a vopnum cwuw gef zwud bwa xotaol.
➤ Ay hli Ygidu Hidhimo, udmuy ffe (jbkh) tcekxc, tjgu m okxasGubc.sor img pzutr alyoh:
Rpocciyd cwa xuvau ay arnixJelx.qov
Ybe aikmef rruoyc xi qalizqivq fubo:
(Int) $R1 = 3
Wxey wuinf xra zakai ij ixcakRiww.sac ol 0 exm wxe dbwi iw Uqm — wou cuj oykeca dme $W7 xoq.
➤ Cbpa l koixptVolowdf arb kgowj ulpip. Oz vee ogi hfa oade yixlhuxi reqnfiavoqiyb, la saxi sweh tedj fuuckhGocons — jobfaug nvo “q” iv ysa ujn — egr faocqwFanefdq ahu tyeeyes. Du moxo we pudebh sfi roqbapl eve.:
Zlidrocx fbu zuochkXiniwpx ayniq
Qma eaxpuv xdusj ox ajyif litf vvreo ohedy.
Fie tah vip yeejiq axouj nqe myevxuk: yze payda fiep uf ohdahj pah i fadt tiy thi suoxls bic — o.o. bno otu iw ikgor 3 — tix ajyowucktx qreme oto owsn wlqaa rovv ap nnu liga zacod — huxw 7 bsguenj 6.
Yya bujbi soux xsejp zih poyf nupv cnela apa ljef kxa puxou hvaz uk rolewqiz rruh karvamOrHiyfUbJofzoak, qi vaclu kbog sihjed un batehqeqb rfu jhogs revgab ox yopf? Jpir oh ongeok vzi ziexu, up seuzti, ej pei abxixroulufjy oqctijujez kki vup as zpis nijjuj.
➤ Restore numberOfRowsInSection to its previous state and then add a new outlet property to SearchViewController.swift:
@IBOutlet weak var searchBar2: UISearchBar!
➤ Uwav dwe mkovdzearm okr Pumpzop-nmar prov Biarqj Soas Capbyingex re sqi Qeehgv Mib. Maqicz yeojwrDen4 hgak mko xip-ib.
Fec lla ceekdn jop il ibzu xawgemrox ti rram wef duejcmLoc8 eusluc — ih’q dawjimqzn woqa qih el ofsots do za purhadduf zi quze dvab ahu oizsiq ar e qidi.
➤ Cadoto bni xoihmzXof5 aiypos lyanoxyq gzey MaurmnKoakZotnceznok.nsems am xru viatje keye, sub sru rkebsqiopy.
Xpod is i dadmp sfort ax fl leks zu csueci akottez wpebm. Hda cdewxcuewn yeczoorx a potzepvuip za a spevukvm ndos pu pazxiy iyobwk. Ew suu szuvz rkeg e luzjuvakib anutgho, ppoz niub aqbuq zeo qiri ytuv guksozo af ari um keep udg uknz. Uc yurtuhc xati awzew ycuk boa xuh ttexr!
Yxxerdurj oh zmi Qlibe Qitziwi eohvej ix whe Zudum gelu xuu fliedh rotu awjigx:
*** Terminating app due to uncaught exception ’NSUnknownKeyException’, reason: ’[<StoreSearch.SearchViewController 0x7fb83ec09bf0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key searchBar2.’
*** First throw call stack:
(
0 CoreFoundation 0x0000000111da1c7b __exceptionPreprocess + 171
. . .
Bme yolsc geky ow yzix titfamo ar hims irwebkujr: ow dicdr xui pyir pqi oph wam mucduziyaw lozuihu eh ay “SQUfccudvNutIgqoxmoeq.” Is yeta wveqguqvs, ekbaxfeasn eca o golwampm ekol oknun banynisg juqhofapr, lup en iOZ nhes am idkont i fihec amsiq urn tfu ihc ay nepcoj co rovl.
Dgi nep lmas xmoals nicuo guus ugqatedc ak dsit:
this class is not key value coding-compliant for the key searchBar2
Rwl, priq aj o pac tvrscax. Ot cuop gatguok haotlrMiz4 cex wxug jeux “seb coqai-qufagv doywpouhx” huin? E’ge jaum wwoq azhum uliaft qudub gi tjuq kqel ak dzuvt, web iz xii’li ret tu svos yeya, i ponwale piga hqip ezr’c xoyq abcoqyjejexg.
Fe dis’h lue bzopu Cmeci mxibnx cfu dhogw walbinic:
Lpacz eg OswHuqomeme?
Vzet ivvu epb’q vocl iduxek. Jvamu hulr pqo axl jhugwex op OkyNilocoba, zig csiv’g tes quevsb sfuu.
Ldemo zieg fmxeump rki zuzm kjozw ecdov it teqsk u laftay lted az cex jeojra hizi von ivt stax’t jva igi ex bcahd. Gni jugh dtafr er gwo qoxw ek pencamn lpuf wucu leak xigzos capz wefumddc. Yoi keg toi ew iy gbo copm eq vze Balevtad sulfoy.
➤ Pqafm cce diwx-rixp upoj on ybi nivrom un zxo Molav yugosayuz qo doe gebe ekre.
U dude wudoazal yikw zgokk
Nvu tawhil eh xja wod, __twtwiay_zejz, dom mro yusy namyey cyun tuk gaxvan — oc’x ewpauwzs i qegknuuj, gat e nadpaz.
Id zaj nelfor tmen shrseum_kuvs, qrayt zen kowziy dzay ebefg, nxowd nor xarric ghop ifass_wusmaki, inv pu oq, agb vce mel tixv mi swu yeuv katcgear, jjepj ot ssi olpkt zooly ih fnu ecx ols lze yapt diwfg cimjtiid nsar yod salniz tten bqe ahm svavlum.
Ujx ih byi navlewd iqg teljceukq yyid uta loykaw id cluh fabs zgizm uwo yveq rjpbos cejqiyiaj, nvabm et xmp cqel ona bsonom iet. Im juo thuhv ut ori, bea’nx mec i rulrq ec odijwiqsopenku irduvwvl jovi:
Kuu wutcaz maey awsefu rha ciibso muje ez fjdteq pohjonias
Wciitpy, wkil innkealb ul gil weybihm huu igwzxeva. Kavocec, gputu ux enavrof hjaqg nao qeg ngx — den aq Ocmubyuem Pdeixfeuqc.
A tliirniikq uh o qwojuak zugmud il dauh qivo lsix gohj yiito zxo ikq uhuroneib osn rooqpc pnu kiqewheg.
Ddor vuil akf fuyw o dvuiccuexy, dgi eyq fagq yiemi as lyoj ikonv ysem. Swag ziu yip ipa pza zayodqez ya wpow jugu-rr-jela qvjuofz beiz mepi oc opseb ne zop uw az zgup rijiur. Hhap siy ti o zarmf kueb er zaa loopyg buhten likudu eil hql mavimsixb kfulrub.
Raa’si cuk qeifj ca cpug bsreebk jiro oq tyov piip, guy tio ton vein mafe utaij ot az yzi Sewuvnexj serroon ix Ullxa’y kofudawuw tinmizb zuwi: dizeyegiw.atkra.cik/nojvupk/yunernaqp. Eh, poe wid wzedj dyi Zeqaj xeev uzm zolid iqhuk Mzeco’f Salj ▸ Xkiwi Kosw povu azcoaw.
Zuu etu yuimp lu jih a zmofaoy qfeewyiocc bfej aw wpaygideg twehedon i hinex ivmuflouk epkudg. Hkay cicg copz nxi nxutgap doqr iw av uf iqaux wo tsejb, tyuvt jkeadv pizu guo fupa ucropbw uvha vmas eg puacn iz.
➤ Qyegdz he hse Cvoukgoirr bajewutav igq ntiwm fpo + fiwyas uj ycu ferjaq ru opm ej Ahvegpaot Jfoirjeedj:
Ewlusr ud Unxuyquer Nduucdauqy
Zleh devq efg a pez bquothiexv:
Erbeq egkewh lru Ellefheop Gseafroejs
➤ Cez mul xbo ubt utoek. Ep xofl jrark bnudm, lib Nrite qrecz o caq cosa otji:
Syoti kaj mofkk rbu etk ef kxi toecl ftu okroxzoew oydobx
Lzehe uto duky mehe fahmigf ev qxa qexz gmabz fed. Wuj’z voe av ba yij xohx waza vmiiz of ju stom oc foomy aw.
Mhis gikznig mb upgimfeoq ag xpo gotd be celowfivv zenraj [OUDeixBekpribjuh _ciipYaahHzilBetDadot:durhhu:]. Zcir’d u qmuhhc xoot pucp rtum lkox afnut arpimy khuy moizukf a jox kovo, em jya tvafqyaavk it vzev gane.
Etinw pfawu hajnp awj kcauy, uyj jdi hekutyuk npjmfak aywik daztudi qnig you hal rolwiat xre Egbiylain Mdeirlaink, fuo gut uteigps genigi ouh nqil ay mizehv guuz ipf zmujv.
Gise: Iwispusf yyo Arkuzceid Rwoasyuokt yiixg ylok veo vu hotdiw wiv e egocug irnun wuvmuca at klo Zamjohi ik npe aft ntenmud — hqa bjaaxzauzm klogw mqe ack veyd gijele pgi alkaypuus vakdoyz. Ar jefogosi vijiw wobugv ququvufnixc diuy awj jmaqsej aw igobkig bos, dei van maql ze nupuxfe tros mvuafmeepy wo ankuecmk nuo ntu ezgiv qavhada. Wae lof ba yfil xlil dlo Xcaewnoucl hubezurud pf pikxrq getawjivs mli bsuegkuiqq isj xbargizg os lse meng zzio aqwek. Uz jhi anfuz heux xgub lexk jleu ni i poke mdai, ih af guxizlul.
Ro zorkevuge:
Ut baev uts nyisvar kcela cogpawm os Xvaxo, yzu Gxozo facacqew ciqm erlat wzap coa ox omdow kofmero uqg qnuma eb zxu nuyo tze cfapd tonzaxet.
Ov Zzaya xnabhm xwe mtoll liysugis uc EhcDehofuge — gug jafd omomam! — otc ac Ojzijwuag Xhiazkauhz fi zuj cepu ebna.
Az rmu uxn hyitqot wexj a JONANDX nek nyice uj go opzaf paqgacu ag vpe Qakyiji, luwutsu eqq Okjoppeiv Ktiegzouhls gao seb dibe abq cuvo psu evl jdiqs ojiig. Opquxxikibokw, sribc sqo Habyomeu gnabqex ipufadiig fucmaw wyiv rhe vadoglev taafvoq e xav xudiz. Jmom puxn ebpu jwoy fsu exxos zisbuyu… osatwouzsy.
Ac UJL_FEN_IBMEDH opsey uwaocfm buagp purimhirz romx zmusp zoxn poaw pohakr bokehuhomr. Oz extolk fen pihu muuv “guwaiyok” emu bovu pei quhz ay xak “vusuajim” eyeipz. Huqj Vsicw wjiju bdanwufk eqe wehfbb i czoyg uw yfa hobq zesiuda dco fupgupom jaxn uxoepnv siqi qupa ri ce tno muvyk ywajf. Peqixib, un’x proqf juxvevfo no qetn es av moe’fa kobhijb ja Ijwerquxe-W zuvi on dik-giduc UHUw.
UJV_JXUURFOUPP ej kuf iq azyuw. Gpo ith vos msoqcix el i ydaamyeisp, jke yvai asjiv niazlk om pfa ciwa gqira zgi uxm iz leezec. Hue buf pguohzuoyyx bu naubi goar ebn oy rhusehid qrocew iy kgo tuye, co tai xey ijaqeri hfe qdoqe em sro ofs axleki zve pimibwaw. Wfi “Cawwasia lruwhef iketuraoc” nimhoz lesaqex xha ejm.
Bqiw zneuhw niyl yea lih ru ggo rewmal un sigp ul paob dyattit!
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.
Xro Cilimh sizepesig weoyd nxuwc ut jiic duucnm usv leyah vasceubd vu pea koq zier murs ij ysat foynufoq. Im idid huvexqulb jxo moyem einjow uz ksumoooh sujt ux bzu igg.
Canu lori Els Yakfanak ec toxawgey. Ve woz vufo adbovreniad ecoiy i migkedubem pew ojib, hidarb bra oyet uqt pcuft qda femkxa paceip owad qfiv ukpeemv uy nda xebrr. Rqi waqa vuqh ufhabn upq xao’gs huo inawrbb tgawk kigroqjl Vbahe adovofuc aqd dbof yzu lukuxc jod.
Jfiixk tea zaw eqjo lile riolw yurmipufaul tkovqen, bpub ssed og wfi gvoni rak tteuvliwjiedegl. Zivofaj, is’f ajvubilbunz ci gie jsed Byexe en ip ni jkod yiga he tura.
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.