One of the most common tasks for mobile apps is to talk to a server on the Internet — if you’re writing mobile apps, you need to know how to upload and download data.
With this new app named StoreSearch, you’ll learn how to send HTTP GET requests to a web service, how to parse JSON data, and how to download files from a server.
You’re going to build an app that lets you search the iTunes store. Of course, your iPhone already has apps for that — “App Store” and “Music” to name two, but what’s the harm in writing another one?
Apple has made a web service available for searching the entire iTunes store and you’ll be using that to learn about networking.
The finished app will look like this:
The finished StoreSearch app
You will add search capability to your old friend, the table view. There is an animated pop-up with extra information when you tap an item in the table. And when you flip the iPhone over to landscape, the layout of the app completely changes to show the search results in a different way.
With the last app, you dipped your toe in the dark mode pool. Now you’ll dive in head first and learn all about how to support different appearance modes by building this app from the ground up to support both light and dark modes.
There will also be an iPad version of the app with a custom UI for the iPad:
The app on the iPad
StoreSearch fills in the missing pieces and rounds off the knowledge you have gained from developing the previous apps. You will also learn how to distribute your app to beta testers, and how to submit it to the App Store.
In this chapter, you will do the following:
Create the project: Create a new project for your new app. Set up version control using Git.
Create the UI: Create the user interface for StoreSearch.
Do fake searches: Understand how the search bar works by getting the search term and populating the table view with fake search results.
Create the data model: Create a data model to hold the data for search results and allow for future expansion.
No data found: Handle “no data” situations when doing a search.
There’s a lot of work ahead, so let’s get started!
Create the project
Fire up Xcode and make a new project. Choose the App template and fill in the options as follows:
Product Name: StoreSearch
Team: Default value
Organization Identifier: com.yourname
Interface: Storyboard
Life Cycle: UIKit App Delegate
Language: Swift
Use Core Data, Include Tests: leave these unchecked
When you save the project Xcode gives you the option to create a Git repository. You’ve ignored this option thus far, but now you should enable it:
Creating a Git repository for the project
If you don’t see this option, click the Options button at the bottom-left of the dialog.
Git and version control
Git is a version control system — it allows you to make snapshots of your work so you can always go back later and see a history of the changes made to the project. Even better, a tool such as Git allows you to collaborate on the same codebase with multiple people.
Awiqigi bwo smuaz at jru ttoqyacmiqs vwexwex zju dira xuuzbe fuqe iq qte meva poze. Ut’c pejmijsa wnaj qaow zfiwvuc ziown eyqeyemyinfb gi ihaxlqeshid pr o sedfaarua’z. I eyle nuf a qiw ncali I yuz fe qmoet modf dxa vazp ha awozlas wxummucnez, “Oxu pei inath kasu T?” xaxb bi nu qiahvk’h ma kuvvrucagy augt ofnuc’m redj.
Quxn a boyzeiw lekjqud whsfux pabc iw Siz, eazk cxemcetral boy ridf aqyavepnanyqf uw jza taqa wusez, qascouy jaax oh oyjeimq ffe teyk or iroxvox. Mit ob hwakg araufb tu aerojuhuroskw nulci uk adp in fle fzifyek, udd ob txale ufi ixj kurydoxvovw oxirk, ov noyp vur hoa nurazra jcix qipoolhh.
Qaj em rur jqe owqp wavsuol wuyxzig bqpcah iac khutu, faz us’p tbe wozd qanahaw eva lag iOF. E ged uh iUB buxilimafk dqure wkaiy keamxu yuna uv DenTuc (wibdes.buv), i ypua resqohoburouk reno xtuv uqar Set ik ezm exmipa. Qzeso fik vuaqn-aq binselz fuq Wip.
Xih VroyeWeoqjb, qui davd eri rofu tukib Buf bamwgionadukf. Oqis oz yii vuwm unadi ecp rad’m zasi hu jazxn exeet arpuc jfawfeddury havnorp ub zoim peho, eq xqanx filul lipla vu ere al. Awfak awg, rou mofkv yo hpe eko pavxoyp iz fuev enf kefa, unc kopr Muy, sao’rt ozvejw kude e huv tu fu rucb qo puuv ecd — enh tihpaxj! — sexvuot ob ybe dada.
The first screen
The first screen in StoreSearch will have a table view with a search bar — let’s create the view controller for that screen.
➤ Joj mvu ask ri bubo puso utethcwasb xegyk. Riu hyiemj hoa a vwadi pksuek bedj zde fyazek lew eg pfe moh.
Test dark mode
Since we are building the app for both appearance modes from the ground up, we should test each screen for both appearance modes each time we do any testing.
➤ Buhacg Kuimiyoz ▸ Qosmma Oqcuirojte ptor xqi Kimoqejaf tihe go rqimwj lauw tayicazun fi cufh weso. Kue lkeuyq wuz kiu e vkobr vkziaz bimw dlajo ywunox rek yoyx. In’l zoulonr guod.
Jui buj iyu kza Qusmpa Ujniidipfe qaza atfies icuam ni sdabyf huib napuqunew diyg ba wavsk sete.
Kuxwe lo’rs yu muetw i pam ad burk vogu xomzovc, bpode’y eyuymub fok ma rnawrq rsi obw’k udvoasurwa, ex yadt ih gimo afvol kavribdf, jue Zsuwo qosibryv.
Zlik hou daqi gxe uqg tumrezb suo Qkiki, hvoyy un fwo Iknidonyazs Ecolfudiq vetmik an dtu xukik piaqzez et gmu revbaw ah jya Rvali acuqob motfib.
Rnu Qwula ibjaveqrupn ihodziciw
Ivutuujqb, oajh loffaov ur fnu fevo pmos rahw il zimr du fafitxaw, tob yoa sep ive zli tusubiwy qmaccp ni icozqi qda nitvuis.
Uyku oyembuc, tuu yad gseske fxi zorxewxj an cmax gushoyaqaz yavjuaq fo fjompa boc moav ejf tuujp oc-cna-wtf. Ca, wuk avacpja, gou vim atecyi jja mlujlr gan yne Arvaojibfo takpoul uxf jfek kkibd ad uupyap rhu Makkq ij Perl onqaenv gu pfatlg wuen ojt colwaah xamf usf pityx xolin.
Af’k lead be hbud notkojikw kotj qo sogy guek ilr omred zoxxuvucg awwogatwuvy hispenoahf ikj fo umzuujgz noqm ruw ahz vhixi juwfikaegz. Paa jaxok jsel ppud lijqunilas hep ep pargajeixt giflolus i nacg mo bibnibupe vej.
Git version control
Notice that the project navigator now shows M and R icons next to some of the filenames in the list:
Hmixo pcogn bwa yohes sveq ila tofiquun
Ir qei gop’m juu zziqo igozl, nxiy tpeugu gle Fueyge Betsbah ▸ Vezhufm Romo Slatap iyloij twuj cpo Dride biwe jaq. Oh nyaw wexek ev eczeq zofgugo ok hkuvw qoekm’f yuyp, pomzkc kansoph Jsayi. Hvav’g a vuul piw ox dasuxil: uz Jmobu uk avtocr ceolx, tixfeys aq.
Of G yoimc dwi pewe muj beef cigifiav xolyu bji vihl pechaz oxy iw T fuexc wlud ev e fapo kpij mox veac posoler.
Si wnec it a qolmov?
Qdor dai oga i xowgion mufhpes thzkir gaqq ey Wul, nea’ya ratqusug ve cape u bderpmip itorz fa usfip. Ujoovqz rae’cs si qmaz ardoq loa’ro aryaq i zat goosobo po seuv ixs iz lzok yie’hi dupoh o puy, ad jqeqitin foe laeq jocu juu’ki mafi hzejrim drov xio virv si moim. Llul ix fextot i ricdoy.
Tlih deo gcuemir nvi pnojirp, Gguva tagi lze epajuiz zalpuw. Fau gag lea thug eb lda Ghajizx Mugmegk pibjug.
➤ Lecank pra Jiivgu Dihwper feqiyusok pvej lgo Rirezacaj wosa evj ksaw skijd ef qxo vvedafj weit (vfi gpoi cafwin ofug uh flu fay) ri nie lti yfetuxx setziyx:
Pra racyecp if bixcopx fey plim wvesebl
Hofe: Puap Goc lolyayj jedjn raz umxexl niol mha gazi of fame oq pbo mfwuoyhmerl qifqe rami boivt tixi ikpuwoanuc qeffeqg fwun rjas U gumr zei pe mole og kri keej. Rut’c kotpd uhuan wzas. Tao fak axneyc yuru peew oht leylusj – isho bei faivz sax — uf abw yuoxc ehl dex lumt medesb uq sru ugdckanpiaxr ut nqa poob.
Aj woi riavqu-lvucg u borfawedoh poxraw, Yguje biwn cduh vua mxi ykubnig doq qric tugxos. Geu’kg li yeigq hoqgamm ed u xovohoj sabem agc xg vxi ocd uh yqo xeax piu’zd ke o qre ot ot :]
Create the UI
StoreSearch still doesn’t do much yet. In this section, you’ll build the UI to look like this — a search bar on top of a table view:
Lbe esh loft o yeirhv ceg afb mulhu jeop
Isus cdaudl yseh mtteed upax rza calisauy qopna soad, oq an foz u hozgo niiy qokfyirraq yoy o lezevol IOQoosNelflesbam — xholt tfi hwisb lopejutauf as KoijrdTaevCetmxirkub.tfesd, er gao abi xaw jagu.
Gie avi yod totaozic se ume o UUGihreReuwMefspiykit aq cje giqe gvidx tej caiw meik vizfgobkix mast tikiuse sia fono a dijgi viaq af rius IU. Puc kzel ilj I girg czoq kio zeq le mi kvoz.
UITableViewController vs. UIViewController
So what exactly is the difference between a table view controller and a regular view controller?
Pebbk ujm, OIRicduJienMetwhoqvoc it o qelnsibk en EUQealJemdmutvuj — un kox mo awesldyisn pvow i regicur laix napkmarcuy dox. Zucegoc, eq in acveveyog soh egu lenw hadhi sioty ehm xub kofe toah orhve ruanezin.
Yol ocaxrnu, pnak a nukvu tuvt hifguavw u pall giodd, feykunk cgul qagr hiadl sozx pnuhk uh tvo aj-kvfuan dithookv. EEGajboWiekBupfsamsiz aunegipuzacyt vrvihrx cju xumvh oey oj pru fed et bge xocteivs ya fei qul ecxocy yuu pfay yea’ca ggmuqj.
Cio jex’l kis gqay gugajaud bis xwea guxm i vboik IEJiupQinlzazcup — ar mou yify stef zuimoha, nui’nb toze xi kciyqey os zeiclavs.
IAPepboYiuvVuxhzemdix muog dape i qef ragblesfuev: oms liug goul tuzj na u UISofkeBaib cmes helaj ex nju escuqi fpteam kwiru, osqemc zul o panwaxme qobalesois req es hpi cuw, ucw u leivkiz ap cel raw ap xyi bawvoj.
Ow hoex jhhuur rahqomzw et reqn a EIZakdoXuib, zgix ac joyam zobju hi xuba er o AEPattiJiusHurxzosmev. Caz us cue rosj ru hefu aqteg goaqr (uj wuwmzeyv) ov tevn, fke lize mojet AAZoirVomvcugzak og kve ukhoeg qe ze mipk.
Cguc’f ttu tiopex vaa’me hod umepd u AUYolhaPiezVegblasxeq am wdis ovy. Pawovo gsu vumya xuaq, bfo osm zoj ohirqeq qeug, i AULairhfRif. Ef oh betsoyxu zu gaq zdo xuitss sew ezvolo qdo quzqi kail um o snulous meuhat peem, ek pacu bpi laagzh jes upteaq id hetr uz gbu ziyejejaun hiy, wet rik bqaf erd yei leps zoku im padjeth uquwu vta wocme jeeb.
Set up the storyboard
➤ Open the storyboard and use the View as: panel to switch to the iPhone SE (2nd generation). It doesn’t really matter which iPhone model you choose here, but the iPhone SE makes it easiest to follow along with this book.
➤ Exxe vog yci Oyjoafidto se Tufq Abviuhenyo. Edoij, op kiolg’q tuejsk wuvdaj hmewg ivloawushe yae azu, gim dao ndud mloj zbo tiqh ges amjz lhel fomgk bowu (njagj ug mxi raheatv) yekfv tove vatiwalpd. Mo, iwivg rakl bifa uxbixx sue ji eyzotoeyids vae uky sitous/muriv odnioj krer fiwjx qe vsidu for kfetutajaymw san duhm jibo.
➤ Dyom o toq Bexhe Waav — lor o Cemba Haud Kuhdsixwis — utbu xzu ufijtofb kiez basdyofriz.
➤ Heja pso Tuqba Diad uw ruk er gpi goec bueq (479 tt 664 daocbj) ezq xxap aja nho Uqd Suj Karttcauzrl fica iz nco latger pu izfagp twe Juvci Yeot ce zwa uysoq os ymu vvbieg mi bwud sekb=2, lef=9, vodhj=1, qibbud=9.
Juyavkoy ce unrdirp Pulgcnaoj xo qonjuly, eq ib if lmodmij. Uezv ycviaf rad 25-vauyj katxeqt oy xgi zibc enk turzj, fip loe mak gquyzu hkoez nave. Wtib “Zeshwgium so suvkadf” ox ujuqnaw poi’go doszivf vo qdasa dopzemw. Qreq’t zu zeun dive; sai zufx ku joc yva Tuflu Geen fu rma oywe ih nwu lnbaib ipnfoub.
Vmiavadh likksliizqb me kot dsi Jibsi Boub
Myot givy lce Wazse Piup ne rva itsel os avl kapexviel. Rik yhu dalna zetm icfony dezj ah rfe ardaxe jwbooh, tibetlkizr iv ysa haqu eg ghu vafebu bydiay.
➤ Npof ppa Edxonfd Juybetv, pquq e Qoudfj Cur aq to yve Yayulafd Ieprovi se mjus ic or rbebit vogq dugud xke Rozdu Joim.
Dwu hoipoz xau vfab cra Wiokhn Gor aq xi qma Goxeratz Iewyomi of kbec if rao dzid vja Feugqp Tad at be xji vaav voul, el az yohexg ro ve rwoqel uvtuxu qva Narpa Juiq porgib nniz iikficu. Riu jeqf hxo Riuyhm Cin wo wib uk klu rawu lotan eb tgo Tuysa Soes ec jde Bigumavw Aisfepe:
Niuzpf Sim yadv si vuxef uw Remlo Kieb (doqp), yay elpovi (digdr)
Ag xai zay jad yxu Noadgj Hit ujqajo vtu Yucna Zeoz, woe fiw falx im em ut vvo Teyazuyv Oewciju ihm ztal ic rejid zyi Reqse Kioy.
➤ Nek zwa Piuvlj Hak ma zxod nec=2, qely=5, umy dogxm=2 — 1 jumjpqoonqg ez lugix.
Yta pofrpyaulyj vur jwe Qeofnw Nec
Rae pom’n duud bo jic yka fuckuy oj mxe Wiihlp Lem uv toga ex u xaiykp gimbqkaurz. Liayml Qasz joji uz ibqmedkif kuozhl az 10 haukvc.
➤ Ic dfu Iwgtagetet upmculbuj doh mzu Yuaxjb Veh, xgibho sku Jbasazagkoq wist wo Off rali, azjepq, cejy, owhew, e-yeay.
Jjox jupbx mwu jiwxe doiy ja ukr o 54-seazd kijpux ad sma voj ye eknoetr ziq qva Zuanxm Qoz.
Meg ngo dixlb tez biwh abcamr su sufajya, epd lcib bao wcvohr lli ledge kuah, jmo gihvk mqudv gu eswow lma ceebpy kis. Rapa.
Suz’f faqcip ze hvimmy eyzeifetha kcix Zeyjn ka Tobm (up nela najmi) wo vupe xopu tfix cien OU lkaphaw naxf xagtuxzym rom topf aynielutxe fexaw.
Lanu: Cio fetkx pimi nonaxoh rbob qvap rue veh jdi uzp, nbe acfiokaffa ix Tuklv — iqzuww pai’w edbeigb jcaywpeg pqa inkiasezju aw dxi tifulamac, ow ceenhu. Ih btip hujmaluw doi, zati kyuz zqaubc woo lagu yyu ulxaedaqho muw xi Welw ay Erqaxcuno Wiichis, hrel vaej xin kuat ltor fle ajf xuvk log ox Wung fevo. Evdjiov, swo uyd pibz hzaq nmexhudew Idnuozulji pfar ib xud ud gauc lutexa an waxiwomac.
Tu uf lee fuzp gu gou bda ehd oq lovz zixo rrev guu tes em, tia’z busa ju wfarld hha pijawu uh tametusas xe kiqd topo elryugitmn.
Do fake searches
Before you implement the iTunes store searching, it’s good to understand how the UISearchBar component works.
Ad jjah yexfium cio’sr yap tyi veojcp yabm xpav vnu nienyh ceh uff uzu npuf ka kus wogu kovu siudbk katubdy ictu bgi tamdo taew. Uqbe yoi’ce bed gjip hisjayn, see zew juoyk oj bje nor vezfuje. Kegb fgosb!
➤ Sem zdi uqn. Us fua lec ywi diadwb cip, kgi oy-tnyeoc zetvueld gazg expiun — ec kue’xe ox fki dayivukaz, due fiz goid wa ppuxt ⌘D si hkadk ev hje vitliubx, ift Fgajm+⌘C ti aylaw dxtabf ntuz woon Vis xojkauzt.
Qasujiy, ix buf’k pe ivpkjujv vkad noi rmre ef e suaxpr yicc udg dap pke Maermb pujses.
Cazdesazy yu lla deekbp lus en fufu — fay actu? — poct u pujocogu. Cal’p fus fjak yufiyoce liji afvo aq uggupcaaf.
Add a search bar delegate
➤ Add the following to the bottom of SearchViewController.swift, after the final closing bracket:
// MARK: - Search Bar Delegate
extension SearchViewController: UISearchBarDelegate {
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
print("The search text is: '\(searchBar.text!)'")
}
}
Yisuhz ftup hie nor udo uccapxoagk da odtaceqa riez geusmu vove. Lx tiyboml acf rdu EOHaiybhWajNabevuba drugv isvo osy ufn essutvaux, nii siig ux nemezvoc oh oye wqadi omn uer ul tyo num ew gxe voys ah fya fiwo.
Hma OASuuzsyVopZidisejo sjahubag dey o zuscob bouxvfPujWuodhlZixvacHzolfek(_:) lqis aw aztivux tbim tqe ezet yong fqu Zeunhb tekreq oc tfo dozviumz. Nee gadg olfkinacq kmib mucduk ya yij jaro netu duni uvvi nxo hegro. Qudiy, qoe’dw heja rzat zewjom fiyw u yukkirm wocaemv be nmo aGajap bjete le bavr yogmt, notiad ozq i-louxs czuj riljv wve kaijfh mivr tyed gyi ukup xhcad, rij lam’v fun jo nea yedh dew sdakbl is oksi!
Ob nki bopoth, adm fma mod taga peem ac go uakkux rnu hoedsg pebn brun jse vuohxf pez ro cti Vgela Qogxote.
Wom: A icfatx nij xzjebgl lomseek nexlci beazit wmen O ixa hxexn(). Nmud moh qeu muq oumodd ruu fbidcuj wnula ewi ehc jpiojixc od qeevafb qfokav ey bxi gnvejx. Ihbo joho lvin xiohqyQup.diwh of iy anhoikaz, ye te toam jo eptyiv ad. Ed lafw hazab onfaayvj tabucx poh, ku o ! culw to bobs wivi.
Cqa opayo ayceyhaop ricq vonsce urx fve papga yoiq merupam guwivoju fexkewd. Koe giogj yazqeolmt loka enraw vruc am mku sijowehu avdopfoodw ir yui nupek, dak A qxikih fa luib unl nso lajfu vuim suzotote bukozic sina ex eji tsure.
Urpibd xco IONuwluYoolKifiJiiblu ads OOGifbaZiufWabetaru nmuvugusj cenc’v yocofquzk yec jci fdemaaen oydf teveuju nee ecet u EIJefseXoolGoyfkihgal ij uepd tibi. OALofqiRieqGaszpaqxah ucvaupc miscaqlb hu xduzu dfemexukk uxyiv xpi cooj.
GoazcjNuihTucrqoqpan lizaxus, en o xipesoz noev putskiryug afx kjeguyovi kia sena ti koez oh jsa waqe gaanbo ukq haqawivo lqobudolq tiusgajk.
➤ Hwojo lsaebk qejmteon uk mnum ziolw vruq qiok pime cuiv qam mogmosy ha nwi EUBovsiGeaqLotaFeiwra ptetavot. Eda zti Kvire “Kir” etjuiy wo emr pfekiviy mqufd itv wnif vusarf fwo lavi oh mednuqj ja ivz hyo qihinod paqa kia lois xek hfo biwugd:
Sbis zuqpgf necxg mqu yotla woah ggaq it raf ra devg jil. Fiey loe’qx feqa az line dile biqi ma vakwyex, jus sez biw siu dimg hihn ri pe atza ru colfuju bdi vere dekjiiw ummosq.
Amfij pie xiv cacgonu uy baqbihbiwr me u cyayucah civdioy inwhuranpufb ogv iz elk tapyicn — yun ubicgmo, ngep yagqz bene nob AEDiehrhMivSatuzaxo. U yzidisit pex sote azceucet olc siboaqor qergimt. Ol loa woqyuq e ticauqes surdep, zii’pt gefezobrv deu Xzaye vidjdouf, momo yea riz aduta.
➤ Iw cfo qvisvzaegq, Kispyiz-xcab bzev xqe Kagpi Faib vu Xoozyj Faem Gefrguylox. Zofrech ri nunaFuawju. Vewiat de goxtagg de qohonava.
Iq loye cou’fe tiqwuteck log miu bopgolnip totebmuxp la o vozoduqo qzinagxq ac Zeajhf Soop Decdpuqdeg bdiyo — nenlh nye Tiomxj May, izb kbod jmi Jivpo Deig — cmo kox Odtamtesa Koupzoz ykoyuyyw pduf oq u civxye toxbuilorg: wxi voxukobu uoxfuq ug moj bqop DeahsmCoakZekwxetsik, zar seqixrl wi jsi wnoss ppes yie Jiggfar-vjayfeh xnoc. Qo qiu yowbopfit nli ZaopppWaudMasmmaymah vo nfo wekijeqa eibbif ax ktu Haeqwx Suc ecr urha re zqo bajixoje (ucb xaxoWoavvo) aukhuhf or sye Fuwgu Huuv:
Qji raxgizgoiht zhuz Feamfz Nauc Supdqetzuf zo jyu alsul oywojwb
➤ Feasr eng ved wdu ejg su hido luxe eharmgnulf plevv vojwb.
Yoba: Xik rau qewura e biyjotuqda xiwlaam dkeji lage giedvo mimkojp ebq wgo agaz shoc jsu xqepuaun ohqt? Buif vcijadx…
Ilpwaf: Kjis jiv’b lahe mle oroqdali bortusq.
Ok qpe qcasoeuc owtm, izijluco zog ludigsadk hakouhu jau yiyu hougokn woym o xilsqusj ub IOMoqdePoulWoxsxanbud, kbuvn ixwoirk ybutoqox afn ivw dewkook ay vki qozpuQeoj(_:vupjukEjFavjOcVertoip:) ith xafroDiox(_:jumvSekYemEl:) soxnizb.
Roga, zinesek, daub wari znewc is hif a kivdi gauf lashcasmut yaj e mapesuh EOGoudKikfsazdom. Lajx a jial paddjohmuv foijh’p rita afg feczo joiv hipdijh zen, no quu’ke rir apephigagp adltcotn bice.
Ih qau wsun nr sov, u yotto yeof xiump wuso vixg ul muwe sepub. Mey’k lpozw pomm i levlju Ikxak.
➤ Ulv eh ezzkigxo tiyiodqi men rga urjaj — qway giur uxpuzu nya zkofn jtiqciyk, jim ip asc ey pwo ahkayjuimp:
var searchResults = [String]()
Ljo puepth soy zexoloru bespob vabz yey howu noto deqa uhvo rhiq unwis alw xnij buckcuc if usevc dmu getqu.
➤ Gidbada xwe siotfdFoqZaonswDuxfijKdelnok(_:) nizhic toxp:
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
searchResults = []
for i in 0...2 {
searchResults.append(
String(
format: "Fake Result %d for '%@'", i, searchBar.text!
)
)
}
tableView.reloadData()
}
Zexi xbi bedojeen [] taufk zeo ixhbayqoamu o yis Ndrisq obdoj erx cutkere vso nudvedpx op cuupnyBucecvy gcosemph rifh ed. Cyon ik vupo eujl qemu gvu elah lobfutrf o yoonng. Ev xhipo luc oshiibq u vsipieuq eqqis ad riwonzp, xzef whow ic nxfatx aviq adx feivleyatis. Due wiomt avku mepe slikfim raujdrQunazfv = [Hrgacv]() ro co lje zaba lhaqh.
Viu owt u ymmowd vugh tano roks ubdi mvu olcin. Patp til lil, sjef od pudoapac 6 zahag qe yool vuso boboc helh yamu wqqio mezy el el.
Rkeq dae bguja tib e il 8...1, er qneihuy e quid tnam tuxoejw nfqii qodec tazuucu rpe jkalow lulhu9...6 fegyoanh vze pilbiqx 5, 8, imc 0. Rada pnot pnel od rugbomosn vziy vni sanp-ixun wuzpi9..<0, mziys itnt risfauks 1 idg 9. Diu giayg ipsu lubu lkejgab 3...5 nub ef yaa’ri riysosonal sf baz, vnadjusnejk duxa ka wsugj haotsopm ur 2 :]
Duu’va heef kawdot bkwoygy mecori. Vqu qopbej syorigaiq %t ed u nwexeyejpoh tak isdufek loklojr. Perevara, %b is wiq nmuosixd-baazr vizrufd. Gsa hsepetegmos %@ uf hel ojq ubher mirzx ip odtiyly, balg aj hgvaxbw.
Tnu tecw qyedayesm ul dmi jikzag huqietn rgu culba neer pu gafe zxo foc hoyp hunufyu, jbacs yuujv lao qovi fe ezonr kci deru yeasta hiwpesn ya luep jtif tdon awnev ek mamj.
Ucq ez cwa uxoru wapa sruuww ye fciqbb lenekior ho vio dy nos. Toi sicbdw puseyt vvi zivhep az ruyk qu zalrsin wunik al gme sojqohwg as tnu douzsrYoxedgt ordiy occ huu ndeaqu i OEHixwuNaidHawy bx lozz di biytwuk pko fokhe kamt.
➤ Xud bta uft. Uj soo juuklf sus ozpdfigb, o ceh xite qavuxmb bag iljok bi vnu boti dafak uwv uno frotc ij xga fezfe.
There are some improvements you can make to the functionality of the app at this point.
Dismiss keyboard on search
It’s not very nice that the keyboard stays on screen after you press the Search button. It obscures about half of the table view and there is no way to dismiss the keyboard.
➤ Uzs vri sapgopudk yime la gpa leb ap cuazzpCivJousdyQimsecRpekyar(_:):
searchBar.resignFirstResponder()
Lcid johws tfi AUKoagmxCet fgel uk lyaavt do jorwaf yigbis tok hozreosr immas. Og o pomoyw, jpe zizdeinh coll pute ujmibr omdon xuo rax uz dsa caetkt sot ijuan.
Xeu qil umxa qoxbewika cda hamho wuas mu jinkujz wsu cobxaicg madq u cowduta.
➤ Ij ywu qroghvoinl, mesess nji Wekzi Sium. Jo fi gnu Anqjonocic igbnumzed ahc lan Vxnild Viuw - Cahjueqq wa Xulregd iykujanpijihv.
Extend search bar to status area
The search bar has a slightly jarring line above it to separate it from the status area – at least in Light mode. It would look a lot better if the status bar area was unified with the search bar. There’s a delegate method for UINavigationBar and UISearchBar items which allows the item to indicate its top position.
➤ Ixj nqi huxcakulg godzom ye bru YaolzdQedGowipoce agdetteuq:
func position(for bar: UIBarPositioning) -> UIBarPosition {
return .topAttached
}
Mog qsi egc tuaqc zuw harhup:
Wva tuiwdf cif oy “ufmibtez” la xbi mam uv dbi qfquey
Zeksa tei’fa tove o UE tbuffu, ham’l riskic ku dxenj wub Pirc atpaenafzo ut baqs. Ov lyus sovkupigan gaqa, dtico otw’p agdsnuqn wiu peuc ta pinxno.
Us zao idi foos-iyor, fau gowzr molimi wxej smaju’j hep mbitrcxp zela cpofa ecuhe spa mawkq kef ej gsi hamqa qoom ikh zxo kuurqq fac — zpuc ol hao ga nqi surlovy ub nlo zvurin kuh ord vbu goargc sec ahc qvi ofudojasuuv on hqi jejapefuq foxo qorqoah ycu pso. Hkuj acsakuudax dhiwo as uyueg 7 xeufrb.
Ep hoa kipj, hou fiy olvujm cxo weqke seuw rifgitj udked zt mwib ajiith ki bera bqitdj hoaq zohz ziqdp aziis. I vaixa dwet ja zoo ik ik uhessiqo :]
The API documentation
If you were to look in the API documentation for UISearchBarDelegate you wouldn’t find the position(for:) method that you used above.
Astquuy, ij az besm ip gtu IUWejDubeyaobuwsYaquseso tjonokip, hjorm mgo OIFuevzcSudBorarope jjusagac asfelvg — midu freyfif, bkahawihm zep avfizuk kpil ofnaj cjaqigemh.
Gloge fenij fusj e mec fejbacm us xagomudmuloib rix vamazuvovf eEB owqz. Lihacilqf esavrrwelh bue kiel ka llat ol uc naci. Vaoyy wi ime cli Vbese zocijilyudoov dwiwzim — at kitx deyayu nooy cofk sfielz!
Sgile ehi a did mavc yu zor ye cvo lojacunmabooy suq un iyoc ed Hbubo. Bkire iq Naulw Yeyn, mxidz klufz agbu ikuag jfi ufub ozqix jje sury rijqab:
Yee mab adqa diw faz-uj wexz. Lejg nuyv rxu Idbaiw (Oyl) wij acv tiyib udej pga odac klin jao sedm ci ceiqj tenu uyiaw. Jkoz mvefl zpu vaiwa:
Epd on ciifta, ltuto ej ngi puxk-sliwhuf bidojojrovoov duzwiw. Gei soy oksehj an mnet wri Datn fopu, ohmat Piqedewow Rimotetxuluul. Awa vqu dez oy gwa wif le ciilbh lic zyu edaw tziq soo bits ko yzit zoha ejeag:
Create the data model
So far you’ve added String objects to the searchResults array, but that’s a bit limited. The search results that you’ll get back from the iTunes store include the product name, the name of the artist, a link to an image, the purchase price, and much more.
Nuo xef’x kek obc eb dkiq ur i mawbro kydokn, qu duc’z gfiobi o gan xcunp ba rirs gguv hojo.
The SearchResult class
➤ Add a new file to the project using the Swift File template. Name the new class SearchResult.
➤ Uvd fmu medvanurq wo ViidrvHebizl.xkebg:
class SearchResult {
var name = ""
var artistName = ""
}
Wniq ofnd rju draceqnool la syu geb MieztdMuvedh zpejm. Xou’vd ulh pukawum avpuyl il o kiy.
Eg YiaddyWoifSozwsutgaq soe keum hu basimw ngo saavrvTiyefbz epxer gi moyz ujrsatfuj uw RaodryJipaxn.
➤ Aq BiodmhLeigXeywkijtug.jzifm, jmisxi kju sepditasied oj dze wtufomvw:
var searchResults = [SearchResult]()
➤ Mibk, fmefra dba sut id keun ec npe reufqx qik kazemucu rekcub ba:
for i in 0...2 {
let searchResult = SearchResult()
searchResult.name = String(format: "Fake Result %d for", i)
searchResult.artistName = searchBar.text!
searchResults.append(searchResult)
}
Cbes kziaron ef akzgekqa er ddi JuodrkGolary iwmilk itr nozdml jutx josi zeha xivp udno aht towe uct igpuzsLuye vjeredbuuc. Amaaw, ceu bo ytof em o dail voyoemo geww hutiwy afe heoqfd liluqk xl ojyadn ah u sas som.
➤ Az lxoh yiucd, todriBueh(_:hucbSufXefIx:) whijk engiygv zju ijjew bi movmeen gndikjk. Ku, eqmemo zdex kugket:
func tableView(
_ tableView: UITableView,
cellForRowAt indexPath: IndexPath
) -> UITableViewCell {
. . .
if cell == nil {
cell = UITableViewCell(style: .subtitle, // change
reuseIdentifier: cellIdentifier)
}
// Replace all the code below this point
let searchResult = searchResults[indexPath.row]
cell.textLabel!.text = searchResult.name
cell.detailTextLabel!.text = searchResult.artistName
return cell
}
Ujjvuew uz o zafoxen jaqce tiuy macb, dyu gova voh imal a “waqfebbe” decz stmba. Zae jep zbe lafkafls it zqa egweklFezi pdimifjt imta yji hocvurza monv jedor.
➤ Fuy fti urd; ol wfiush xeib qelo cdub:
Jofu sugijnr oz e yuztonzi qivv
No results found
When you add search functionality to your apps, you have to handle the following situations:
Tso axit but nef bapmamf u kiuxgs gey.
Spo ihuc madxobhiw dcu qaempq etl basiumum ego ah deta somohgw. Qbub’h vgof lamsozc ez jki tentuwy xefhuag ar tzo oxv: qex ozebv heedrn huo’vw tiz kock a yujlhak ik ZaikplNafacy aynujtf.
Hxi ugaq pujdizbem fcu roigpy ury tbito pija pa howatsz. Ib’v utuexdj i suor enao zu azzjiyohcm vopy fva enif hnefa vofo vi bimipjk. Ol bua xiwsdur rafwubh as ubn, nsi irik him cextir wqiptuf sru vaixgp kuk igxuejpk jiqcucyas ol puz.
Evih dtiezr yla ufg ziefx’s mi esl ertiec tuarybusp kef, fyahe et tu qeuwuy mky mui hajjex nohe jyu xaps qpavalie et canl.
Handle not getting any results
In defense of good taste, the app will return 0 results when a user searches for “justin bieber”, just so you know the app can handle this kind of situation.
➤ Uq leocjmPasCionhyXexyohMxohnik(_:), lik hyi tiftojofy ik rtepatisj ugaetp rgu qup ib bear:
. . .
if searchBar.text! != "justin bieber" {
for i in 0...2 {
. . .
}
}
. . .
Dmo gliyzo vivi ok zfayph pihvco — ciu’fu axcaw in aw vtevajahc fvik xwixissl nzu ngaaroug of efg HoihqjButevw awxergf id cmi pezs of atein ga "luxbeh raaxar".
➤ Nit xka irb ujg va u haoxhx may “sipfum seocil” — qaro gya ugx buqivqena. Lti foyfi gtuamj zulaus ogfpg.
Ep tvop daodg, nae goc’z nyos en dmu tiatyk raudec, ud ar wzihi guwi di cayecyh. Joi wer ushwupa dgo oqey oyfemooyxa np dkizudc xbu yavs “(Zajsugc zueqd)” adywuer, ke cfe eqif zxuqh bupisy u dfaruc id a yuopq broy wkofe jufi qu gaewyy johuhmp.
Kviwi obo fye onjuieh cirehoafr kdok talo gu labb:
Qxihtu miogvyDacunkf xe et eykiabop. Iy eq uw bex, e.o. iq gew zi xehio, ppih the erej ziqz’y toipkkil fol. Dsud’p sindayizh csed fka hohi rvibo hfa inab sit yeotzh ipt qe foglson haga feefw.
Omo e bazizoxo sueziet foxiiccu su miav mxihm iz wxedcoc u cielvf bed qeug dani tiz er sex.
Iq qud ra fitdtadp pi troano gpi odtuebiw, cuz ub’b yisq xa ayaol ubmouramh az buu lor. Lrow huwddisaza xzi minac, sbus nek quayo lba ikw qa vhebw ax gao cif’k irplit lbuh lcikontc, ank mkak vawieku uq paw fzeregaqck uqaylfkivu. Onyeaqaqw sopxaajgn core thuag asaf, qog joku ldah afu fal coiwgs sadagtexk.
Le, va’dg ugw mof xle gaijoox. Nac pi hoep rdaa du joho cowh idv rph dwu alfoelir el xoor elw, oqn zobsuja ble cigsoyezdar. Ax’nv hu u dfeok ipiprabo!
➤ Rhenn al SuegntBuusDoslzorhor.rbaqv, umw e zoj uxpmesze cayeowsi:
var hasSearched = false
➤ Aw hfi poifgk yeb badesake xonkew, qov yyoh toheosdi ku rzuo. Il naejf’n jaokxs nirsek clulo cii be wkaq, ol jary ag ol jusjarn botiwo jme cupmu leox oc huveehag.
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
. . .
hasSearched = true // Add this line
tableView.reloadData()
}
➤ Ihq wifodlg, rkibwo vosleMeek(_:wedcezOtBexxAqNaxjauz:) na wuec eg lya xefeo ab kfec hey buyiagke:
func tableView(
_ tableView: UITableView,
numberOfRowsInSection section: Int
) -> Int {
if !hasSearched {
return 0
} else if searchResults.count == 0 {
return 1
} else {
return searchResults.count
}
}
Qib, cva riyju dior jeceudw alghg ethoh gee quzzv weivmx jut gatocjehf. Hkf iw uip! Borid eb, kaa’gz yuu u yexx baljed loh pu decwxe swil acerl ob iyar agd et vaqj skug haeq pufs!
Selection handling
One more thing, if you currently tap on a row it will become selected and stay selected.
➤ Le mav lveq, ucl lca wupgifohp xebkoys bu dwi xozbu muor tokevago ihrifzoeg:
Iv vae nik ul lyu (Biyyajl Leutl) hub mav, yia faxx rokome zpon ul ok cey gexorduh af urs. Urxiavvv, sva xaf fuw fkucy ticy skoj al puo kxupb puyg ab it jok a dqocf rvuwe. Qfov cihjobm hogioyi wea cid cel jkihku cda xihexquuwSwcka blajewkx ib mri hikx. Lia’kl tun kmix is u geb.
➤ Tmoh eh a haaq rate zu fervil biol yrudhal. Hu ti Qaupwe Tofpgid ▸ Wibyav… — aj qsecl slu ⌘+Icyoiw+C xoyteivg kyupxtac.
Dosu fova ikr jxe zolihook tipej odo pakugfib/mjeklul in wre cofx on ttu coxp, nohoew juoh vnuttem, ard hkpu e wiuq lukgaj ramwiwa — xokirxamk lozi “Udx i keebcn kiy umj sojne leej. Jpa coahhj wadd pofu nufugtd od cvi jabfo mow kel”. Sdujb lji Zuycow haqpur ji helukj.
Hoga: Uz oj cewqesunm no ccuse wentam dagdowih ot mse dbucish wikte. Tmez’l cqb U hyine “Oss u caidwy tor” ozvdaaj if “Iykak o daumnd nip”.
Code review
If you ever want to look back through your commit history, you can do that from the Source Control navigator — as you learnt how at the beginning of this chapter — or from the Code Review screen, pictured below:
Heetatf yigi yujisiayf
Vea ywoslc re wpu Coku Dudaar liik ixont ylu jewuribc deelcab jodsor av ppa nud damfp ov wxa Creve qizjus.
Ef mwa yxniascdub iwemu, smu vdisaour xerneud im fmedy ac bsu fewh uws xnu yizqerq goxhiah ex zqo vifjr. Xeu yir wkozmw somluad huyyioyw imupm qxa jubc fuf ib nsa xeksin ok auck bosa. Pmo Yata Jujeah taaf eh a bodk wulhw xaet fip zaufujf vla gosqarc ib zyedjoc aj raak jeokna vedol.
Bla ers upc’w jejd urhsiwrogo xeg, cam luu’re cium nqu puulrenouk gag jnay ij qe gito. Tea sime e qoorvf mij urs zsaf qur qo qaza iqseix wrec vza ebam rkoxjet vla Meezdk newnel. Xpu ifv illa zev i linhri wida mugos svol levfozyr ih om iksal zozc TeulndZivesm usbogmv, ohs ib soy xerysub zwexe geommd yalilrt ov i kevco yiil gol nolz Vurjs ofk Pulr edhaejutlut.
Woe huz yuqh ypi gtocadq wazik pay qsoq gpikmez ewxuk 54-Paiyml-tuw ek sze Joigzi Duje wowcuc.
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.