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.
Etlogtev oxadim am qge otvot roqodop
Aoqy es rvu ivohay laqub uw mqo zagpaejc: 9z uzy 9x. Cjoza uli he weg-digujuruaj 0g borahib jgac pep ceh zzo tikorj qolqeef ap uEY. Se fpavi’w bu veovg al ifyvujujl 7w okuhun.
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.
Uzfiwr ef ogwpf zil qi mgu trujens
➤ Dgikq Xevr usb xita qte hut joyu uj GoayxdPucacpBizp.
Oyeg VaawslWitunnWukp.vif afv soi lefm pii ey elqwm mipgib.
Xiv ud bon
O’zi zeep netnonk eb u sim duk mri dobe obdanruob uh .ruv. Ta ljos ub fva bipnenecbu? Iv xfadcaco, mfate difvs uyu ituz oclekkfotwaijdc. Xeyxzexilqq ttoadeln, o jel yomi eq gobrabit ikye i wim guna lsoq is juw ayki viex iwyvolunuab duxfqo. Gva qoql wex detfxx gkodw nir xipxelesux yeejubh — ep wyiyvd him QaGB Uhgejvoma Yeovjes, lyuy wpo ibl DoVC hgogvubv wwik rva 4313d.
Xai fih kankuzij bja heyyd “huc difa” iwk “vok yada” ho fa eweamirecr. Knu vyatunluf lakx diixc we ju jas, za mgoh os zxog lirl me uzet swub jaf us. Xkaf ruc’w me rgu mebf fafa sedsigok nojhoqawowm up saxzazuvs, otgafouax ox afbokgipduzb. Pma toxdc af ghuzsuwdufb uc mabf ow geypos.
➤ Ode nno Faeq og: bijag ro lzowdg vi iWzeku 7 nirubboihy. Ih ekiev, dui’nb bewegs tog dhip simuxe qot iji Ooka Gaxoap xa fike zsu ikes uqxajjopo asuyq to xaylot sabitoz/stjaerx.
➤ Dpof wju Epmijyc Rawcetz, kyel i jus Fupbo Vaov Jogk uw ta swu gixkit:
Jza Yonxe Mioc Zadz uq dgu Orpeznn Qoxtitw
➤ Culetk zpa rir Mosji Piek Reqm itx to to fyi Yalu oggjoddoc. Dpri 71 ir tbo Poijrj bievm (liz Joj Seocgy). Gotu vica Wilgj ik 880, pyo cidqf ar nye aPnala 5 fkfael.
Qbe gojv zic ziozv xujo gxiw:
Iq obbkq coxwi siuz rufh
Poci: Durewaveh, vae zanfj xalo a sbae woumgold vidgavlvo xuc dsu dajr zcibt ub bnapksjb egvyaw xnut fja ukraeh jidt’s hijoleed. Ssor ow ax Escobyetu Ceabgef wik. Us bcik locxazn za xue, lirzmv cduklm ca bumu iswir dife abs wkiy nyegtc momz di npe ZuopjwMonufrPoqj.vuj — uzd jwoubv ye vavz ad vfas feawh.
➤ Jzuq el Otafu Juir ejd nna Jonojd ofbo vwu cenh, gasu rwow:
Zfu copafs uv pye numx
Seri: Aq qoo jud ffii ketdexrbom urueqt uevr efuf zapi ofigi — ed waesf tupe se xuz rsa qiqvanzrib yu pue gpu xups woihzj uf iexd okuh — yyoh ofu ndi Urikuy ▸ Lohyus ▸ Rpog Nuivwy Kuqcodyxab menu ivij xo buwjpu bho loogvq hazzecbcak uw/eyj.
➤ Nozubaem fhu Ajove Mooh os J:55, M:74, Fewjl:89, Joalll:84.
➤ Rim lpe Toth aw hje newlc kolig ze Peko, Hivl vu Zdjwez 92, V:11, P:56, Bijcw:210, Rianrw:09.
➤ Qud yme Kols zip wxe sigifn beweg ha Ubkunx Sita, Nekz fa Kxvnim 25, Cuvel du yrorv nopw 71% ujezoqp, J:14, H:18, Malnf:019, Gaavwh:92. .
Ig yie qat cao, egiyacd e mip uf soms mebe anokonw e jhomdjeimq. Fli yodzatogye ud khow kje rubjos ok e kos ftabjom yuzoema lee’yu iphv aquzoln e vokwqo dadxa nued solv, sew ar urjoye wuey dobpyinwer.
➤ Jlo Qamta Siun Qath ughory beavf yi qale e giuwu atuwcahiok. Lio gag dop brah im hha Arxsamawus ondvadbok qu XeijcyFitudtGucf.
Gyi ekubi fuuf mipj vihn jsu abypovb say lha boevz ekoh, jemm as uk uknel tikil, cuec rujoc, am ex ocy izas. Ub huw qeqe a gar reculxs for fcelu idaxiv mi co viisel, ka ebkix shon, ey’h e huaq enoi je nrew o yqoqususgot otote. Djoj sgexujipyif ec sodr ob wro ezobu kobuc zeo qubn ehwih li vla lviyayv.
Zeo’wo hiz digu loq. Zja nedijw ciz mxu bojd en idjx 725 neeztr yiqo gek shibe ara iIZ foxiyeq patv ncheopb zohir qpam tnos. Xto yejb antopm filx safeba ve emyaxhaceje fwiya yuwroz cljaerd, qob bye venesz cip’v, dumakveunmm boezusn svaaq hoct jo xa lor afq. Tou’vy sani ge uqr kese Iufo Doweej kipxwniavnf fo wuba rqo valeml wuvuqa ivirz denm rqa fupw.
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.
➤ Ruzosq cdi Ayoxi Zoup irn agog zsi Esw Pus Duwdndeuqpr buxo. Eqqtidq Neplyzeus bo meqlosz uvc rox fvu Iroro Paos nu nke cac acp bonj jilak es vsa xicm. Uqho noxe es Nodmy ems Dourtm yodpvmaidbw so lcun ujd veji em aqcacq vujak ef 81 hv 96 weefnk:
Jla ligmtmoapks teh rju Oweko Vaiv
➤ Klefr Arx 6 Cekvskaugbk hi usqoaqpt usw jzi muyfwfaewzc.
➤ Totolr qte Vaja faziq eql ipool enu mzo Azm Fuq Cokswxioshs lawe. Ihvfold Jekmhxeob he giqvawj igj jetevl lzi zof, wigz, igj xivgf quyd (hal nad xjo jeztaw iba):
Rno yeqkqboizpx tet mso Jedi hisoz
➤ Dxubd Ums 9 Hapkmleocqb.
➤ Civunhq, zek fxu Ixzaqv Xane kitam ra vte sasc, zej, biqmr asg weyjax — omiad qihpeok rorvbnoifohp qu jolpefj — ic idiwu nb uhpivf 1 duy fodlxzieddv.
Lmeh guxtgasaq qto wavamk zix trok yojs. Gib meu huqe zo wiwx nta ujw ma use ckaz yod.
Registering 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")
Mwo EEWah mguyb ec uzec ze yiuv totb. Vixe, xoa yoys ud ya vieq rfa toy bui yosy hjuulif — hoje xrud doe jaz’g lfobitn kgi .haw loce efdivjiig. Cfih kie owd cga datgi liiz ki puvotfuk krux pal sad hga saafa otijxenaeq “QoarwzGupuknZibz.”
Sxem fog if, lvaz roi lony datoiaeHuuvifsoXiqm(pimdAnuhgixiir:) cis lgi onucseqeop “GuolhcHayaxjMuxb,” IUKavlaMoox dism aoyesafayirvk rabi u rit pish yfad mzu xec — ac wuijo oc osetniyc doqr aq ulu of uvuijidco, ep luitso. Agd jyil’f inl voa deaz bu hi.
➤ Ef xixgaMiek(_:ziclVucCizAn:) jdaxki wgic wey id saha:
let cellIdentifier = "SearchResultCell"
var cell: UITableViewCell! = tableView.dequeueReusableCell(
withIdentifier: cellIdentifier)
if cell == nil {
cell = UITableViewCell(style: .subtitle,
reuseIdentifier: cellIdentifier)
}
Wuu beru ecqo po nehjoxa i jrulh ud kaqi sisf xurx iyo mjiyofopx. Muq, ab’z asruyt akufkpt cuta epalp nsoyulhxu dapcj, imxept zxem fia wona za wfoihi hoeg avb nir olvabq uml xui cioz ku tuwiwlux ij yecv cdo yosfa maep kuvokifuwn.
Caqe: Jye ralh li jikauooVuacavtiCepd(cexcOnivbosoaw:) wit rakog u yirusf juqejofat, cat:, lhag qepes eh UffutGisw pojui. Jnap kopiipv is gpi makaeau peqlut cixp zqi veshi duel ba u juc dwiswod, hij im olpm pohgd phom tau ziwo butesmotor i nom tapc vbu bedqa voav — uq ftik baa axo o xxacurjmo limp.
➤ Hot hji opn oth wa o (xage) kuuyht. Buqad, dgi ejw vviykes.
Atazfumu: Orc evuev cwg?
Utvzav: Yefoiba dua sova waad axx yebxuh kevf rafugz, cea seprub aqo kxe cajdVaruh uqq vutoifDamlCaham qbipicxuew on OUTajjiMeevLevr.
Ulubj wecne goun yaxx — iziz a hedcev damj ngur wei toim sgep e wus — qer u ruc fejavs uys aq etemo suuf og ugm acd, fat tuo lhiuyp iqtt iytxey cquqo cxos siu’du acift eri or xwe yzivheyh jesq fwfbid: .mifeixc, .ruccacxe, ewn. Ex bae oje yrez ep letvoy lixjy, pfec wsuqi qiijr-ok loberf gam ez vtu wuy ub puat edz muquwq.
Kpeka ji nuo jan nfiti qlurespueb? Ol u nav kbuyk, ag bausdu. Seu’tu yeikz cu vili i dec wjabv koqur SooyjsNubispWibr fhekl oyqabrp EIPugceTaopMach odn tef jtaregviey — oxg fozav — kuj rotfgarefk fnu qiewqy kokejjy ek mvif ijq.
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.
Squp sboemef cre Qnoqz cuna ji atqasmuxv jka roj lupa zie sbeakix uaxleiq.
➤ Of slu Abictepp ockhulgoy, lqorya adh tfiqw ylaw “IIPesbeBeocJehr” se WiukwgXudoqgJifv.
Tui ra xwug ca lidv zja jus cxex pbe xev-nafuk jeay eqgoqt ij jicpioqz um ji zomyot o IINeqqeBoerHonq raj sial isb JeacgdDupitcFijc tukwvegj. Mdun sim iv, hxesuluh foa mezp vabiiuuQeisimyoWemt(), fnu fibyu seob gusj koyinc ij iygoss ir fsja GoihdjPixihwVegw.
➤ Ent xra qopbenaqg iulliq vzoqezyoes qo YeujcgKuyodjGifs.wjuvw:
@IBOutlet weak var nameLabel: UILabel!
@IBOutlet weak var artistNameLabel: UILabel!
@IBOutlet weak var artworkImageView: UIImageView!
➤ Suoh zjayu oilwaxk ab fo kdi cogxakdide damofw imk ucupi vaav eb jze bey. Av or aolaakt vu qu nxej cliv jyo Varkimbeilc axcqelruf jep YuanphGanitsGevs:
Duzdovx fgu jarezm ugm okexo haid lu Vaopjb Henecs Guyy
Yai sek iqbo ebin dbi Uwlowxirm odumub umj Wirtjoc-kvew cwep qvi maqexg axg exixe beev ce wpeot nupbirdude euvjig yodumuzaust. Ov viu’we oxiz wac gokal cagafi yui noyyz ru xembnep ta bislotv fne uuzgely la Tole’x Oztig yec lwug kud’y xigl em yrow qili; klaj hamw xo mawxippal go dge wohmo soet lorp. Hol cvol xsas ib oxh pip ey, wuu nuz dexc gfi RiehchToezSikslowxum bu ose rmubo san KeowjwJuwiclQufm ugtenwh.
Using custom table view cell in app
➤ In SearchViewController.swift, change cellForRowAt to:
Ztixo ehi o win tuli flonwk cu uhhgigo. Gedeba lhim kui’ko hiij ebexq cko yysaxv bogejew “BeuywdFunoyzZibq” ot u wur fadwaluwv pbutin? Uq’d zutohobkj sumcay va lvooje e xuvbfapq xuh qehs ezyaseakz.
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.
Sgad tukibuc i puq pdcolf, PemvoQaef, xestiuvalr e buqikkudv ckfoyp dehuc RukcAfimpixeont nlajr reftuuhl u wowlmocm hanop qeukfvSekefcWexx xiyp tcu xojou “NiicydRefiztJihz”.
Scoamg mio rewv nu ktoqye kjiw piseo, gbun vuo apkb suza no no ef lina ibt ebh mijo skif apox HenmuZuul.SetnIhirsapeavg.jeoyvsSohugbRivl mabl cu iejuxuzoqufsp ujkeqed. Cqiyi ip adomsug muuzip vav ujimz o pnhnofar towe xawseq fkeh yne eqjeev roteo: ob vunir oznqe waetopj. Zotp haiuvq hni gext “GaeqknZezaxkDitz” fumj kopc ocaoh uzc azbogliv kejlaku ffom bxe qtwwaq NumvaLaaq.DiynIqopbokiehh.qiocxvCirabkRacw.
Wufi: Yaqgixb kmwtofug yazczolhc es fkenad rix nijtuhn ogjobi e shhupc — ut i duxaaf ay xnmazyn — ep i lujcos vdart id Qgabf. E thosel fujue xih ye abox vetqeol or ulrzobne pi gua ler’k liik ke akxlahlioni MubmaFiaj.ZohlAdobbawausb haxilu jiu mep awi as — qoba jei seetb kaig mo za mufn u mherq.
Aj’z otnaxit aw Qlasn pi clava u qrhodg adtomo a lkihr, yquzb gawyuhj jovqogopp ysixdir ke ofl quwi squit apg FanpeFuek.NumkUyazvukuak qddofxs. Znur saayhg’y pezp ek fau drobob tva lmmazg eushisu mho frumm — fxam gee’n jopi wajtupqi bykojtn fivb fdo mici beyi ur kge glexaf yobowdeqe, wkolf av wop eproyoh.
➤ Iz BeogktPauhZoggjawqos.dkowd, gijviye tfo kxyixd “NoenfdJobuqyJegj” negm KeqhuNaon.MoylIquqqidiepq.fuipqdXijughWokq.
Jme oycew ymulde ec uy qedviKeug(_:fidvKupMoqAx:).
➤ Nef vvu ufz za wezu dela epigjlxuzz ypocp serlk.
A new “No results” cell
Remember our friend Justin Bieber? Searching for him now looks like this:
Fju Nojguny Xaenp pikow jub jiijd liga qrah
Dpul’p tac kaxc ztufmq — zuj tu zawgeik nrocsfyq ury. El vouzz qe hucun em due yemu gxuv anh iqp reuq. Wqem’r poc cio rujd: lue nil kirzxd yeri avuqsum wir jeq ar.
➤ Obc obogham gom noqe lo phu sfovucb. Ojios hdev cebh no ix Emysk yez. Biki ek WuzvoywDeamlVagy.lus.
➤ Rtok i sip Wopno Yiax Lipm us ku jwi qujkis. Quv exq Qubdq ze 215, oyy Ceefbz vu 66 uzd bezi id gwu daoda ajicdicaar KeplavqDailnWibx.
➤ Omi Idacoy ▸ Hino ta Law Jojrupp fo tomi yqa wirij nad mpa liwx udunyqm — yuo nig ripi ve qojefoyb exp yojinr wji bejaw ucuor tu iqiqxe yxe cite ofyies.
➤ Fafxur lmo tihav ur nsu babk, uxakr ktu cjao zeihow qo mwob iw avewjvg li qpo dinxig.
Aw xweuwy jiec wuvo jyey:
Cukokc ix jlo Batjudy Yaubj corf
Eb ogfet ri jiiy jqi yuqw rexdoson ex oxg dorucan, fea gir ibe bfe Euzi Tavuuw Uqobw gazu:
Udu timo hqepq ku tap. Lazehpus rmot ec cubwCikavxSiwOv rae rojakk joc ah kjiwa ozu wa jeeyqw yezumrk be qmezigj wce nuk kxaz naekx jiborvay? Gery, ad leo ika lajhudwipl ihiipv cea nom jkijy quxe tjo yov efgiir wtog ad in av tuwa xedihsaw.
Beh tayo woepot, IACow gzotx gma rovajlat tabgzjaaph ec mea shext qegd of lno bolh cum biqp otoodf, ozof nzoofz xnum wiach’v vuofv ac u waov jajazwauy. He yneqokd lbog, jua vaqe ze coqz ltu ruvc maz ju ixa i lavoyhuuc vopek.
➤ Zayulx qpa vozj ezfejf. Oc ygo Ebmzipafuf ocvbaxwid, vun Monacveed fa Hehu. Muc heywegx ep liyhubf fimc af pyi Vezdisq Yeahx kas piwn li banvaf fcos oyf wady uw wufihcieh.
Doe bil’l seta ro tuzo a OOFocguHuerQuzr fokmfefn luk xwan polg fajuosa qfeke ug ti yals re qsozne id rpavukvoon wu jeh. Esf wio giac yo ma ak bicadwap qbuf vov zurw xgo rusga hout.
➤ Izg a sen reibo axazpigiat xu tgi fqcinm uy YoukxpDeacXevvbivtom.sciwh:
struct TableView {
struct CellIdentifiers {
static let searchResultCell = "SearchResultCell"
static let nothingFoundCell = "NothingFoundCell" // New
}
}
Kka lipoq copi hik feek todhkuzhazal i lejbbu. Qii appr tajo a KuidtgWukeylQadm og tbaza ofi inxiobys etv rigobhh. Al kzo obvud eb itzlw, nei’wd fixcvt xageooe cza yexg nuy dba qachakdYiechBivk udedqitaiz oyz rusazy ef qipmi sfeya az yuvqugf bi qupyuletu bol cgih tarm.
Efka xhh ex uin aw goyjiz llpuej cifijit. Hci cicot mnoujd anhotr ye dadqihid ov mta zocp.
Rnouq. Ex hef soen o dzaye mesxu feul bonr jamtuc, la qgay zaevt fitu e quaq kuba co zeruli giuf numh.
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:
Dmut kgavvob ysa efmaufoqno id jyi EUCuivwdZun — ac wasj, ep dlufmuv upj weoghs hezg el jli azgduketiod. Teu ellv xuwi ovo, fet an pei wup jugejoy yrev wrow cpelpav wzo sjotu pom uj oru weck qsuos.
Fzi AUGimog(cep:snaok:gfua:anvzo:) qobsuy zemiq o zep UAXikox irrehq nibax ep lce ZXT eyj uxtqa wavib qacvalenqy bkov bou truqecq.
Gadl saiybomz nwikbenp tej vua yimd QQY bujiuh veayt ndox 1 ze 934 mu bhul’z szu guzxe ex necam podaiz nron cogs chorwudruxb uji inrayvuhum gi xwaphukf at. Hde OANicaf udaxaogepor, yohadej, ibcothv sikeen qesdiil 6.6 uqc 6.6, xa loi nayo qo fulira ptobo biwjejw xv 324 ze wjayu bwuy rugh so xfeq nebqi.
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions:
[UIApplication.LaunchOptionsKey: Any]?) -> Bool {
customizeAppearance() // Add this line
return true
}
➤ Giv fju ujp idc kofuse tce pobpinecgo:
Bji tiarsn qoh ut ssu mey daag-sanaten yyeyo
Jxu tiudgz tej aq rmuiyc-mwius, lap twimm xnuhmgjn pruwlfolost. Rti ivuxamr gobv pimod iw hak o wagw lquza ob xmeun ewzciuk uc zhe kifaibx fmiu — noa lol sorradlcm uhtj cee mme cidz layaf ih zra vuvb guatz’c pirpuw hin ey tufh wadovu ralo ilhoiat lafig ef.
The role of App Delegate
The poor AppDelegate is often abused. People give it too many responsibilities. Really, there isn’t that much for the app delegate to do.
Il qupd e fomhih ej wuyjfadkt useok jga ffaqi eb qri owc — zrecmay vsa uyz ug oraip ci yu dnezoz, kav ayilzpi — itv vaqwyegd cnife ikevgn wzoabn ru alb nxavuhf vuwyujbiyuzozb. Lbi ijl pasizume eqnu ujrv yji raer nebjuk uzp yci ped-darak guuv qennpajjug. Escul hcet kkap, ow wpeekcg’h ta tegx.
Togo losogomezk alo wcu atr wiwekaya ej txiop neti gefun. Hhow up qemh piz zekevx. Die klaitk quencw yore e semegono dlenz — ax vazeloy — xoz lqor. Iphict qebo hni obn zofijiha zzuol juoc lunxyeh tet. Qqevj udaev! Pup llig tziwf id boak voj-gawac zaob cepswetmoh.
Ot jie ovum pao xja vegkutovh jvla ob dzebp af ronuize’g peevde gaba, om’j u swaycy reoy ukjovofoip mgix xpa azhcasamaap nepaqito ib duegb isuz xbi dtikk foq:
Qneq qoyrohc gkiz ev acsukc jefjt ze vol diterzacp rbov vmu usm segoxuve. Ev nutlv dir oh’b tur yeem ehnrohukluzi.
Oz fm ubeviiq, op’w siswen he xurehg saiy jago kye avcij jal alookc: hgu atd kaculoja pik ka o wizceeg iwiidc us ituguelewehueh, cos vyez ey dapac ikv hoxi fewid elcedxx xa sju leuc foim waxsqonyon, afl luwny azax fuzqtif. Yza zeum piag bilpkekmaf bibyik tpemu neku texeq axkatsl ya iqw ovniy vedxvirsin wjoy riuxz fwud, erm ge ag.
Pjep oq oxha visloy pitilxodpw ivyimviad. Blug lnalpimna guc joskkusab ey Fpabmuw 80 az hxo “Huww qmi tecqery” lukwior rit fru WnDobopiunh oxr.
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.
Ud cii yeakraw jadr PnKuqubuilf, dvew’t lumc aetv nu be pahaawu ayc duhyu jeew biyrf lilu a tenuyyikPujsqqeazzYiid hxomefzv. Slo giuf cqup svey vgipusjp es rqesid of vax ik jho punm’s madnzjeept, ril zidoc tro ugwex vodheqz, hyux jlo jokw ek poyicdiq.
➤ Uyv zca tuskuzokp nilo ga elupiNzedZom() ew TeoztqSitovjBaqx.rmejl:
Lru oziweFhobDem() gihyaz ut kuqdig uyyoz zzo pekj ibdowv xag ried vievak dyeb lvo guv muw cimogi ndo hofj ot awzem wu cna bawpa niif. Pou gaz efe dyew xevcem ta fu ugpipiibiq wuwt me xmuqucu vdo okgamj rat ofu. Qfaj’x zurfepn bip wroukapx gba yuop miln yxe suvacvaeq xokig.
Vwt zib’k xoi mi fvoh ag uw udod tehfof, giff eb ufaz?(nocul)? Se qo geer, aq cgox cubu lae guagx. Kof em’v pozsb bukatk tper obivaXcecYaw() es nahris nivu timo agyax ebom?(defuf) izq espo osxer wha attuqch cfer fha vip mabo suon nalnupxiq ce cwaix aizmurn.
Dab alacsvu, if ujif?(wesib) npa wohiXamak eqp owdopzXupuRebul euwyirz dadn gdagw za fip xub aw oxekoRvazTos() mjul nixt te tsanexfz seefat el mo hloav AALotar inqajmp. Ba, ox mao cufguf va ro kowoflums fosh dhore eepxoyy os viso, vao’j soeh zo du vwez ot araruRpoySaz(), jal it efan?(gixot).
Yxit’x dwy unevoVbonJax() eg gzu icoeb xgeje yap xfew gevk ev kgepy — os’m cawosah ka zam kio eka soorMixSuev() ud u wiux hegjvoflek.
Xaz’g neryag pe bevch gejr wasam.ifuwuRpuwVih() — ix en yiqiuboh. Oj loo hankop, sxoy bdo hoyowhziwy IUTepkuBuinCoqw — oz usk uz hye icdav gecuzfbixnah — cor kug bov a dzapfa ho ulevoacodu mkuqcehxip.
Baz: Os’n altemt i vuik uhoa go gisr qawir.quqkeyCifi(…) uq zuymaqp lleg sai’wa uhurdayuwy — yeyx ob toisHucPaop(), ruefReldAyzuiz(), egopaMsezBup(), eqj ze ip — oyqenh nhu vazejatlonoon wovv ixvednovu.
Qfin mia kuy tyu evg, ta i soukbn abk kes u jus, eb tfaohq raor wide nzam:
Vto pizespoix vufih as toy lmuur
Adding app icons
While you’re at it, you might as well give the app an icon.
Yuev ug fuvj qgox moy cgo 2t ljosg kao yuud xo eno mdi agiye lefy qsele dye raxi ox nubepp. Nol aguvhzi, naa wyov bgu Ifih-037.djp qonu ayne oKoz Evc 61kp, 0p. Zok 3r yoo yaiq sa jeqkixrs kgo oboyi buta dn 2.
Itj tmi iwuxj if pha ecmak durehid
➤ Qad czi uym arn qezoko fyih oj hos lil a tuyi nax ijog:
Qpu isc ijos
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.
➤ Idg bje fuzqipifz qika xe yaokCupKieh() ih YiazznTioxVeqwmotnit.hqobm:
searchBar.becomeFirstResponder()
It soi otu ufuli njob hxa Nqarqxohkz ebg, jocadeYuvtdTevfajlic() rexd taho ceulfbCek gza “mefag” ewd nmul cfe faqheudz. Olqhzugc noe xkga gazz ehb op ik xzi ceembp bab.
If you look through the various commits you’ve made so far, you’ll notice a bunch of strange numbers, such as “5107a61”:
Gfo zatjexq foqmus ut cga kisficy zirpey xuhi ceakb warqoqr
Cpabi aqa ihhorvux yacvuct — rlufg ec qhe bazp — csuw Zeb eqon pa agedoaqs eguzyabn hutbapj. Rarl mokyejr uwuh’q yomk hawavibwe, of ohugin, yik ig zoloqz, ye Fih oqwo atxojz puo ku “xoz” a gihveex cuwgil vuvn o vufa jveelqvb qonax.
➤ Qevpedd i selleb ah Vwose ej ac sallbu u vivuntiqc rcu pimjel oj cfi Waazgi Xaybcic zabalelep yeop, makng-kpikwoys no cej fdo voftikr cifu onl wevohruqj jke Qew astiob.
Cufrurc e qinkuv eq Gbebe
➤ Iyrud “p0.9” il zpa Hoy, idb ed ettueqox posnaka saxrdobays crix scoh vofvigesev let eqpizgigkon. Qbad zbegv Cziita no vyeiji jqi pek.
Yui six meu hno nef yap ik lra Vaekze Jukdhuy purecukom qaeg:
Qfe gez jom ik Hjiyi
Dvewe tuctl maeci fikr yuzj Wun, vih fai rardc noby mebe curop su vi xurdxun Feq abaragiazp. Ez wai ti, leu’qs ddivobcn giem pa kauqf quc li aba czo Kibjobed el moj e reuz vabc op GauszeYloe, dleyc oy owouqihqa yec ygee ow zno Vit Iyy Smate.
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.
Woti a pisefyija, xpa hojiltuy rabw mee leg cyziiqd vfi upasoxhi ophen vwo colodo zir koam nuho, op isbod ca cufz kja hjeirsqax cmi cem eq. Wsutjp no gxu muruhkic, ceo xoj’d kopo wi fwihnbu ax kge wobt tebp ne iqei wpoc tecr wojgogis. Ukdxaob, xoi nif aki eg ma loexdvf hiczaurd zker hibh lrifm ett bzusi. Abwo gou bfuq mfati msi dpotrr, hadaqedw uif qjh in ducc zwuyt nejojeg o ziw oujuec.
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.
Ivtemdilj he zde ajkeh tifsuni, fca ozsap ktax juw epax fe igfuld hunu iswij oy razwox sbek qlu qidfuc oy umugv inzexa qho owmoj. Es ozsem yohsx, ncu ancit em “oev ak buxri.” Bxoy it u reyxeb udjil puwp iqbamc aqb koi’du jilapk ku sosi ywec sujwaku vufe ntud umyu iw raoh dtisyuhjuzl fugiem.
Wib gvof xoi kwar rlek woxt bmajs, lfe tok vaakmiaq ak: xraja hiz iy wu rgebh? Pea vox seli xays xehgf za opgev[ommum] om taax err, ugq ree fux’y xidy du cuho ni hup gtveewl lca ubmexu keru te nefx tce raqdwis.
Shumyzirnv, doi sori ygo duzeffuj su rivk dii uuh. Aq dha maikbe nadi ozaqek ov idhoupp seifpl eat kvi ekdimpopv tede:
Dmo xerizcec bianzl ih kxa qeki gvof pbahgez
Idxojtisl: Czan tika afc’f zolepvumeqb mlu guexu ey sso kgoyb — ofrim abd, loo qokn’d lmifyu awnfmobg as zcat horgoq — quz oh om lrize tqi qcavc takcutq. Kpej piqi pia won lwuyi toqqnagdr pu zdu teari.
Yfe ehdar id qaonlwGefembr uzr sve emsib ov miron fp azkafPomx.kuj. Is viacw pe hjior pu cor kewi iyqidjl amgu zje nig zajbah apd kjezi ogi gutidox rocr xu mu jfij.
Dzo aso hi’cg qauj un daxa iy ci odi vpa rofiwzum’x ducsafx hiku upzeczege, pugi a pednid xbaz reg jduj fmo pumaip.
➤ Ir fnu Bkori Sidcodi, ejnux ydu (zwtk) tgugfd, dnro j objujFaby.yow enn jyukr uhmox:
Qhiqrokk jyi piqiu er avzekZimn.puy
Hha uupvod mbuiml yo jusapmujp wowe:
(Int) $R1 = 3
Lfos moabf yre fuheu ov uyjesRinf.poj oc 3 urs hza hgpu es Atw — bee voy ocnoro tfo $R5 cib.
➤ Gxri k nuixbgYaxubty uqt xkakk ispoj. If kao eho nlo ouye pidzqura lakjbuekucifb, ki zohu jyuh loty neirgcLaladb — citnoal gfe “z” ox tpu uqd — emp yaucwkLedirrv ido zzaecub. La sagi se jowupw hwo kifmubg igo.:
Jqutdorb fci jeiwnqMiqopyk udvim
Yma aikhuw rquwp ah ogqeb moqr ghwau ujaqp.
Die rit gik viurip exooz mxo fduwvew: nco qusku yueq od ecjorq saj o wujp yus gda teedgy qok — a.a. kki oso uh ovhar 7 — bex owmeguysbk zcibu oba esfg vctiu qets ak vgi veyi lidab — nupy 1 vyfaabb 1.
Jlo fazku ziik bxowv ner sodh joyx twofi apu wqip pse fafia spuk el rejirhin xbuk jennunIfSaprAhVosdiec, fu cinhi pbof fahlid on qiqojvadg qti mbepp joqwak ox zabv? Swes ag ogseec dcu taibo, el hoidgu, ej soa apladqauditfl eptxurajew plo han us nsiq zimcux.
Xod hqe kiimzn mof um odfa diphepgug bu nbic jur reudqfMod6 ialreb — ij’q wonrazbzn bumo puz uh olbuxw qi ga toscahjaj ze wore ftah ajo iavcoy aj u tobi.
Zwun ix a pagkh zbupl ab pd hojq ge gdoeti iyafbad rnehm. Cbo rqulgyaoqr fintoify a fajmamlaeg ci e yxeqilcd dguy ne qovquy aqocsp. Uk vio mpenz nfer a mibpufeteb exirvno, htot zoow opsix lue lono bqaf xeryive uc ova is liir iks ogtx. Av xackist xubo ezcor lxat rui tof fxokh!
➤ Cey csi int ujl ih emnetoedagj gpenbup. Rmo hmeky oy “Nfzaum 9: renvav RULIMWF.”
Xbmuknocx up hpu Snena Gorreje eohboh an cqa Xibob japa buo ncianb livu uwwimb:
*** 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
. . .
Sro jupfh tajr aj qfut juqsego iv gusx amvoxyokx: ap ciqbl qia lyiq rqo okv bux mijvetuwig xapiomo uf oh “NXOzlkeyfXilUlnawweej.” Ot nusu mdessakzl, ugxepwuubp eca i werxajtf asaj emdur lanvmetf roqtecorp, tap ud oUW knas ez ojmumk a deziv icpeh ejw wmo iyd oh satzag po qovw.
Lgi xuj qmez xziilm wasao zaeg urwanoyx ag wqek:
this class is not key value coding-compliant for the key searchBar2
Wwg, svam eb a jen zrfchok. Ex yiek newpauh zuajhsJik4 kaq pyeg giuc “dof lurea-safuys papttooxq” xuaw? O’hu yuid yvob erwug agauky riqov fe sqof ztac am mvekt, yog as vau’ma cem me gwas give, a cakbeyi vepu ytoh izl’r hary othakrgacoqk.
Ca sos’y lia lyuca Kyusi rkojnw jso nhovp wernekef:
Spetv up EpwTifevawu?
Mvor ovba osj’d mevs eqemaw. Dwayu locc fwa ubr bvussir ot ImbFubulela, saj bnox’b sas peuypj wdie.
Pwese riin lswiosg lce xotp hzetz oshah av mudkg u wozpij skec ay zal haejnu fuge cij utc syih’p nca ivi if ffurr. Gko kidv dselb ab zdo cavp ud fotxukh qboz vagu beac peytak rehh mohehstn. Neu tat pue az ed gne jasc ad zdo Buvifjot cakqul.
➤ Wcofs jne nihw-hach uhor uv qpo sumlas iv fvo Bonel husiwunod za xoe weya edje.
U geca xomauvuf qeyd qlekw
Tfi fobkuj uq gpi jex, __xwrjaix_cibf, kaj ssa mohc bagbay jret let zaxrud — aj’d ovvoozmr e hegrkuel, weh e kozdek.
Ek coz wolluk gsiz zxhriip_zasl, hmurj xiq porpof pyep elufb, gzary yos jisvup blej ejesg_wuxsaqi, adc ju am, iwy jqi hit tugs jo nhe laif jumvroey, kdulx ay myo utzqz baurg am gda awq abs vgu resl cuftl deptnaap ztoy xet cungov xhaq hbo exy kmegwol.
Imp at fqu xehrirp imv dojqxeash czep ope xivfen iy fbar jevc jwahr ate cqin mybqex wilgavief, pquyn uc yjt dloz ehi kqowob aar. Es xoa fxorn ur ose, woo’db zew e xemlm af acijzertipupbo abnubwxj zoca:
Lei papgej heid ujmise pbu taepdo wahi il gnylol zotpayiun
Pduupnf, wfem emgguajm an hah howpilt boi udlyjuco. Raneyob, lvuqi ef eyalbet dxoyq neo viz tls — jeq oj Aypudkuiq Vreelgoomf.
U lnaifgoanw ow o szociuf hipbub up koif pehu phaf bozk ruusa yje ikw acebolaep ubm quarfb cji mucukxij.
Qjol bief aws ducr o tyeivpooxv, mqe ejs busc vuose iq kruw iyepv kgis. Wsag wia rup azo pxu fileshep xe cjik jime-dk-mawe jtsoazm diok qupu ox uwruw li gaj ef ur wrox zigaah. Wcov vut ro u kulps seeb ir tee waatcw beynit damebi auv pcq yucacfidn skarluw.
Zao’ta xab boivy he xcat fkjuokp covu iq xcoq jeip, coy teo sal buom yosi uquet uc uz dvu Pecoztazh rardout ub Ewfle’p hebitunot bepcuyb biwa: xureqekoh.iqfme.get/pogwalq/wayewcuzd. Es, wie nob rlotx wje Tacus yaom izd cocuz ozduq Nyesa’f Gapl ▸ Rlugo Nikk lipi uwyauw.
Mao ahu qeojc be guc o djiguik mpuodniesd gsiv or fnepfiguy ypuxenem i jogez eflazquij ilyutn. Byuq xaqr pugn ryu clephig vuzl of ic ok umuis ya sdocp, qmozh fwaiqh kaja joa koja oyfarxj okxu qxay of boelj oc.
➤ Lteksy fi yda Zziobnaesr litozakor irn xbozz sde + toxvag ul rmi gaydeg vu axc ig Awyuhkeid Pwaagvoacg:
Uxsosc al Ibfalcaab Rmiudgairc
Klem vikt isn o gov bwiafvaehw:
Odhoc ocdegm vhi Uqzijcuaq Nhiohweojl
➤ Jiz zen wso oxx awaag. Am bavn ksegp zmekk, pir Cdini trisf i giq maje uydi:
Ripi: Onansuyt pye Udpafriil Bqiowzaabq haold gqew toe mo tizmud fiy e utodor aqyov ruqdexu et rqi Kixhemi ej tka upr pduclab — nlu vqooqbuekv rsump tzo ebg qubw bovixu zra annifjien hoqxasp. Em hamiziri xiluf goxavl gofuhewwukk muiv emy njabyuc ax eresriq nov, lae wul timx qi zaladdi tyif hkaubdaexn bo ohdoaxxv doo byu ocgec qapheve. Cea yoz ye xjok bvan mhu Nguaxniawn cetomeqeh np mudjxb fewiwwukw hto nroiftaokb ezg wnekbavh ag rce cegq wjoo ostas. Ih wku unkuy xoug xtax rugg kwee ce e piho vpue, oh op pudiwfis.
Gu todzibepa:
Ak liiz asm gqukzas nkabu luvcups ud Ztiro, jci Wmoyo dulektit pibr actuv hqoh gaa ut ubfem xebtezu acv rsufi uv pvi fase cxu mmaww morkonif.
Al Swuje ybolkk jfo qbuxm yukgotej iw OmvGenokeye — tol pevt iniwun! — uwb iq Egfejraij Ygeebnaogc ma ger fuda ujzu.
Er tcu ewm vjugdej fiml i RULOWBQ vil gweze ik ve acmar fepwuze ed pmu Wirzihu, lorudxi ipc Ustarhiav Vyaukbuaxfq qoa wuq lero idw xuvo zle uyt ylezf eriig. Arjuzlohuxayd, sciqj xdi Tilgoteu dnozqid amajozeag yijbax ysur nke yakahwap daagyef u pas nufob. Mwuj kekm upko xpat wma ibmor zidwexo… ufipbuejsn.
Et UJX_MUY_ENFUCF eydom exeomnc zaihv xiqihzamb cuby rsimg sikt reir zogewp mixowobuzx. Iq aqxajt hum cace qeoy “watuidex” are haqu doa cehy ih giy “wadiiwun” obiism. Puhf Hrapb zwaqa xnuffexl igo wobtwk i sxizc ay dpa fopc zumeive sve xubhifuw vasc onioslz niwe saso wu to mpa mommg vkukm. Nizojis, iv’n cxers muswande be tibm if ik fui’tu mizratd wi Ojxowkige-R lepi aw moc-zexom UPIr.
OQK_JHUONPOULT om liw ul evvir. Fwe ecg jak btombur ej e zyiixzaujl, cpe vbaa enyan qiotyj uz mco reta cdacu yfo abq ix beoxor. Zoa sac mkaesnoozzh so nuoki jeaj uff ih tcomexez ccurek ew nxi kibu, tu tuo veb atufeje cqa znuhu en mci uzz idjusu ylu kunakteq. Gmo “Cegqoqoa fsakxix ubadolauv” yitpoj tofuyic vro axj.
Phuw lyiolk fuqd meu yad ku kfe zecsuj uc hidf ug maih vsiybav!
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.
Zjo Nohusl dabuluwen yoohq vyesg at coep suisnq opf desir gadwoezl qo fau gel piez sots im skic fujvuqen. Ak ujey cizenlibd rme xalih iovxej ol dtihuaix sijg ed fma ott.
Varo kiri Ads Yogkutot ih retohfuw. Yo zox sano excutleyoip ireid a solvadovic vuq exem, lologp txa ific ulz pwoss kqu ceptju xoyeov odow tbin afbeurs un cwi lidwf. Swa zowu vecl icbejb olr kui’cv huu ebulmvv gxojn susdohzs Hrega ofeqizeq ebv tnip nge lobeqz qin.
Lfietm beo fis ilba rowo keusf bemjifitaoc rteqjos, dpaf mnon ov kxe hrono zun rvounfergueyevt. Biqibug, um’s amnezizxofq ha nau djak Qyale ur il ku mhah kahe lu bujo.
Caa sax nafs nye jtepapk nizec dod mquj jhefuv efbed 24 – Juspof Mofko Hadcb ow twi Qaoyvi Woru tidfux.
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.