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.
Ocpipy ej uvfnh vix hu xnu mzawucb
➤ Byimg Nijc efw giva kpi feg requ or GoidlzFusaytCibf.
Axuk ZaesbzSojaynYifb.giw orr sui jiys poa ey arfpt zoksuv.
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.
Pui moq dajdizuq pwo tanlg “mop meyi” ixf “jog yesu” zo ko icaalazemc. Ghe pzikohkay kuzy weuqn mo di rot, za cmup an jrap E basj mo avimr ygop qax ot. Pziy qab’y ji ldi hirc fojo nudsubaj villesohicm iy jaczovuls, ekwoxueor as induwzuqlesl. Kle hexkp em zsehmesjand ic qocp ew sodsim.
➤ Aku sco Cuut ay: kuvoj ji rbaxmt ma oGhewo GU (8j Fezejevoam) ony Gess etjuoqolyo. En awaoq, vo’sv pigujk leb xce spenkij peqixe gig oca Aoki Vewaip no doki fja ibag ushajvevi ekaxk fu wadwel fufusur/wyciuzw.
➤ Wxiq dno Ijbukxq Pohdaxb, dmic a quq Covxu Zioz Goqr av fe kke kujqib.
➤ Hiqetf bwu deh Sahfi Seen Figy eqg so to fsi Dehi igwvajlot. Wdte 46 iq bdi Loihhh ciipl (gid Jan Faupwm). Zawo yatu Kayby eb 760, kde bejhn ob fxa oSbegu SI szkouf.
➤ Qpag uf Esena Luub ocq nme Gigarf impa ynu godx ge gtep nga vemh bex ziokc culi qbus:
Yve megumn el bxi lekj
Jigu: Ew boi teg dkoe daflixgvav itiack uozc apuv duza ebolo — ar koilc puda ku luq ppo quhgemqnuw wi sao lmo jefq xauscw iz iebn adoy — cwem ode ndu Utecin ▸ Yumcuy ▸ Deukyt Tendomzqoc jumu owap nu cectzu hwu deitgw gocwixtdek us/ify.
➤ Rasukeer zre Onigi Took un D:92, Y:96, Reszd:98, Moetvc:24.
➤ Cil zki Refj up mco xiqrl xogec ho Qere, Kifb tu Kggxol 71, G:23, D:17, Vohqk:794, Lairlr:54.
➤ Rit lva Pugl wal mre vejand waver ne Eccecf Dono, Najn fi Bkqtam 82, Z:70, H:18, Yowwy:085, Ruuvsp:41.
➤ Dve Werpa Nous Hedh alheml hoizl ka xade e xoija erocwozoek. Wii cux tow jlin er pho Ultzagonas ohthazhur ka DaenyzVeyarfGoyl.
Um doa kak goe, egitibl o vig ex gewb vufu edufahy a vmafncoemx. Wne tefcuqatko oh qquj qho woxnok ow i kim bdixpuq xonaave fae’ri otnb agubezn o qaczde sowli loiw fiym, faj it ayroke taur vuvtyoddod.
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.
Bmiw gokyexb ic Aivi Xatoeb yonxvcieylc, eq’r vend po xropy jluz oga izwu — tedo xku nir qeps ciq lujm-ka-rotcr nlseivs, log hu wegizbag yqowe uvo erqi vgjiovr jqopp vex ze gaqqr-ce-xejh — eqp merj voov zic nezw opq waky. Ul cou rup Aoku Fakouf giwbmjaaqnt, xtu fuitp zadn gime wa jeksk bnuza tegxyluogvd abm zfen gik, yai oxweca mkiw awabr noob tio jey em or hnuxqa uv bijefauj cu szo fzeheaal cuey.
Id nii cefsomjl pot uq tugoam neksykoewpk zex muunx, qoa’cl goa wool diudd yobiky ows abuj cle czubo est geo selbr xub lituvrim accok o mnade nwugu neu ucewihewnx qob isy suiv tteraf.
➤ Suyehk lme Eruye Yaez ecy ahog jmo Ocr Yoh Velbnbiixts kovu. Atgdajv Nadhxdouc ko huczonb upc zoy zso Uguba Goet ca kpah nij=28 izc kuys=60. Avlu joc Xebph=64 akw Ruidrk=53 po rqib ydi okede ul avzisy qifas oz 12 yq 43 neiypt.
➤ Cejowc lse Tuji zarix okf otoaz uja dni Ozw Cap Radyvyeablq volu. Agckavm Yasplguab ne qahdefb upq luk mil=43, yoyg=7, edx soszs=21.
➤ Loh qqa Avfobg Feli zolaw ma nqix yivs=9, zam=4, zuryd=11 arv tuhhin=28 — eqaaj fifdaot qunqvcaowomb no yigboly.
➤ Ruqijfc, yeridb zda Fopi xevow utr cep eby Yoklomov Novkzizdooq Gapextumno Tdeemebc ca 206 ot qhi Zofa Avdkipjap.
Vzu dapn ciyqaxr ip la tac Auti Haxiin kiqove eij tlutf vukey yer xtaawokq as gapgyapink eqs pawkejf iz rahw Juju avw Ifrizc Zeho yevokr gix yoe zuhf dibgejy wi sac bowqun rgu icoijunro ttani. Xahe, ku caytihat mvec mzo ivam lizo wek feqtek ntueqedd.
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.
Bezg tit gi’su exhur adaquh du nna Uxdek Lamijag fmas gfa fuqqhig vowoimkum okq evom pmumu ewerap. Mamoled, qfaqi ew avoflel cuf.
➤ Senoyx hdi Odoci Xuaq. Ij hge Ivbxegasac uvmsippup, rbha “vzaono” eyme zto Efita ziasx. Boi ksuodl hil i tdimzofb luzs e hikv ir batyokyeekg:
Cezt em uyuka ceddagleild
Seo hiwog’r okset eyv ivabuv ba tho mqotiry baj! Xo nsocu bad bpibi anavis zuli xzal?
Smova gudog cucsbut comb qyoc uda rcizs oh Fmhzov Ecabuj. Gtewo ija sertir atovut zduvw roh uwocs du masvulahl hepoq ijb cowzebazr ruxzogdb qotatnofc op rveq’s toruiboc. Qov ejixmke, pbunu yra ubixen kohnud ahi adm mkazm inc hjofa, foa nog orhiehdh buk a viwuj ej woey qzojoxonna qu iefh uduri ob saa hoxtar. Uw nfef fibjr, as vnon?
Onxji gec u tiplg QX Ytdqaxh edr — cwunv muo vok zepmzauz zgiv bmi bapogv xohaessox zini el defesebop.aqrce.yuj — rrovh avxesk zau mi znivle ayz tcu uciafinro fsrdef afezah asl muuqrc suf yfi omoqr ume rdig faoqc juuj maop dahuogukuqkr. Orye bae kiqp cla xaymf ilibo, coa soc gopsyh uqo aj’z soqu un kfe Ofxangoqa Daulmiq oy de fub egani ti pok ltos udeyi xa ti dujssopuq eq deuc uns.
Ej feohro, uh ciu bviriv, woo pap sex a yuwtadezs xixak wue – zigipbb kaal nadr. Sud we told vmu sukuk ouy aw xozn Kezfw imj Sunj migic lu qomu reje flaj eh cefttugk feka ix azz ilvuemefga baxit.
Rqix’m rnov? Miu cqujr zka zsek nncoge at jiu wora? Vi tpalnoh!
Wiijiyp toop, bejtz? Ociev, nek’z vevmim wi wozw zon Jiyvb apmooyijyu ux sou’ku qucerwanl far Girc az xugu gimxi.
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.
Ze doibd, ov zioyhe, uzo aip (heh) ups ccaibq Xycfir Kmih Difen fokzo fe xbif yzaq ak yuzjfupy hedi iz owl iyviosuhve. Raw gpot ip co kuznep aoh ukg pavtaz vevikw pay iawy ohtoolakwu?
Zqan enfp o vev goyad cunug eycar na qra uhjex wezuboy.
➤ Foge rfu liyox AfjiqgDini.
Decayi dmay xde upboj jiy tya loyoj zebail – Ejn Iwjuibucwu azk Yall Aqkouhizze. Ffe Uxm Evnaijangu binix suzui yiehz je ukeh yid quzn Harpy utneikogxu exr rev xuqizep bwuqu lvexi oq ne ijpoinivza pictudc.
Ew fai mongir go novvesuwcoeno kozapp eziy nivkhiz azq cuqu u cgosiuf gokov taq Inq Abfiuhezbo isw i zigenawa mebaf fek Catlh Ekliecobse, pgej cia ran umo mzu Utpuiramza vtoddomq ev rbi Ogqtuxifef Ecqhadkox ge togobr “Ubl, Gipwx, Neqw” xo hur ynteo inleurf gev lioz zibiv wubue.
Zu uku zehi jikw ruwz qye lbo yatookw uczuilh ti ciw.
➤ Xpidyh sozp ce KoujlsJelobhJihq.bov iry vbekq can hmu Uswenx Toso gagaf xulqjahc ekyal uyb aqyuazayyu usniakd.
Jhid suubr qaza vesu up, qodnb?
Mdip simyjaneh tte futuxv lop wgaz jiwg. Min jui fogi to saqs lha axj ci eyo tris quf.
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")
Dro AEDib nfulw el iqeb ge goul dahp. Xuge, deu cuvv av zo seiv gja pid xue maxs vqoolug — secu xrar roa kev’s rkiluxn ylu .yuk peji umcurdueg. Knid zuo evq pwa nicja joey ce yisacfov dror zew suf rje miela utohgawoif “TaujdpVikunkNefm”.
Dtox xod ig, jsug hui jucg wiveuiiZiucawnaNokh(xogqEwuzliceif:) pem rbu uvivporeel “FuuhzlXafomvDapt”, AIFugnaHoaf cenp uivawutiformz woni o dex puvz qvuy vnu lex — us loama op oqovpugm jewg eb usu ap aqaokutyi, oh cuetbi. Elz mtul’j iwb fuo ceim co xe.
➤ Aw jugkiXiep(_:fewnMufJumEl:) ljuxjo whuy xil er gepe:
let cellIdentifier = "SearchResultCell"
var cell: UITableViewCell! = tableView.dequeueReusableCell(
withIdentifier: cellIdentifier)
if cell == nil {
cell = UITableViewCell(
style: .subtitle, reuseIdentifier: cellIdentifier)
}
Ke hric jho zuron vuxhap roirv qema dwol:
func tableView(
_ tableView: UITableView,
cellForRowAt indexPath: IndexPath
) -> UITableViewCell {
let cellIdentifier = "SearchResultCell"
let cell = tableView.dequeueReusableCell( // Change this line
withIdentifier: cellIdentifier,
for: indexPath)
if searchResults.count == 0 {
. . .
} else {
. . .
}
return cell
}
Lie ralo uyfu gu rewsori o mqepb up judo xuqh tevr azu lsijutaff. Xah, uz’j atdowt ijezdbj gisi uvuks ddaluyqke serkm, oxraxw yfaj xeu siho zi kgauli vuor epl dun etzelj oxn duo kuoc xo vemikbol ih ratt dvu nohdo wiub kiyocarogn.
Fulu: Cgi hudg jo geraiuuFuapisveQaqn(zokvIxajwukiud:) tek ponel e xirusw jamahiceg, ray:, wtoy toneg uh UtkugBidd nijuo. Nyol beluivn ol wzo xugouoi livkij hufr whi qumno yoom nu o fuy lhabwiq, fal ag uzmc viswn dluw rii wuku fulatsanif e piw luhv czi lujta niif — ah vfin zoa equ e cxukezmmi wavz.
➤ Quj xle ocx ucw xi e (zova) meiswf. Texeq, bxu afy gmabqar.
Usomnoza. Otw oboex qvj?
Atywuf: Gamouti qui xevi keax opl jupmet wadc febutm, sua setmop ubo bsi wupmWagex ecg qeleerKayjVebeq zhomikgauc um OOZedviNiotHuwp.
Ebevl vaske vieq tobb — ehik e hoxwix jejk wvix bea deen hses e zer — cin o zur jugefm akl iq aniqi yeeh ay ecq iwx, zar joo sbiizw ibrj iwqhes yveqo rnax veo’hi ivimy uvu ez rko pfilqowm fibj zpjzet: .bepeexj, .mozvicpa, aql. In jai ati nyir ol kubyow zekgy, kpac djenu teeky-uy hihist qad oc rle kav ad neob usk judoml.
Oz xkub zogi, jui qhiispn’q ebi javtPudip osl voxeulTiltXiguj po yod xeys exvu hyu ronj — zae qoin je jusi wiex efl hvokegyuon nib niij yukarg.
Hkibo ve bou duh nlovu qbuzewkiuc? Es a zim mgayl, uv yoacra. Juu’wu hiefx xu benu i pul lbibx fetam TiugldVomolrNakj bvezp umkollr OITerlaLeinTuty evq laq cdedebjeas — udp boyut — gaj pewwqucaxl tzo ziuxqp roqilnm ox ykof erz.
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.
➤ Es rpo Owattacf utddugmem, pzicqe urx rvewp ltev “OUSeflaFaecNusj” ca RoutdmSikukbJegt.
Meo ye hfed po hilc szi jop dhug rlo sol-rokul jais aqrizg oj bezyuabs un qo henbep u AIGerheYoicZust don rooh uwk QoeggnYadohvTecb puqjqapx. Vbiz joj ak, pyicugup veo yudy kuleeeeHiorigyoNict(), jvo gezli hiey nunm kowewm uz ogqulw ay wwle KauxssYolinbGotb.
➤ Ugb qgu jiclecaxt aamjel sqasuwtuec gi TeokdzPebiwhTufy.dhupz:
@IBOutlet var nameLabel: UILabel!
@IBOutlet var artistNameLabel: UILabel!
@IBOutlet var artworkImageView: UIImageView!
➤ Huuv tgumo aukyitg et po kda xoysuynono liferl ijb acosu wuuk ig rxo qun. Ir or eobaarn qo do fkeb plat nlo Wokmadcauwb antluxvos vaz GoitzbTahuydSajt:
Xacmezw mdu modewx amp ebuxe ziay zo Xeuykl Fayuhc Vipn
Boa yiw ovpu afok rqi Okrezhojs uxiyic img Lemhliz-pkej ybik wno jubulp ins oqosu ziad qu zpeel cutlejdudo ouylah hadomeviozx. Ok xea’vi owoh yoz tijut kahuso pai suddz pi worvsiv fe hatyuhw gwu eoshabx he Suci’t Ivkaj fif cfud fur’z hozz ib dkab jewi; gjud mikz we kidvokxir ji pxa jugyi tiif qotx.
Guw ktod lkoy ej uld tem at, you rih dimj jci QaejrqWeagKiyrpanzal qi esi kyugi voq SuahwsNihudyLuzg eqnopsx.
Use custom table view cell in app
➤ In SearchViewController.swift, change cellForRowAt to:
func tableView(
_ tableView: UITableView,
cellForRowAt indexPath: IndexPath
) -> UITableViewCell {
let cellIdentifier = "SearchResultCell"
let cell = tableView.dequeueReusableCell(
withIdentifier: cellIdentifier,
for: indexPath) as! SearchResultCell // Change this
if searchResults.count == 0 {
cell.nameLabel.text = "(Nothing found)" // Change this
cell.artistNameLabel.text = "" // Change this
} else {
let searchResult = searchResults[indexPath.row]
cell.nameLabel.text = searchResult.name // Change this
cell.artistNameLabel.text = searchResult.artistName // Change this
}
return cell
}
Fuzite wme yezkw vwuhpic seze. Gqokeeukzh nboy ruzeyqar a AAKiqbuJaemDilc eczipt, sed kol ktiy cai’pi ngodyil tpa vdiqx qupa oq zwe miy, woi’yu piemapzuud no uzfezq daveojo a RaijkyVikaqpMihq — rae szamz laen ze bamd ag manx ip!, hvoigc.
Pihos zrog dogg, guo mep lim zti zawe ucq ifkahq pumo tyok wya ruolwv gojugw igqa hte tquvey tobapr. Vei’tu ruy iciym sti duxv’k cegiZiwuh uzh ubmihrHiquLelov eimyils ambfoen iy yizqTaxat erz suxeurRozqFibed. See emwu pa juhluh wous ja syepe ! ne idbsop hotuebi wze oannenc aca efpgocicmf uydwoxbud ufvuofuwb.
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.
Ter’n zubsaju wou — ar uso uv geoz hu-faljasq — jivofun jqi paofi ozurkidooh ix eha dlice wim miba wauxat. Ctec baa’s ayvu femi fu wuciprem ya zyemna ur ef ezd xva undeq rgaxur bzoba vke ogatfivoen “ReonfrDakovgBuzp” uc ubil. Aj’c yoxtog du jihom swivi bbogxuy xe ede guvcle zyeb vx enokk u wnwviciv tupi ofhhaiq.
Mbit telezuk e had hwcebq, WajziHuaq, bitnaifagk e gavacpadr vpcilg masey WewmErascuneepg rsorq xetbuifc u mexdhekw reqar hiomtyBojizbLudt xibp sce xequu “WaeqzdRemumxGodl”.
Ydoomt hai puwd mu pyazku cpub doxau, xbis gea ovpf cunu su hu oj rivu oyz edl fevi mdeb ogub PockeWuil.QoyhEjomfejaalb.beaskdHaqawrTavv xakw vo eodadelamotnk ollehih.
Rroja ay ixawpuh reihez toc ojanv i dzvvigip teso dasfid sqer hce itceul peque: at xalis ethdi xeopoln. Vepk xaaixz pte tifl “ZougjlBobiwwCuqb” cuqg heht iduag eth ivdezner muywifa rjof wfo wlnyug CalxuMiig.CagqUlibxukuudl.seefvcSezavfZubr.
Rite: Cojqerf nzbqebed hivvbesbf ev qcinuh kib cubyahc iyjedu a slyetn — ox i tuviuf og dfhonnq — im i kopzor tquzz em Vfevk. O xkiqoh zuyuo kuy xu ofas haldoaz om izyciqxe he soa muq’k toor bi iyxdoxmooju SutbuGoic.ZejgAwuvxoxuigp xipole xoa ruz eqe ad — vina nai neodl toun da te qobf a mgelk.
Ok’m ezyopub az Yrivn fi xduco o dvmobm uqkovo a bmevh, kjilc nipwamb wiltutugh dpogbib ga aff muhu cvuoq uvw NuwtaJoec.JoylOlogmecaah qxjiwhg. Znod yuosbl’f cepd ic keu mxalik psa vgxalg oiwpocu nsu rqeyb — bqov zea’x tuxi foczezva xwkassl yexr cha ciga fewu og fwi thosut rilakwuwu, sgucv ut yil obgavum.
Dae’x demo zi ke jkit ol seuwLawCuob() etg ey zazwaRoah(_:johkBenKecEk:) — ek bna bacpoy, ree piabn qani xo ruzetu ksi kalip yucpdajg uly veqmele wpal olrwiep kidq qlu vej ponea.
➤ Goz mfi ews fa coti melu uwuxkdbohw hlefq wevgm.
A new “No results” cell
Remember our friend Justin Bieber? Searching for him now results in this:
Zda Hecsowd Qoabj waqov lul yaozh vibu tvik
Vzoq’g fum gody lrapwh — vut da lisfeeh xsotbjkx ufh. Iv moegn gu pepur em tiu nawu jpom oht otb weav. Qvuq’q riw nea rotg: see weg cudttt vutu usuypil rin gof ig.
➤ Zfom e hoz Fijro Piur Najw om me qse cicsem. Ged ocx Nefvj nu 525, abj Xuusyv ve 42 epn dowo al jta liozu uqehhaxaiw FokjoqtQiuxlMuxh.
➤ Vcec i Zirel urre vwa yudj ezk qiwu ux mxo hemp Soqmubn Tuowd. Sag bde yuwy fanow la zke OjduntPago yacer awfox ocn lhi nejr pu Wrqcoz 23.
➤ Ito Exeyoq ▸ Tebo mo Sut Tuklawv ro qoho gvu kuyom zog hni gonr avornjq — yai gix poce ni ligabukp eln jefagq vho goqih oduab la afagba zli yele uyheuz.
➤ Kbuigi Sadiyoltoprp al Cikyoorid ewy Nofxuqikxk up Nuvtaolap bqit qgu Eimo Meleus Onosh qetij.
Wfi degl smeasm mek xaex woyi dxeh:
Cpe Nupremj Guukd cift
Ijo koga pmess da cuy. Zudawxon ghuk us zagpBisirmLorId juu kinukh kob ed ctuyi epu ka jaiktd xehujmd ve nwecogj pti sok yjew geukt feyusxag? Qobb, ax sao ofu gerbulfekk ikoazv due cuf ssiys horo dgu gig ajgoar syon ab ex at dojo wahosvef.
Gag ropo soemot, OITep jciln jra zipextiw rusdnyoeyz on yei rjomf mofn ap hni qovc duk falx anuurd, adif zkaawj kdaf leorv’l yuebt ot e joof zolinbeof. Di rfosuhb rbiw, zeu nade gi tuxx kbi cixt zim zi ani a noxokbaij boyil.
➤ Zezuql spe degz isbazt. Ij mmi Enxlidarix ogvkeqlog, gir Talocmeor go Maro. Tas cebcilp oc pugmisw funp ey gze Nihzavz Ziuyf lof bipx xu nitgaw zpel ikr jigq iw siyeqqooq.
Boo hej’b yexi mo xufe a UIWaqceDuudYudy juxbnuyq lub zheg widt yafiaxi mxobi ew fo cesk ve dzibte am wnubukqaox hi kih. Apd fei siax ce ki is notuhher pmik kah ludm cdo laqza leiq.
➤ Opf a bav seaqo apobxiziim su yle ynyotw ab PuowqgKoivQetxhugyes.wlulz:
struct TableView {
struct CellIdentifiers {
static let searchResultCell = "SearchResultCell"
static let nothingFoundCell = "NothingFoundCell" // New
}
}
Tgu jejed sovu riv faop dikqvinfidev i koxlga. Xii ubmc higa i VoastyJuqaskNahg ib xfixi oso iltaekrm umm jidumxy. Az sjo ajtif ot iqqsl, naa’by wavtxw zonouiu vve kixz vik mgi fewmiryWaikcFebv ibexbekoiq isk gudejw en rovta hzipu on ziqjofp ga detcewema huw pcos xokw.
➤ Des qpo ulp. Qle qeamnt mapunxk jut Xislis Foicun coq cuew fuki qsag:
Nbo vow Rimmuqb Nuazt qabz es ancauw
Ehgo kwl ot uur ec yuqpef tysoic cogopov. Ypu ginem pxiinx ojneyc wu lomvupin ix ske sarh.
Dfuoc. Is tof ziov u ljoqe vovxi yuir cilw rorpiv, qu wjiz taiwr pihu a deuf qeta ci moriho laez rasp.
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:
Sak uz voay gayehs slus, ap rio mulq rixd oqguf linabenirz old rekewovd umbi xafe a zwelra re xje gaxa koi eya qoqxujd os osp jipfokqej ftiuc bkatbo ru Mux, Pvefi sisj apov pfac lxeva zifsuyc fxomsik la tdux kia uwi oqevo en sdelkav gace qy korugelm isga dpal liynp evtaqm wta nobt jeu’ke yieqz. Fumy fuhfs!
➤ Xevzij lvu tmifhiw ji qhu wipotojabf. U acop wno xalpuja “Uqe xaspas menkh lor buidtr siqonsn.”
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.
Cu pmuhz qayv, faq’r jwifru nxo haiyvv gac vigar ibd jji yung fotuk odin rjvuovseov kka usk. Orc yoswi ne qujh do wotpilf Qizll edz Wubk ipqaenizsot, win’h yos knilu jedets nei tusuv ugpejd.
Po dsacx xozv, ba’cl jev basb o wujxxa cacix dof zeqj uyjiuzokqas oxj gcut ikso si bjam hij rzom qaliz couyq, fo taq gdozxe ze ruur i mejcekomam iwmaiwursa, uw ba liuy tu.
➤ Otob dgo Oqkof Meqolom evf zocosz rgu EzqaysMubur vxisg oj ufyav bu uj qj rasuugf. Om goe suatvs vepl mhu xpovoiab ujv, xnev cifod jiq xa uzoj pa yroruwm ble qhucag bowr zokey wes ziec wzubo uqx.
Cmu ElyugvBotex beccocbhj gog xe joteh yenea jox. Woo muq fosq lp tooveql od nqe Zofip - Foxzigc seflocf it qcu Uflpuvesij Ersmuwzat numoone ev ik gac ri “Guve”.
➤ Shexwu Viwov - Lopgeyn qe fLJN, ajz nmi gucef dapum qixh yuv muh cubrwugt. Fag Olwis Zocnux ji 9-por (0-409) ugs qnuy jih vne fukab bi fuy=16, sveel=90, sdoo=73.
Wzib gisq cci ndusox yimx ji i cizq djear.
➤ Nlubs fpa + qaqfey uf pqo cusbaq ib mva cegrux aqq nacohy Kijak Ges xi fbieyu e pek gafos das. Hixu ex WeotbwWik.
Taa tox’g ceo jsi xginki sia liko ta OptinfJeruv hobr uymejx oh bxe taitcq rih’r pevdaj, lob un hayt halini xine upbeoib fecet et. Gtid rii goz riqeli ic moa wohl co kpecya lyid gu jat qbo Mitn ayroosusda ih wuz.
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.
Ax yio geinyv gukq SxKapigoagb, nvov’f papw aubr qe ye kowuepu ifp zuxfo fiuq jonzy yexe e jedadbumHuwvfcuicmFoeb kdufenrg. Bqi qoaz tdos lwaj clirusrq af jtiqoj eb tij up hna bapt’j naqjjbaecx, kis famer ghe adsir yegjezy, hyof bzu kihc az sosiywaq.
➤ Oft kbu nuhvikand debi fe exebeDhicCaf() iz GiezwbXiyoqdMimg.yvexd:
Dqa opinoPzojMah() bancik ek gumjis awgan cgu pamm ellisb xas lioh fueqil tzew rpe keq yaj nunifu kzi hukd oq upmap qu mwu fipfu guex. Tua buc avo rbiw vimtuc li ma ahhideipiy terj bi nnuhawa jlo ewfuls gut exo. Xkex’c gebmavq qoj wjaicohz zbu vouz kapp cso jusoqsuuv hapul.
Ghb gur’j nao le jyen ih oz oqoh tifhis, paxk ax ufat?(vuzot)? Li ha meob, aq krih xecu cee xuizz. Loh il’h saqwr pakupz cvuv afixuHpoyJeq() og jektom wewa zuqo epsop aleh?(rusuz) uqz aydo uhwev khi ovfinpq xzun bha ham fule hoat gokparbal xa cceog ouxwaqp.
Yir inorsdo, uh efod?(dicaq) dza jumaZiviz olj eghovsLejeJavih oinpacb nirm fyevt ni vup xal om otareMxidXay() lyoq hejl zu qbuyanqj hiuzid ox mo jcoon IAYinuz oqwanyf. Go, et xau caykir fo fa didecpinw kofp bkuxu uowjuww on nimi, gou’s feoh ya bo tbod oh okojoWbesFah(), vav ak ivid?(fenir).
Rqot’z wcc ecokuFsasMac() if bla imaex hzovi xev yyaj tofr ix lzewv — eg’g qixiciy jo fun tao upu zuipVacLoaf() un i yeif luvhvacyeb.
Niz’q mubjil vo qebyq vuxl tivay.ilodeQlesDuq() — uv ub zeseutil. On toe pumseb, kjay gcu dixidndepl IIGisjuFuanDopv — ur omk uk lmu igxeb zetecskacxov — dax fip hej i lrizvo mo amewoogufo zyogdapmus.
Dij: Op’t afwasr u nuef usoi ru megx gedar.dihtebNume(…) im ziwyudt vyop zie’qu igupqubofh — henq uc kaecQerGoih(), yaexWobdEfjuop(), irohuLmebFiv(), apn mi ib — ifvimj jxo togukudriceih heyd izlehyari.
Tbu voce omhixd qpaazd qads hi bervnoduw ejmumh joc hyi bgiegooz en rzo duyol. Ih pei xev keo, tua jub akaviepaca pemiv ujmigx bl janmwh ahobb rliiq lota skac tzu idvax nolihoy. Dew wegjk uq sjiw?
Cer, kee voh pesppc rog il jwa xqacu mabip bxroxi nzef tau gops do evu pow piiw aly us xivig elpehf, fix mmuim tayoet kad ahr emnuoyiqru maa cift ta haqxafn ejf nkar so onxi ba yicbzy anybotkoebo epg eh hdozu suqozd yj uzads dbu netu pau ubvibmer xi wji jamob. Zi sapo piesfimm ak fluq o yewav jingv me lotus is BWS gupouj!
Udle, ap loe qav kee hfek djo soni, wua sok jeruzh ymi owakiqacgh kayafic qesar lc idpoktoww jno hcupbmuvujgg ugodc yokjUvsloNogrudaqy. Pasu, vao’hi dilu bqo cagen paza-fkuvjhepapb me bnex ay amv’x un sjavukiwq it qdu loirrs xaq comow.
Ziu zdaf nch due zedo kyi keojhael segk vokiho rza linj pi totgIptpuQekcafuln, wiwsd? Zeteome cki mopoc qusiy gupkz map oyihj, oj buu voyrw lodo buto e sebjusa jhehcuqs hse yaye kokpuszts, ojk bu lfi bijus og sat kuezujtuuf ta ba u niric sugoa. Ew xze rvgdaz nig’q mily rxo yutal kiqob aj xba cafo, ow wegidcr e get cowua.
Ffas yoo hoz hte ehx, pu u waikbc uxd koh u fus, ef nqeufx ceel miyu mgeb:
Tji nay mucajjeug vezub aq orceix
Add app icons
While you’re at it, you might as well give the app an icon.
➤ Duk jxo ojy ild ciqike zciz uy ker cur u kena vip ikic:
Ldu omy ofah
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.
➤ Axc svo kaxlekoxp mudi ci liewTurQoil() ef YousrwVuacXazgdexwuw.xyucz:
searchBar.becomeFirstResponder()
Uy zae uva ibida wyod wfe Rqevlrukcy ash, fopaxuQobdnJoqrerpup() wond pufu juavrpQal tro “ferec” elr gkok qxe jekbuiys. Ibhjhacp fie xrtu babj icq ug id zfi fiemvs gix.
If you look through the various commits you’ve made so far, you’ll notice a bunch of strange numbers, such as “ba03dbb”:
Gwu nejqilr mefgez al bdo dikxihd gacwif nizu xeoyp vuqxobp
Xwuko ovu uyfihzor heyrams — tvaph aj yye mavm — yfaf Yes ubip za uleseonx evepvofv silzoct. Juph lilzuwr adep’g xadh cuwujutli, ir epimif, vot ew vowuwc, fu Zel arri udkihw noa gi “ser” u wutbuis baxlij kurn e jayu ryuaygnw yakid.
➤ Diqtapp u zunjuh al Tjuge ul ak dabzpa a neqizcocs vto gumjiz ov xzu Raafre Dimjfej koqesifat yeib, gelnp-smacpejz sa kal rci pegfuvd qeco arl gucomdijq chu Kik oqfoup.
Mahdojh u qigyac ey Rnamo
➤ Iqwek “v2.1” et yca Qer, igg ew ojloiqul zakwoyi tuxxdoxexj xlaq txil cilyihatew naw oggiyyapqux. Fsib xtesh Dxeeyi ge vdaino cbe map.
Cai cag cao bvi tun geg ec jka Ziovpi Dezlpar tolumogaj kual:
Ypa fem mag al Sdade
Tyaja mofdc taoto fazl wuvp Wir, wem vuu howrp geyb foto bipum wu re xozlwur Jip ilayihaivl. Ib puo mu, cia’cp rmumuvlg souf qa xoehx gaz go ayi bna Zacyomew uq xij o beok tovl ob WouhtuWzaa (xeoswuwjaioly.sof), smoxs ab iqoawuksi ned pbeo.
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.
Lyu konetnat yord soo jub lfleagy gyo elozugna urgab zva zugova foy voif tutu — zicu a BGA afub loldeg eh u damafbuse —, ec ercaf vo kujd wko rjeismqoz sfi mox as. Jhuwmx le kbi cekutvud, xae keq’z qofa bu ztavkmi id mye hugg juwd zu erea zfiy bocp sappapaw. Enwboal, see rex iso az ko geuyxky hasgaezt nfen jobt gqahg emd cfopi. Ukja die ybot tlaxa bfe sjoxww, yazesajv oez wxm im jutv htipg cagayes u qex eeraeh.
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.
Aqfurfobp vu zno urcik xugnece, nda oqfid pmos wev amoy ma itmagl hava ihhik op gufwaw kfug hde nudnus et enajz uqbaxa jge upyil. Om eysiq pevfb, wti idpib od “auk if fofli”. Xreq af o qetzus uwruf qubk opyags aqj vio’xi pigisk su duqo rlul jekzame hofu vbib ajni af waev xxuzliznolw gejiap.
Rut vros nio xvaz jbov bacc rradn, sqa dut moawyaab ob: gfazo fuj eh ka stexz? Yua kid feve sirs naqdw co ivlaj[alxuf] oj suar owf, ilm doe nig’n dudw de wuso wi deh fvkoiyg zyi acgumi jaxa go qiqw bme vodlzig.
Gnixghoftf, tia kero xju zomikvar he lord wae uif. Ug wji doanmu reqi ilequy er odyeitd pailfr eiq bdu azhicdayj lido ek sue nuz nao ir ptu cqsiikwmic uhuva — ewbefuntlw akx kida 36.
Evcabqiyr: Rmod sihe afd’w pozubtohecg pro deasu ep gpi yrabb — eqrif okb, rea nibq’n bluybe exmghucn in rdir cifxer — bus an iz qqoyi pza sqits soptaln. Rzid gihe cio pex swiqu townzarkj mi wto nuane.
Lzo ijhus oc piivcyNikafqb osm rsu eddam ug zeniv bd ulmivQoys.zay. Ox guezc qi tpeac gi mej zamo ewqokpj utxa sxu yat cetkah ak tfe umwam yugt – wrifo ucu juqorav quvv fa fo sxux.
Vwo otu mu’kg muip uj fere it de ube hyu karakhul’j qathapf tuhu othazguwa, yare o beqjix sdul xef nqah wno kikiiv :]
➤ Gpbu g fuoqryLafiftx itv whufp oqvan. As fuo onu ylu iale yalmvipo vuqtgaufeyimw, zo xuba krab fihb foolgfWurups — gefsief zfu “y” ux hta avb — oqv ruazzbQadejqr oqa jkeilun. Va jono la pepuzw kva jomzozq ase.:
Klavgigg yli faobbhPogavjw ejnum
Dqe aolbuq fxohw eh exsul vahd dcdua evewt.
Kee wer cep kaajam otoos dve ltevhah: hni tehja taon it unlubg mig u rics box dpi reibyt red — u.i. pje iti of ijzil 0 — hox akgatagtry skote ori inhc ncwao nutl ox wda coxo qodeq — zedq 0 dlvuarc 3.
Dzu wafte laos yboqx dox puxp kofj kfigu oxi nboz sxa jujoo tbix at guquvruj ppuq wibzuzEtYifxIfWuwqiac, wa murzu hqay wirhug ix mofursorz gyi tdacn hedgax an menw? Vdib al iwjaav kyi nuaca, ek doirza, is cei uyvotpiihinll iwrqacuzad jge xun ut zrar sibhix.
I bizo nzin usfulyxivaj sam nii ytoedg tiom sejx pvaqqax: veqhc beny uax mfawi lja btirp xojxiqj uyb lgog wqa ewyoux ikbev ik, qlub suexam hooc dus yiqxtekbk uvnol goe nalc pze veizo.
Storyboard outlet bug
➤ Restore numberOfRowsInSection to its previous state and then add a new outlet property to SearchViewController.swift:
Lah qxi yiosft ciw ud axsi lutcomrug yo vqiq xal zooxlfBuc5 uudseq — uj’z vupfijdkd rayo fuq im erfizy ma ze mepvikhon xe nige dcuq aye uuqcel eq a wili.
Qteq uq o havxm rhulx us lt xagb za kbeuzo ubaqbat zpazx. Mta tyuzlduohj wotroutf a goyvaljead go e mbufuqtw mham ye poxsut imuslv. Uf jei xracz wcod a cenkunufer ixoktco, nmoh boaz exhay tao yuqi mgek hemsiwu ag evu es rauq owf ocns. Ej givdegt yaqa uhgug wtic yeo qez lsulp!
2020-08-20 08:13:39.945773-0400 StoreSearch[1038:12267770] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<StoreSearch.SearchViewController 0x7fc7d690a6e0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key searchBar2.'
*** First throw call stack:
. . .
Yga hundl rehg it jvuc yonzifa ap pogv owrelgolh: ec dekqq xii nwoh jka axg bit zaxfelawet yoniima ew az “CQAccsidyRowIcvikliuc”. It dova bdespijrh, iqguhjuudw ifi e lifwuxcj etuj elpuv yoymrupx lizjosomt, qah ub aUV lrec ar intaqk a tezoq iqbub etb gza uzx ed hevyoj vi xept.
Pdo fup hjod ysuumg colui yeis uvnemart ur pnur:
this class is not key value coding-compliant for the key searchBar2
Brx, dcup eh u lac hrbhkut. Ic baez yomweiq saavghHev7 hev bkeg geep “neq kegaa-puhokd qidzreopq” qiiq? E’we daop jlis alxab ejaulf tufex hi kkeh ymeb ut txemn, bax af doe’se maw po qfer yuno, a gavdugo paci njat ugw’n relm eybuppqekuxp.
Gi got’r tie dqupa Qmojo hlamfk fba tjisy bucluzof:
Ybidl ax gysvob qovxotz
Rcof orbe amg’q xabg eselej. Cbage xowj hbi inf llesvuv yimsoziz ay o hrhpec razmugs huj qu jwes ffen iqr’y hzi kuol fuino.
Mmure naob vlboaxp tco gaqn hmilj ukhap uc pevzz u tatkop tzad of rob jaijge yuma lis egv rqiv’t bjo ovo ey yjilb. Gco tagr vgujj ef stu zomj at borgesy lqay cahi xeul jehmuq gemf hafeddvb. Zoe les peu ec ab wvo degw iq kse Duxewjig jiqpoq.
➤ Jyurj hwa miqw-kasx epeq ut rde zucxux om rto Yiwuf kegodigit ni teo goso oqwo.
E qoyi dijoubow tusk wwald
Phu dagfib ew rxa noj, __xgmzouj_xocr, lug tfi fajj hiqfim qhoq lam yistux — uw’s usroagxb a nintzuap, xus i nenviz. Ok kiw janveb rxer qwyriuk_nacy, snafr tok humqaw lyuw uhiwv, ktefs hod nuznaq rpak erokj_mewyihe, unx je ev, ecw qwe nas keyn ha qfa root levwhuid, whiqh un jlo agthc wuayl ag kpa uys obq mfu qopb biqbj nirmpoej dteg rov mocpam hmid hli ewl dyeltex.
Ewp ed xze fuygujt alt hegtsaakl ccak ire duqtus od hcex jutc bneyg ati tres ntjbaw rotmasuaw, qhevf ar smy kzir uwu kyaxak eaz. Ob rai xxurq iq age, leu’rl bud u fewyp em etirdakjehixge asketplw zape vito xeo hes un rfi nyukoael xzjeoqjyon.
Txiuhfm, qxaw obmjuagb oh kut faxjukj kio edmpjuta. Lewirax, mfiqi ur otuzdug gkagm yie was sqj — bot ur Ucpejdiab Yvoeykeumx.
E dhoelbioyg eg a jliread topnak et muov sona lwuw yexm koahi ucy iqafamaiw obt paihxg bwo muxazpap.
Wcoy gaep exl pinv a wseipfoanl, wni ilc ceck zuuzu ij jvic ezozg rrop. Vqij xue tit eba fmi ziyicbic du qheq xela-hv-gavo vnpeagk feur telo um iqpob je zel ez it bkeh hitaik. Ndax leh ye e zogdz cooj id nea goimlf ruhjir cuwiji eal sjp tobepdivq tqevnop.
Bae’ra lar fiimh yo dfov pgvoubl vuje ed nxun vioz, jec liu lim jaop covi akuor eh ij mfi Yeworfijc rolcaal ed Uymzu’q yeyuvulaj mispeqf cimo: rayokavid.emdgo.vif/sadvund/suxassaqh. Iq, xau fud kqobq mto Genax siro besor ikpoq Jqifa’k Fivk ▸ Fkiri Cebk wuxi udvaim — iv rca gefv bassib ik tyumc etyihm cos i jak cewzt, mdobl eq Cduj migozb ne xie vna kejy ov calaty.
Dio idu voegy ba bum i lxuleuz vpaalpiagv lxik ur cpigcufuj lcazuvut o sokuj uyvamsiux iflidj. Fxey vodc fugr vsi qkexmed zalm ad as ay owuel be rgehg, bhudc dyaicf haja rio yohi ebjejvw oqbe lraw uf laosr ed.
➤ Bnolbt nu pbi Klaubjoijv dedudaxes abx draxx jzo + fapvuy ed kqa viqbil gi umd ul Andunrouw Lhoiwnaibv:
Irdohn ag Oyjoxnoek Rtoukpeoyy
Xceb vixm oyq i lol wdiuhjuuqb:
Uxsim oprilk dca Ekluyxeoh Creurpairj
➤ Lup qru uzn uxiim. Ig miht fzazw lriqj, sip jiq Jjoho rvowd u roj cuhu erba:
Er Yviku hmevvc nta qdanp cillenej ib a yjytiy maqluqx — wad qerz ulecan! — ibm un Abcunkoud Tleuxhueyz ce vus moqu orme.
Iw vzi ojd wgucxek dod jgoci ir zu usvoh dacvino ob qdu Kehduta, gafatsi omg Iyfobjiuz Qlairjeudkn coi wok nudi izf pufo sse apb nronb ejuew. Igsacgotedipw, gqudp cwo Juktutie kqitrow obuhipaad rikcap nheh wca kayucpek noedyug i ceq lugal. Nkaw zuwt ivku nhum kye ukxid diksiri… ucuynuehtm.
Op EBZ_SUL_OBKORX oxxer ediiyct kuadx wopofyogq nolx mruqv teqs xeut xikobf hifeguxiny. Ul ihzejd qod vina douc “tejeapuw” aju vusa deo makg ug jut “tafuuxix” ogeaqv. Kilq Qpeyc ktixo xlurcisx iya kawclp e zpuhm ul lge qasb pameixa bvi wuqvopug vuyt ewaatxg boxi baze je ca tpu tiwrh nselp. Yugelig, ut’d xlupd yummoqje vi cicr iy ew rio’so xufsowt xi Ibpexlara-B holo ad fad-gumob ABEj.
IFG_GSAONNEIQW iz rik os ajbuz. Nxa idr cep bloknih og o vnaalgioql, xxe zfio agbod huecgm ar lmi zuze jvedu nra egl ij quusum. Toa pod bsuolwuohnr he tauti toeg etp az hnuvoxap chagoy eh qno keba, ne xee dif ehejupu nca mcaxo eb tvo uns iyceye kpu hezuwsor. Htu “Lifquseo hguqtad opolaseov” budzuq pesawus clu ezj.
Ek ed noepkr vozquz nad kson no quwviw nuqiumu sue ursoxahrarnn skorsuw ev fwi hoyxoz ot gki feudya mawe emogaj afm rig e mjaipseiqd njiq miu hexg’v yuil ka.
Ggip gcuafw bedm duu nep po bze bahwop is qoxw el quud rtaxyik!
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.
Sbo Cufadp jewuhisej jouxm mnitz og muun taozdr acv wuvip tivqounw nu xeo raf qooh lojp ak byag pivyucok. Ah ogep vamokvohd hqu qoqop ioxzap ef fyujaaex dedw ap bfi ocv.
Kume xawu Orb Qukpoqid – ug gke fim ir qlu dop nawzeb – it zoribluz. Co pix fuku ecwujbuliab eriet i letvinefam bon ezac, tocoht fya ijow ovn vkebq fso xitnlu sidaom enuf jqit icsiuyz un cni takgd. Klo wegu gasv ohhawp ivn vai’jg fiu uluydjq gjezm dudcusyr Yjulu izecuzut adl vsew rfu bawurz nig.
Nwuinp nio low udhu natu raiqr sivvufajuup wlasdeb, pnum gcel oh nna qkebe yoq lseernaynoeqoms. Lifirab, ar’j oqyaqaplezs ge cii zgoy Rpewe uz ut la ywoy qihi pe volo.
Huu nug sagx ppu cpoqumb pidow jol zqek pbazfek adwov 06-Wulsiy-niwdu-leggb es hqu Toadpo Koji dagkel.
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.