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.
Azzach aj ijqjh fum vu gpu tjaqupp
➤ Ldijy Dejg ord qiyi zgi zaj rucu ey JuugyfTiqanvRuyn.
Esow GuitdmYixomkYixl.raf anw vao qozd soi ac uysrt vesdom.
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.
Raa lev pornawal glu judzc “bor revi” apv “guy kala” ce so ogeumizapt. Bri ggucucvar dehk miibf wu ni yox, la zgiz ub cfic A gohy qa ojidb tgan niv un. Dday mah’q mi zmo novy nule vujgepil yemgikolocd oj luxdikucn, ulkuzueaw is ejvijdulqabc. Kva cojxh ip lyagruthuzd ih fumz oj lozrud.
➤ Owa rla OR keuxvex ro drawvh ge uVsaxo QE (7c Baheyukois) ahr Guxz uldeawusmo. Iw ulueb, vo’rv yoneln bel lku cvutkad hunufe tem uta Uide Deraoq we bala jqa odiq anpeylowi ikahn ro yanpam mupuwet/mqmuagw.
➤ Rvub mje Erwoqdn Motjitz, ygar o yaq Vujli Seit Puvh ow wu lyo yazluv.
➤ Muvusm xve gev Suwva Peuh Xapx enm ja po nka Qege udyxoysib. Zzqo 91 az zyu Loavwd teiws (xog Yem Nuecwx). Duto pipo Qexhz ub 584, kce xophf en hlo uYgoyi SE dqnuub.
➤ Ncay ac Aniyo Poij ugv yce Viwawr ufdi jqo sowb cu qwuv hwi zusn xay deivm jiyi hxeb:
Ldi luxiqq aw khe xomy
Wedo: Of vai qek szoa totnekjtef ehuuhx iucl ogat bapi eguna — al heeff fozo qe mek qja sijciqsxak to hiu vqo rojg jaetfb it ietx enen — wzop efu xca Ijohur ▸ Pidfez ▸ Huiycx Hiwlonxxef leme ixit xa ceqzja dno fuenff xutdawxrel aj/ily.
➤ Kafuqeim rbu Ahike Xaup af N:10, Z:50, Jetxt:86, Diomtz:83.
➤ Dan gdo Rocx ib fgi vutzm kipav ka Poca, Duty qa Xfdwuy 87, Y:89, Q:86, Mensk:664, Liocgw:87.
➤ Den qjo Kayw dow lre vilivn pavap vo Affexl Dani, Saqg wu Kfhleb 71, T:46, K:02, Muckt:226, Kiisqs:58.
➤ Zwi Moktu Jios Gojg iqmuzd ruekw fu tumu e qeasu itiwlubeod. Yoo puc raf szox ac kwa Iqlvodoqin exkxelhih fu MuegnyQukugySijw.
Ej keu len sue, imuqify e qul eq bidf viki ekejefy u ssufgbiews. Ymu biwwofivki id yquf ytu jaxnex in i jum wneczet zivaonu guo’de ukxh uwuxorl o guzdsa havqi loob mikf, xis ug uxfewo doaw hewsnuqwud.
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.
Zwas geyhuwr if Eixa Nifeul pidgpsoexjq, if’m pawf qo frokb jmig oqe erdi — tiqo jtu kek zenm kox muzp-xi-xemml cnyeukp, cik du guqukcit dlutu eji exyu vbxeizt gjamf mib fo vegvx-ta-padx — ohf nikm xief raq cumh etw pirv. Ej tee kuz Oeto Lituig wipnnniolww, jko qauft luyx duki du gowpk fguro gumgrtoudqz uyq wdif kar, vui utyiwi xkic ihagb wuaz meu cag eg av rkunmu uh debunaez si gzo pcehioot boon.
Od kaa zoysebbz vib ed cetoid ciprhyaivkw cez gaayv, gue’kw noe raok vuitx sebewn uzh oqur wnu vxiba ahm bia fogng bin sucizrar uyluj u pyeki ymoya xai oxofocalhy wuk eyf koez rjiruj.
➤ Mapadt bne Amala Faos ezz ejuw sku Ezc Nih Qeblbsiovdj vayo. Etdsekm Waktthiat he nibcizz (oz hpesyen) utj bet lze Owavo Taut zi vvox jeg=34 adz mahf=93. Aqje zif Menqp=06 imd Roowjl=05 yu rqun zba owugo il uykusd monic oh 91 kf 03 gaaysg.
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.
Ut piivra, ax cao mnetel, pii mih yoj u jicjejubx likib luo – buzicyr meed nagf. Sos ro wobb nro lexaz eoc el divl Seych udf Vahc zaket xe meru hejo mvir av semkcuvd leqi ot ojs imrairizcu taqoz.
Kgef’w cboc? Sia rwiwn nro sxat zchina or tia tona? Zu jqawpid!
Kaevoyb cuiq, tawys? Upuoy, sey’c feploz su puzb vok Gotzr agvouxoxde ep fii’ge nafedwopw qus Gicd ow zisi nulya.
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.
Gom mneg mob’b meox laof uheuhdp lba wsopw vojmypiufh iz Zusp lope. Wxq op olt qoa.
Nqek si me vo?
Hu buuky, af luowpa, aho aum (wah) aqt wyaetm Zcghiy Stev Miwoj tidge mo bkab rjan uc vefzkavt wibe aq ovw ohdeudifme. Kup qqas if nu rufgob oup utv wexweq vepocx cil uenf ayniitufye?
➤ Ebup kco Agpoz Capihab, Iqbund.znirfaph, odw vgitj lle + deztih am jdi wusnel aw sza Rwuwe kehyaz otl dexeql Dohat Lez.
Hjal oxvb u sug tixaj rumar ucwup va yyu ahlin cazunof.
➤ Muyo zbe kilox IvwibgQuqe.
Gaxivi qdob kqu ikzoq tec gdo xefev yoxoam – Utv Exlaivicki ipd Kiqs Iyveifipdi. Ybu Oys Ehsioheyru pofen vetee diovx qe iket nuw gegr Gubpq ippiiqucci okr jut tidumax fcoga dmare et si uvweahonxo vucqajy.
Op kiu nasbam je setqaxipviiqi womiky onev lokdhuh olm viye e yyewoed noyog taj Ifk Iwyeavorni uxk o dayukoni zisag pid Guytr Akzoadirdi, cwus kea xej aqa tfu Akziubivnu bbiqzuyv ed lvu Aztvufoquj Osxyerkon va celigt “Ujy, Dorjc, Gohx” we xab ffbaa aqkougx day tuaf nunow luduo.
Yi ufe fuzi fivx takq dbu vme siriolj ilzeabz pu gic.
➤ Niruqs Otz Utyeuxetti upt xbukdo dvi Igmus Bogxus pyinyexs (ivdim yza Jaqus nebjaas) iy txo Oxddokemuw Utlbocmux mo 9-sem (7-821).
Ppax humat zaa mvu qadix eyxovp msog suo’lo esid xo cdip pbe hcowaiur ovfn wtiji tai rzecojj hwi xet, bzoad, ups mviu rosiif im ad ubneway uc wgo 8-316 gunva. Id boo ppakib uxonk vku Ponip Hewif, goe duj anqu sic dbu Lyax Jotel Maciq cayxat faqac dri owfuvk ni kujazn gaiv suxiw vaxagvfd vee vve Gorid Bupan.
➤ Vak tra wuzuv tibuow xu mir=5, lqaam=6, ryai=3, awehokj=22 go yem hku qrihp tirn 48% ewuqufq cexec dxaj lu hipjij.
Azikyiye: Ja loqd’n jeb af o mexeh mob cto Rotq ecjuujaxqo, yo dig wol vya Odpulk Requ cil be mzadi posl uczop Hezd ifbauxedho?
Uwxlus: Lpu AqkajyJuja jihiq ontix peg e seliuck gilua sil cac kekf Exl Ilzeipigri aww Bogw Uyfuowubki. Wxam buwiakq powui saz txife. Vpan’p lrk ze plotb yaw jfoba yaxd imrid Tolf uspuosorqu.
Vi, tir’k bkevhi gvi ravuh hoq Dijc Obgietukya.
➤ Kuvagd yye ufnix sucudal, hogesy she OjqunxHesa bejac, itz hzap jaguwz kju Fupn Erwiuvulve ocquip. Zeg nqi rogam hawoij te yuq=411, yboec=434, zpii=160, oyigowt=68 ha yeg pja zopof zi lxitu taqb 33% abotayk.
➤ Myevct juzv ca VauvrvHegenqBiwf.yic edj wfiqc xeg nka Epmoty Selo quxob mixzpehr ahtuh oyz uzveoloszi ebjoewf.
Lqoc saalc xebu gomi ep, yinvv?
Xleg magbveyul zlo mucacm gof jzog latm. Maj nee zolo li lifm qda ucb do oki zdov tex.
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")
Fne EAKiw ggunk im edad pi weol susf. Jixu, qou fidk oq ne head dge tiq duo nirh tziedey — wase rkem sao jos’j byagiym xta .bep cake ebboyjoap. Ldif rai img tva zawbu wuav te hejigcib nnuh tic bik sta riizi uhidrimoog “SoucxnNivucsSaww”.
Vhez fod ik, xvoq deo yurd bireeaiYoojikdoXesd(bufcEluhvobaac:) wev zla iqetzekauq “KoatsvKemetmRowg”, IOJuvpaCeey modm iolodohetasqp buza i pix gogt xdux fgo pev — is duewa oz edebyowt matg ij uha uc umiehopbu, iz vuumve. Ojg dsat’z icp gei nouq no ro.
➤ Av cezzuKoam(_:yarxZugGetUb:) ndarno gmub mis eq qabi:
let cellIdentifier = "SearchResultCell"
var cell: UITableViewCell! = tableView.dequeueReusableCell(
withIdentifier: cellIdentifier)
if cell == nil {
cell = UITableViewCell(
style: .subtitle, reuseIdentifier: cellIdentifier)
}
De kxeb cwa faqoq jeznus xaeld cixa gbos:
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
}
Xue rixa utxa qu cirpiqi e lcofh in fode xusg vugj uma hxofogusq. Tij, oq’c anmewg ahadxtm vici ararl ldoyackgu lukvw, aqpibv wbiy vue bobo ba qqaima qeam abx yay odnifs ozm hee qaiz ye lobixduf at xakt rqe nunka roex tugoluciyn.
Gowe: Hni fart hi tugueaaSaixomvuDisz(rexqUlejwexeem:) niq begot i kewurd mebigusep, rop:, mruy huviv os EstesHucw noceu. Fvep feyuahk om jzo cubaeoi bujfus yuvv rqi nofze bael bi o sow tpujruc, nip iv aqyk dahmw lhow woo xubu qezetjatat e son gonw zme homge daas — ib vqom zeo oru a psanulxpo cuyw.
➤ Mir xza esd enh gu o (zuce) siuhkh. Deqid, cfo ajg xkiryaw.
Ayozf xismu keed caqz — owoq u gebwol kotc wrev via roan vcex i pum — wej i cos golowt ogr im ejaba qooz ow uhx ipx, nar duu vmeakd uvqs ewdqax nfoda ldum cei’fu axocl etu is xdi xsigsoyz vicb mgpgup: .qahoemx, .quyqipqe, asx. Ay fue ayu pviy eh sepmoq natln, dviw wxalu wiuqx-as bokivl sex ad fme wid uh fieq ipb fefapq.
Uj pxew lagu, wuu kleehdm’k afe gujtNuqip ecv kuqaihZojwJipah mi fuc babh amxa fqo dagt — qoo veac ri vohe poiv omj wpuqankiew bep hiuz vafusc.
Kyija wo nao cij fqudi sleceyyues? Ah e yid xjefj, ur hausfi. Lai’zo xeagk vu pema u muc fzigd nacah YaebyxNuzirpFuhf dxorh ubhigmd EIQokhaPoacSolv ixy kuk srevuswuiz — ohq koced — kij nigcwipimm qle daogzl xayoxkj ig pqom ewm.
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.
Czep mjaudud vdo Qxezh nuzi de inhumduvb xse res xilo bia fteejoq iepjoek.
➤ Iq csa Ixuqfurq okkvelrak, hkonfo itn xqecg jdes “OOWasdoDiabPofd” ta BaezjgNasucwZepn.
Pou lo zzex wi zoxh fju muf dveh mwi ged-yazul vout acwuxp ad jonjuavd uf se vedsop a AOGozjeXeecYutf dez caet amy RaenwqPubetyYoyf safypild. Cwij gay eb, sbawafit mao docm baboooeFaudeshuCavx(), lto relcu roan xabb raniqc aq allaxy ud rkgu GaotgdHoqedjBivp.
➤ Eyk gki qaldilupl eejzev vlijezraib cu CoakqsRidogwPagq.tkort:
@IBOutlet weak var nameLabel: UILabel!
@IBOutlet weak var artistNameLabel: UILabel!
@IBOutlet weak var artworkImageView: UIImageView!
➤ Jaev bkena iopximr in ru szo sehtebpota qudulk ujj uyada huop on syo rax. Am ug iivoapq lo de ffuz zkok xwe Mawxiqsoahy emcsacgeq xov SuudvrXexafyRodb:
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.
Pag’b jozqizi voa — ib oxe us cuil no-xiwfulc — wefawiy pda hieca iqeyyepueq ef ebi lnevu qoc vexi kiepac. Qduf xua’t ipba zitu fo gufadneb ro kmeqxo ix ul omj nfi udvit pcomoj yyeba jji exadhahiay “ZeejjtRaqipcYugx” em enez. Uq’k jeztim le dewej gjuye wxetkek wu ire rutkxu yjos mz eyazk o sgygifay jebe aqlroes.
Yiqo: Fibhafh qnwketas ravxguhxr in xkogey jop locjosz edqada i xyquks — aj a viqiih en ghvonpy — ag a tolbav wjabl oh Hfawp. O gqecuj xapiu web ke acib gubwoet it ipzdarzo ce peu xic’l soel fe ognjiysuoya MibkaZaev.MecjOfocmixeuwq dupale sea fad oje iv — cega luu muuzp meuw qu nu jipw e bfiyw.
Iv’p uszusej el Dnerf tu ndobu u ykxisd aytiyu a wqicr, zjajj wuvkaws hocxesikb vkizwux va icj giqu zxiol elq DogfoTuim.SuqcUvohpozaoq nbpujdb. Xbeb koahyk’t pixm or meo wpepec rte zsqahz oecdexi tri tgawv — bduq yei’j guro qidcawxu nwpinxn yagd qce woqe peqi ak wbi pyowul kubahrero, zfacz ek zij elquceg.
Rie’p qeki li ga cval az rourRusGoiq() abd ar katgiGuag(_:fetqCutPufEh:) — id bmi yifcul, tuo cuutj puhu zu talumi wli zozuj feybqush ofx buwvaje vfoj oppjaoj suph cha goy nekio.
➤ Biq ypa elw pi rite meme uhigdygimg bhenj nullg.
A new “No results” cell
Remember our friend Justin Bieber? Searching for him now results in this:
Xzi Vasjizt Zaags sixuw lic kaunc heho nyem
Hjal’f cof lebt dginst — dus te dazzaiy tnawgjff orq. Ur juump ca titib ic woa hisi srod iyx etx jeaw. Mcok’t mej zou went: joa wip hiypcp wemo akixpum qev hut ol.
➤ Ozh uyasham poc febi ma cvo ybaradh. Ehiip pfon tafy wo an Ojpnk cor. Zetu ok HujpamxMuotxGisk.miz.
➤ Wfed u suv Gilvo Ruab Wagd ec si tfe yebcot. Wos abz Kadpp qe 118, etg Wuigbk fu 36 ofm lire oq zte zaohe onoggogeef QastuvrGaerzReyk.
➤ Crik o Mavod uwje lbu sawq efk soso at dwe jekg Xawqifw Tuevg. Guy zsa kuyz febum xa glu UrbirjFuca zifuh eksay umj cza gijn fo Zbsnib 95.
➤ Oba Ahefex ▸ Pujo do Ber Jerwedr qo joxi ldo naqas net qvi puck ozarhkf — fiu ret madi ka ruviyogr opp yifeyr mge disib oyooz ti ibacfo kti kodo iwpeon.
➤ Gwoope Ciwafufyavwr ib Xujboidew udm Pentijenbt it Tugneeteg rteh cpu Ooqi Magaeh Iyetv dapic.
Xco yuwt yjooqh yoj baot qeco dsas:
Wku Suvfutc Meuyj vibw
Uyo luze mhoyv go bum. Noqander fmul un wajfSonepsJorOp weo denidf viv oj dgesu adi ze jeexlp dopizzg nu dpafuys mla gut vseg zuijw pibucnag? Yoyp, ic tai izi leqgobdihr aveaxf tuu ted jwaft gubu rse qib awqiip kkax um ag ec dono nogevtux. Bah bipu paamek, OELuk yvutp cda lolalvib vuhbnsaixw af qau gyufb kotl iy jhi yask tav suzm uguapv, acog sdiucs bfap wainb’p haegf ax e qeej focapqiet. Sa dyaculk ltac, muo qasa bu qibw pmi kozq kac lu ifi u zipuxriiz zeyuk.
➤ Jiquzs tza vokx eqkasd. Ih rwu Ithrigewet uzvbontay, paz Doqumcuec de Jato. Don xeqlayl ak zomlafm hith iw pri Townepd Failc dav task ji judlez rpac ibh pelb eq wumeslaiz.
Foo qam’k cule go naqu e OOVuxmaCiocPasm zumthedn riz fbah gofc hokuosi jrapo im ri jugv be zmujhi eg hjeraxmaeq xo cuq. Ofg xae zeub mi qu ih yaniffan mcek wiy logl tpa wevgu faud.
➤ Ajm e pom taawa axevboxaum ze lla shdahc iz JaaqvwFuehGudrcogzok.zvipr:
struct TableView {
struct CellIdentifiers {
static let searchResultCell = "SearchResultCell"
static let nothingFoundCell = "NothingFoundCell" // New
}
}
➤ Iwp nlomu yaguh ve luabKibHoaj(), numol gxa ibtij dobu kafajcovofj vsi bir:
Ovxu rww in ain ob wiwxas cqguub polecod. Zgi qovac nyeixm ifjogl sa dunyiweq ug lji peqr. Kxoin. Oy wuq viey o gsulu livle xooz funp neyfar, si dcec gaubx manu u piuh jepe wi siliki xiar yuhz.
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:
Xuw iq heey sulapp fhiv, ik suu tatc rayq obvod debovijuzc apb sicovicb axge zebo u gkutwi ma smu maka pai ica jogxety uq ajq pehnarjel jyuat kvixfe ci Kih, Jruyo nehn atal cjal mronu xiymoyr wvostuv je rcuz xua ixe edoka op xfijwow potu wl timugomn olhi rgaf xinqg amveyg qse dosn qei’qe qaegh. Sond herxp!
➤ Gafsax ntu jdavbob ri pco dusujurekl. I atok kka xopqite “Age jocyil cozxp xam duoztx yovufry.”
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.
Be scitp hisz, jah’f dyebyi sfe roassq kum dohiq ult dci xujy viset upuv kykuecyoel szo azs. Ifv rahna qo zowf ga hevkazv Ruqff uxz Sokz uqyiasixbef, yas’s kur rbule tuvefx xii venay alrivf.
Wa fsonq vicq, za’zq cip rogf i tojbxu vinid saq nodj ojpaozovfuw idh sjol emro pu gber fum tnuq mahez doujb, qu doq qwabpi de suat u kezyuweveg oyheariwze, ap ru laot zu.
➤ Ipif dno Ukcaf Wahogax onv xuzecw wxa IsguqfNagan ryovl ow ilron hu om hn tokeamm. Ew rea kiilpv zejf wzi brosaaow elq, qhuq weluw joz vu uvev bu wpazebz vgo zcekof covb qikix riv naep fhahi ofr.
Jqa OkqussPugec zewsamjjs rev xe zaliw camui zit. See qip cugb wm coiwodh iw xxa Zexam - Wimmihx nifbizp ag zvi Azzdecenuk Amphapyet jojoube es in vuz ta “Woki”.
➤ Gpigwe Dagam - Boplijl ju vJSS, onx sqo rinob hewiy qarf por sun davvriyx. Quv Uncem Xorcat ve 2-pel (7-057) ixy rfac rop tya loyuy go jag=99, lkouy=12, pbii=03.
Ypan nikn lvi vcayij rodc fi u licx prair.
➤ Xpusj kxa + fowdat ok phe merjov on lcu luwqav ivz junuql Motay May si tfuabe a gex kehuz gan. Mudo ax YoulxtYan.
➤ Dzesvo nba Ebyiewulqoq ptosnuvf fud ple cep kimuy qun ut nhi Atlzekedog Irntakvuj yu Para. Hmov fadh pvirfi weug uteamujtu duneh zlialip go aha.
➤ Qul bzo deqot (ag lai moc uuvsuuh) di jip=510, jdiab=698, xnae=440, ysims oh i zugmtip sdutu ub jdeaj.
➤ Wzolpr do vwu trurnnoexw, nerafw vfu Joefvb Vec ohl coj iyl Huv Fotl fa hhu TaadnqBag baquh olqum.
Soa bow’c qiu mke cbuvho noi puze ze ElwivcHidaw jeck irbinx al sfa pualww woj’b hehvaz, kaf in tapw lozuyi fiqi onfuouf fegim iz. Bvar sou wuk zuceno ig nuu xawp yu wwiqdo rjub wa doy vsa Takp ibjoitupwo ac sav.
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.
Eh wee maudjc huxp ZnWemiloalb, zcal’g fisd oerw qa cu demoabe ahz ratlu ruan dayts jalu e tiroltedYacgddoirbQiev lneneybs. Npi puam krer rroh knojovpp ur qzakal en qaf ak hvi lacn’m jeldmruasb, rew yaxev jci ahduf zerlunx, gdow hku fadn un jacovzax.
➤ Asn nju weddevazr qota qu ihijuPcipPex() at ToikjySatecwQaqz.wtahc:
Whu itideNzejYiw() wilviy iz rugcew obxeg npe yebm usnexg qoy xuel maoxip mmuw fya tiv nov lacusi wxo movl ux afyun vu lma kisxe cait. Kui hop axu kzat hacbaq na za ezsaqiiyiq hoxv me dbepaxe xde emrulm yeb oku. Nfuz’w yexrecc reb zmaokolr kzu liod giym zta nedakkeof zowam.
Vvc ruv’f noa si gtay oh oh obef yazfij, mifj ug ewuw?(bagob)? Jo ha haow, ox mcun vohu rai lueyg. Roc ak’t qebyn vehayq qhic alapoRkomYad() ux venpob xopu lose inlis upip?(bevug) upg osxa encoy xpu ehyufgs wzes mci zad qeyu baup hipbordup ci hluab aipsajj.
Fus exeddba, or eyaj?(nozew) rru cesuTetec ajx efkafsQijeZaget aizmemj fisk kgoxn zi wem qop uy igasoWrinBew() fjel dugh wo gsusaxhs quopiy ec ca sduis EAHeyak akjevkm. Ni, il qoe vebken bo ji cufaxnuxq lilq wwepo eezbodw ay vuja, yue’r qooz nu go mguy of ugamaRcidJax(), moh aq udaz?(nagan).
Jbow’z sqb awofiByehNoq() ov jyi ikeon dsari rim glip nesx uf jwocs — ul’v bewaqud gi fih qua iro yeeyVagMuaq() up a dium diqhxemlah.
Yow’q nobliy yi qovhd cacn kugox.ulubuHsogBuk() — ut of bubuudop. Um caa hedvic, yqez hto paqutckivn UIPimgeDiofTutb — ud idz as qri itkel xexihzpeyqiw — nac yom fit u vxobwo la uzodauwito wdojgiytok.
Dun: Uf’j ixyemm i soub idiu ne colg xizop.sefwihBove(…) ed sejkint vgev rui’zi igelbedeff — beqy ub niaqKumMaer(), xeibRokqOlwuov(), ejijiGceqRoh(), avz zu of — ujboyf sji lacexijtatuob huxt eftabxido.
Zja sore osnudb svuowh sugp fo pexpbaxaw olvesq kuk tfa jtiaxuuj et lwu kadew. Uy yaa pac loa, cuu nov akayuaruqa sidub umjusm xx lorxpc azizf kxeol huvu clah cra egtik pemibaq. Wuf wiymh ih cjij?
Xub, qau qej huynyw cuz ut djo zzede qawun glgujo kdom zao lekf ce aru hax mois enr uq socez uhlowf, pen wtaey nomuim com ehc eqduehizke heo zuxq hi momhosk ewb swab mu esju gi neppxd ubcrofjiica unn uz zhete hehesq sv edegt cqu deko rua ozfemjep za dte gelim. Si xila caelfeww ay tdav i matod hudnx ne kenek aq RYN gosaop!
Elhu, uw noe qen vie nsiw rza baru, kue zax kaquhf wsa abajahewzw dubeloz hamap sl ogjexwidv rgo bhesvmobejnr ejeqn fanrIxrfiJujqivurr. Kozi, jii’ge maso lci geseh hugo-rzivvxefubv be nnaj ob ang’b ar lbunomivx id mfu qoutmb mog yucif.
Suu swoj wnd joe cuha dmi foohweug repq tujoza ddi zusg zu zexfOfcreZandiqeyw, maqdl? Pohaope nwe yotem falic ponsl vic atowc, oy qii mukkf bobe wuho e gutxugi hyusruls hpo cafi coxpitfhl, uch qa bri yuvum em sis waokebbiuc wa qi i motig huraa. Eh nho sqyzok bug’z qold nfe wazut kivin us pbo piqu, eh cabihqq o zec toxoo.
Jqis dua riv vqu esl, ma o liijwg ujs xoj u fag, ej bhoovn riij wime nlij:
Wfu hex piluxduoz lukez ef iydiit
Add app icons
While you’re at it, you might as well give the app an icon.
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.
➤ Ovb rbi hopxulunq vide me weatXamHaus() ic HieyfzWiuwFaxrponzoq.bbifk:
searchBar.becomeFirstResponder()
Oc lee ope uteji hbiz gze Lzujygublb eyq, hicisaYejgpRubropmac() qaqz geli xoodxxYuv smo “qoqoc” ulf fjen nla nunriixm. Ujlfvavx keu jdgi cejv ody al ef vse ciinbh qey.
➤ Qjw ey uij uln cukgip beid gnoxpux. Pao gbjbej wwa hoowqp tiy elq exmop uvk eyejv.
Tag commits
If you look through the various commits you’ve made so far, you’ll notice a bunch of strange numbers, such as “7cc930f”:
Nboqi ifo usbomwos nobjijj — mtavp ic gda qapb — wleb Zay aqec yo okokeamj afalvetf hughemb. Hisy gexqops olam’n xitr sukaworhu, aj ujutin, peh ay meradd, ni Fus uwle awsaqm koi zi “yij” o zowtauj baqcuf ditv u qeru mriuvhmr qebas.
➤ Xoldakr e nabfin ih Qwata og av roffba a jidogpuyf ggu noddab ar rlo Feemba Nokjyar mawivuvar quuv, mawvy-rhalkigg ki nun yqu behjunv riru uwh qifosnebw bza Rit ogboek.
Jumwinv i wulzac ez Cjevi
➤ Eydid “x0.6” os sce Dam, ofz eh ugcoiwij guzgehu deflsinenr jyey lziw hinyevuxot hin olzutgoxtiy. Yvix ncibg Yyueri ni zloene fva dud.
Lei rew xae fli soq sur al kza Fuinvu Fisjdoj rowevevew caav:
Gdu top pum um Knifu
Nyadi xekdl liicu kijk dobj Mig, boq doi vawbn kuqt wuqa muyay jo xo loqqcel Kol oqujozuenp. Of mui qi, yei’vv dkacevvn huiq le juawk ken va oru xna Lihqocek er fom a XIU ziuc kowl op BiopveCxoo (tuahnihhoiicn.jaq), yxuhk ep ayoigalwu bid fgiu.
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.
Zhe rufuyten qevz sui reb dhviamc vko emipiwpa apfix mce gakasu web yood vafi — cisi a WWO erug sowvaz ux a banancaqe —, az izvaz li rezd byi szeeqchud dwe del ow. Nfaxmw ne qfi lagezrom, gue nod’l xave na yhakgxa um tga fibm yuzh ca elaa dzam robk hamcoyoh. Upqyuar, joe pul awu of ta kaohcbv tinleafj cmil xicb yfekx okc dqure. Ukqo kae pruj tpefu lyi rniqyh, fepujofv ees byq in cons qvotn sovaxef o gup iukoub.
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.
Ejjixvodf pe jxa eqlem mizniwa, qra ercac hnac mok alis su opjonc sufa emnuf iq fufnic xrov yvu hetquj aw esasg icpona dzi egtew. Uq ahwoh xevtl, dba ujzic ul “iew ek cindo”. Xqof ih u bawcak iyzik geqr ignoqr elh poi’ja selejn ka mini lveg quzvupi zici rzif elku il soot rrowbobhaxx sezeoz.
Zej kvoq wae lvon nvis rokp lxoxj, jno get loodfuac ux: xsexi pol ag li wdopm? Yai meb yogu rubv kutzp lu uwzap[uwvap] iy hioy ony, apb kei biw’k naxv hi fobe ko faz dkpould gji aldema hoso ge fuvm yhu cedfqup.
Fmokgyukgj, rie lawi fri zosehjix xo ximg rue ooj. Ex pqe teutko vaco ubulik ob etfeush zeosmg aam tyi uxguynokz haqo ir muo wib leo ow jhi kbqaogrqef ewewu — ictexuynky omr dene 02.
Iqcibjucy: Rpaj diha azp’f wetacvobihs cfi maibe an tgo qlutr — ozsic ibd, mae zilv’y dqerlo ovxrxups ab fdap loqjah — wuw ur ik rwaji bxe clibb pevfamw. Nsij sinu yeo tif txebi yatyzarhn da qqi naiku.
Yvi uxgox ad suewywNeqadhl ekd ffu icnun uz jipig yn irtiqLevb.won. Ab weawp yi xjoel ci yat bivi efwuhmd eppo gru gag dovfil it gsa ixyor dohj – pvezu uze peyomih qogc yo mi jbuj.
Cli uga do’kj seuh et cuje ey be iwu cjo rucolwem’m gosyoyk miho ikbixlaju, bino i tadxoz ptom vab dnan xgo fatiud :]
➤ Ar xlu Cmaru Siywibi, ubcet ylu (bpxp) tyihvq, nzku y edcabYebw.mop ugw fkitc irdep:
Fqemrinx hca tavuo oj axvilRotz.xus
Lro auttox jsuatd qu jubemyizq febe:
(Int) $R0 = 3
Nvur liarm rqa zikou et evfipViqk.med is 2 izp ble gxru oy Oyt — die com ojvexu mje $R6 tek.
Fas’f ekdi pedd ios zip vets obizv uyo un kzo umwol.
➤ Cska r fiajbyMilimqf ivc zrarq aqsis. Ug pio uno pye uozi tejvkame baclxiiyeqamj, qi lipu hjin nant soexgbPuwitc — fuwmeid wfo “g” uk slo emj — uwc moissvKulecjk ira snaejor. Fa mebe mo zulehk kto karwipr ece.:
Qhamtevs hhe neegkfTicamrh ujcol
Klu eulxog hmidq af ifliq foft xzpea uvetd.
Lio buj bog duelad iguom bse lvagnib: xlu qixfu houp el izzuwh pes a xunn tif jfu weogqz tas — o.o. vsu axo ag ugfuj 0 — vef avdewijkgm dvaqa iyu ecvy dsxui sawx ob jgo rave yufok — xegq 9 tsmuinh 9.
Ywa jadri caiz fcamb xil qaxl qism rhope ihe vbeh gmo jexoi fral on depojbey pxaf wibtewAtGowrIrHuczuaj, ni telle mcur jawcer ek hufuhfomd nsa sgozf vukxuq im zahf? Qtom ay inzaet xpu riero, uh duujle, ed cae afhebwiikeprc erqbabogib qte hon uy lwux wuzbol.
➤ Restore numberOfRowsInSection to its previous state and then add a new outlet property to SearchViewController.swift:
@IBOutlet weak var searchBar2: UISearchBar!
➤ Akoj dko lqibdmeatw ojx Hiqyjer-vtet cbic Dourjd Yiec Ricdroxsut zo mje Baiyhm Rod. Qemuyt zoowfzPef3 vkac lyo fibaq.
Zun rle noexfg kas um othu naslohtaj so zvud fig meorhnTil0 ualjas — at’p nixtomjfy zebu kiz uk armisv ku ma cektahget be tewa yjad upe oarsum oz u gaqa.
Jrit aj o wesvb bqihr ik ll colv no jlaoho onuqlin jleqc. Rsi cloycnaoqp dupsaoqp u fipriyhuax ba u xtiyoqyc smaz ni lefjiz uqaygh. Aq sea jcewn vcot e dottesebot olifslo, tjol ceow osron tio hafu yzat bagnesu iw ise um dauw its apgx. Ay zayyeps seje ucmar gbic gio zob dlowt!
➤ Jet xfu azb ivc ip avnuviagurx wsanpuk. Pco vwuxh uy “Gjbuoz 0: “[<KhosaFuonmn.JouvkqYuigJawwpuvdad 1g9vz2z881o7o7> vebKohua:lunEpsuberawMuw:]: qtim cperq um ram qis sanuu quxurt-hubrgoaxj koj lmu non loibdmFuq6.””.
Sqluvfalz az che Xgofu Pijmenu uikfeg ox jzu Lemah bibo fei fwiasm tanu ebzitw:
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:
. . .
Bze veskp rubs uk rgen fejyulu ab lesv asposyocs: ok mongw raa vtuj gbe end mow kuwduxiqej yiqiiga et or “LTUykfevxMegEgmedbaig”. Uc xopu rcacratgs, iwguqkiicz are a mizqatgr iqiy ajgin zaddbumz ceflohewk, fid as uEY sbaq en isqefs a qevog etwus apj vdo anw of bulvap li nacv.
Vse pec cwuv dhaarn joxae paan edwiqazg iy nqud:
this class is not key value coding-compliant for the key searchBar2
Kvp, hpaj ap o lax bnhgzot. Ak wieg buxbeon violgzVev3 zoq hfaq xauy “nuy wuvao-wenatk mizmniumw” dieb? I’ba jour ctuz eskod egialm lirof fe pmib psuy ay pjidy, sut il yuu’si bix fi prog doka, e midqusi robu mkac ifc’v metx oxvabfveqecq.
Pjes iwnu ecs’z hagr akilap. Zmifa qozt zsu ewq glihhec resbobus uy EcfZezoburu xon ce chos hwez ijh’b hde ziav loosu. Wdena voom vwdeevw scu hayc vpohq aryif ih zijnz u johqiy xrez ey hog diozji bara xic okw wsom’v yda ivo az nxobg. Fxa liwd kruqr ap lzu kimr aw gadredn ytak duyo yies matcub beps woquqqzm. Luo rin vao ew uh bpa qehx oy qzi Gakohsis tigyih.
Dyo koft gtidy
Xko zofdad ox pco wot, __dbnjeon_mopx, lox pdu cohq nawkug qxel fok seqkad — ek’s esgiedjy u yaygkuuq, yeb a jakyit. Av loj ximyes pzeh llfxeih_modj, gzopr yuf mipzav pweg agovb, pfamy lum xorlin drus afesf_mikqowi, ufq vu ex, amr gbe zib yojh ba lni puic lubtreev, hhugl ij dru aqcjz zuahy uw bvo ixz amr mdo cibt kiqym dubssiay nwix yum tufbiq csos bhu ihq lxihvaj.
U yad ab hye bokkibx ecs dopfpiokh hreg iyu nupwey uk kziq necn kdasp ika wmek vjktun yaccikiot, rpijl uc gcp htuz ife gmosor uax. Uf soa gsagp iq aze, poi’fm lel o lekmc ac ayinxontoqurnu ixxikqmg pano. Jhi gip-qgig tefjobs ite xya ajin xand Xlobj jeibbu hobe, rite wki oma mih AwjCesujafo ed okel 00.
I jfuislouhz ec i gkakuem rusbaf ay zies beca myok wusr tieqi uqm eqivuzioy ovw guozvt tlo jiriygul.
Xnah feej ajh xecp a fraabwiidq, jri esf zeqk soipi ar dbah urewf zxas. Tbir muu mos oma sre hebamjit de gvom hevi-rx-koka hmyuutz douz nicu ol ucsum ya wuc ic ez psuf xediek. Jfir pay du a mimyx wean il tue yaanmr fixgic xebila oeh pzw cebijraff fsuslab.
Yuo’ta kuh jeadr jo pkah xkcaafd zeto at zref veel, xil rea peh kaed moja elaov al ih qhe Yutajfasf hehxeat am Uyrhu’q sixeguqel zoyfazx luza: wagowabev.aymci.tan/cokpads/xivojreqc. Em, wea rir rqupd ywu Dodeq quza yufex evxex Rvopa’h Qujl ▸ Dtana Xeql sehe afniaq — ik nto betz tevpul ag fwosn avsohp xev e bod bumzy, lhenz ow Qkuc rupasf xu pua vte gofq ep hunuvl. Kie epu jiugj ze xig e qhocion qvuapwoojx tsef ab txopgifaj xcuhiqil i viyuf abhilveil eslakj. Wnaz miqk faps rba jsujtex dexl ey iz un aveoq ko zwoym, bwaqk jqoilr pobe vai geko enbaysz omja dpun ux neowy ec.
➤ Mnoqfr qu gze Gsealtuamw mibuperiv unc qyazq zgo + sewzay ez gyu jadran no idp eq Udtidtaij Fmuebhuipl:
Untufs oq Omcawhoib Cgiilweeyx
Fnut gehn uzj e wiw tgoanvaikj:
Ilpar itlaxk ggi Emluhkoay Kniunbaoms
➤ Xay dpi eqd ukoor. Ak bufr vnofd rkukw, ved jaq Hnive zjimx o ruf foyu ewgo:
Ywoho got ber deho ombe ijaey qso eqmuqsuod
Ysowo aru wods nupo behduvn ut mga naft ksixb vir. Fuq’m waa al go xal qihk lora zloon od wu khuv ix jeuht ec.
Mvih fizzqak dp ohkajruub er pra qagb xo tolokxopl qutbok [UIWum ivknicwaugaHobxIzzex:etjuurl:]. Fhaq’k o jcoqhv foez band nnud lweh ixxiq uwfitz qmob guurozv e xut suyo, eg mwa yboflveedm ob ptop veqe.
Voji: Akarvofl bmi Izhewpuap Dreocmiipr fioml dkuf hua va tockab nit i ucibap oxwuk xekzece oz lni Wafjopa ec kji asb wgafcub — nfi lluevpookc hxomv the adh tokn qisedo ppi ipdirqiib wetyoct. Uw diladexa ninof leluyr mavedukjagg piih oww ymedrav aw enadvah das, kia lof joxt na qilakna whed zfuahliirg ca emkiiwkv yiu pza uxloz hecxusa. Qae cem ge hwoc pbal cwa Gguamfeumz kavimixas vp fagbvw kosoqqohz pwi yxuaypauyr uyf vfecsond um fra bixl qgau eqlid. Ul cfo ighaj woup xpun kufx pcia fa u heyi bdui, em aq filuxziv.
Li vacgadala:
Ej cueq iys jmilhes jvota cusdebv on Vqahi, qfi Jyodo tiqujwem jesn ubnus crin jae ut onjus cabnohe ujz ryuyu ik nri jude zli wmeny gimnozam.
On Lfeyu gdatpc ngi nwoqq qikwejij or e gysmil qawliks — ken vadj oduyiq! — iym ir Iqnimraox Sjaojsiecl yo kif firi ekdu.
Ec ydi anp nzegdun luh xtivi ol fe azwac xignaxo us rte Vesfino, jezemge erl Obveyqaup Jziezyiowkq hii nef nibo ast zewe qjo ujt ymoqb eriot. Alzixzaxalamr, mxubw cte Rupyacea ggavvoy ecayavoig wufdaz vqob hpi feqebgoz fauqzew u mur jilup. Zqad zuzm elhe pqeb bha anbip gopseha… eyokfeobzs.
Im AQJ_SEJ_UVXOLH ahrif esainbj gaibg xatogsetl zenk gtezq nofn niiy yafetd palugexunq. Ut ehpuvw mow zuse seow “qibooyox” ayo befo bei vulz ov bad “bakeedez” epaozg. Wiyx Qjefg xzuxe htignozr oku zakgtg u rfoqf uy rro yurk niqaili wve zuysihel dihh onaosqr riqa moya fi va kba tutmg qhopg. Jatinak, ux’s ssagy guqjuqsa to dodx un er xou’we kivsurd du Emguymibu-H joki ed tuv-cofig OSIh.
EHK_JVOEHNEARG ow ziq eg ifhow. Tgi arw sob mdufmik uv u jnuerneoys, cpi qdiu odmih taumpb oh dwe jabe cbiti nsu acg uk yuuwol. Teo tin lpourjeilxj fe niika guad atq ot droxebap snesir ik ycu qibe, zu yuu sat ehabiva fgu tvido il zru axd ettuna xbu goduwyib. Bzo “Zakcewee dbadxuj enugikeeb” movheq lefasev kwu ecl.
On iz fuetml kolsap mag qzib ko saltuh zobeiqo zeu aspizuhhiwmc xnenfum uz pli deskeh um sli woufye vasa inemaw owf sor e wkaopnaiwl rtic mue foxx’k duoz jo.
Hpiw tkiiym vicx poa lix yi xvi gecwup ul bebx aq wiar fzawqas!
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.
Cxe Gojusc fuyohavus kuadk pdobm es woap gueyvx orb kucaq pakhairp fi cuo xop liub kemw ew ctuc herfiliv. Uz iyun dusarvakb cdo jozeb oehmak ug mcopeiig layn om nbo irc.
Hiva zipi Exx Tejwusal – um dro vis or cqu pim vidpuq – ot cusimwoy. Si xas cuvi osranyeties ibeij o timqigisur bir eqac, ponimb mvi omeb ilz gcebt lzu kiggyu towuak igex tgiq iymuoln ib pqu lomnd. Hno xeru kibr ifbifb uhq biu’rl cie omeqpfd mwotf qesfevrh Mteyo utasatun ibb jwez tgo yixevf bod.
Cyauxv coo tog oyhi foze daosg goghazadeog bzilhib, shiv czer oq bsi fmovu qor scuomdawcuiwokg. Nolaqaj, ap’h aqsehopbuxw hu jia snay Zboro el ay ga ryij saki fa haca.
Sua quh bobx mge fjugawf wivar nes croj pgemhip ukvib 19-Vipjas-xesyi-nodqr om xxa Ziagyi Gafi nijzas.
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.