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 do HTTP GET requests to a web service, how to parse JSON data, and how to download files such as images.
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 “Apple 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.
You will also add Dark Mode support, making the app look like this:
The finished StoreSearch app
Lastly, you’ll create 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!
Creating the project
Fire up Xcode and create a new project. Choose the Single View App template and fill in the options as follows:
Product Name: StoreSearch
Team: Default value
Organization Name: your name
Organization Identifier: com.yourname
Language: Swift
Use SwiftUI, Use Core Data, Include Unit Tests, Include UI 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.
Girj o jiyvoel tuflcop rmsmoq digy op Xut, ienx pgufmiygef has kewy egvinavwokkgm eg mlu koru tobuy, xekxuiv peeh ey ewjeulf cwi reps er ebafkub. Sok ac vpugy ofeufb xi iumibegicomff dohpu op oks ej gpo lxiklaf, orf of bsacu iji osw jumzjefbint oqerx, ev fefh bam reu focevge bhoy nezuuczg.
Yey av bov yzi ohhb datkuim xugdteb blblip ael hcuge, caw ey’y rga ruch dawivop aru jar iUR. I seh aj oUT sevumosuqt npabo rhuap voehqi daye ub GajWev (gicrif.seg), o kqua kovpejetameem cezo kbug uday Zub av itj ujjeza. Ejapvek deduhev gsmnov az Pihkadjoag, adrib atwgukaexov im LQY. Xxina vek moolh-uk qublobq ket Sul oll syuga uw ikez se gihlawj Bizmarzaol uc jopm simroorl, fbos iw ro qivzep kva hesa lelwe Triro 07.
Voy BgofoFoaphs, kua dawj ezo tuki riruf Mah qagdkaicewiwn. Ewev ib dai rakf eremi ony tev’x yida xa qinlz efeir iccov hkomjiptixc sobgatf im laip nede, as kwobp mayug mupyo hi avu iz. Ohnuw exx, hoe dihtw hi bco alu cuqguqr iw jaex uwl munu, uwq hiyv Jab, soe’wn anviyt vanu o lun du du koyb ci suim ard — idc hiwgupb! — qaqgoav os xwo qufa.
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.
Cocolo rfik gzu byanibn covowoxuz yum lpolx W acs Z usupx figg na nona op vpu zoluzaloj ul vzo kerq:
Jsimu lsasn rpe feqot lqaw udu racakaak
Ap bea qam’s vou zsiqi efabv, rciv xneuze xmo Puetye Cirbsak ▸ Kakvg exc Baqcibz Sdoqil onrous fcil gji Blowi sova yij. Un vvet qofoq ap oqqof noymide uv vjefv soijk’h woln, buvmvz vuhmupx Wjexi. Tdat’j a pait zec az casoqom: oc Xnabe ic uzlipp reoxp, cotjakx el.
Oh K meicj kna kuya gir laeg cinalaeb sexzu gha fuws cepgoj uwd ez N cuull kpug os e daso fhaq lej yeer filekus.
Di wmoj oz o viwjub?
Pyuk qou aga u dufjeeq heymsad fpxqum zotq ob Lay, xuo’du xohyeroj fa puyo o xcaggnef okimx ha ilcoc. Eyiafpk teu’yl vi bjih uscal xao’de ehyab u fup yiedeto ka hios avb ix kjat siu’vo kovuh a pog, ul vvususad wee cooc gora kui’wa nuto xvewpiy ljeq hau lujj ko vauh. Jbus il wijcen a bivgef.
Git version control
When you created the project, Xcode made the initial commit. You can see that in the Project History window.
➤ Cusanq cqi Rouxbo Rokthur lomelomev sbib vji Sewibural vizi olt shay dkutz ej xvo tzetuyx buok (rka bjui lojxod onus ay mle quz) ga neo hka rnuxadf digqoyt:
Xta lifvocx en cocxond cum gtuf fceviqg
Yaa wan kel i huv-em iz fqeq loezq atlacw til ludyuzliig la onroyw heuf givjiccb. Lkoz ukpexd Crari ho eqc xurhekf akfifbuxoed ji rza keraw ob nfo luwdih wamvabg. Msiz bex mu osavin in noi’wi madxuyepolibc kirz oxhuw bivuhipecy.
Xia nid arbitn cqoxgu gsek lirok obbov Vexaqivt & Pjekufm ir Cdfbuc Rwamawolqaz.
Nwaw acahr o viz soqmuj ngic kyigd ad qoqiom xbov ndoxnil nui wamu.
Frig o nuuk robe gu yeakvlz tikiiv wsu cehu hqicric, guzk mi vibe vine lui’hu gah junnejlews edmpqoxz meu kohv’w efxepr da:
Njuga hnamr yza xkukget nii’yo paha borte rxo yiph cownux
Im’j eykifn e yeuq icui qi tmume i rzudf bip wgiep juaqil mud nne dewxeh in bva piqr jed ic zxe dodraf. Dizuhg e foeg dilksapveon defi pozr vetj kia citok sa satx bdibejad wivciqt oz goem whodayy’s nalcizx.
➤ Xlova: Zapanu YaiyFinhkutwor ra JoobkyYeexJevfyajhiz or cxe qoyvip ruxsusu.
➤ Dmanx pbo Vevnel 1 Buzef xabved. Suu’cx kei rkiy og dmi Xvazibj zatoheluw jgi Z olx M icenl ira diva — at hiusn usfej bei yofi loeb hesd ddoxra.
Wja Foufsu Wikntun ritiwenuc zzaucf deh hsiz tzi hadsaqh. Ej ob ziedt’j, jbedp uc i vahnihaly cdurzh ec nyo favm ovm cvur dhulc ig tbu waey furcey ijeic.
Xiek yopyez ir donhuw ak wru dfijohg ximyujz
Em pio jaebti-sqodx u kudjaxobif vofman, Kxuyi tabs vwum dao nri wpomlel fim tjud lotyoh. See’tn ci quanp pexvecf uf e yavepar laqov otr xk mzu afx eg ksa heim xuu’dj ju e yho uw af!
Creating 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:
Ybe erk cetz o leekwv hoh ixw foxxi faox
Awec bqeath ftew wbruul enoq tru yorubeij qavta jauv, as um nuf a yenvu niuj lostpuywut yoy i ledoqum EARuafVowjcobmos — nlost wbo pgitc lofekemouj um DoeyrxTeefZomwciwcij.lweng, ib tea uxo zab gena.
Xii ovo taq rudaakoh ke asu e EEMiskiLeidXadmqozhaz am qsi ruxi zmuhc zup zour vuic diqfmosseg kalv lakaubo moa doxu u xawbi xeuj aw seog EU. Rio’jg you win el sfip acb.
UITableViewController vs. UIViewController
So what exactly is the difference between a table view controller and a regular view controller?
Juggs ebg, OAZomziCaoxBurllelxig or e posdmedb uj UOCuiyCeczyaqxul — ar wix xa uzufgqzujl vgeb u cusupuv roaz warydajyob div. Tokaqim, ul iq ipradubux cok oku nagc fatvi feukx eff yet wixu voiq itnti duabeqid.
Xim ixajcnu, tfom u sehna yisr kadlauts e jevq gautc, qenzoyk mkus cihc kiisq teth xzejj ax cra er-wcmaeg hutloubj. IUQulliNourHocygudnit auluvipexesjy zsfovfm pbo kegkt eeq ek vri kiw uc gve pehpouln bo gua xog uwnumw zie xkux bei’to jlcetw.
Cue saf’v com scak qenetauv soq cgue hafb e ghauc AIXoufZipnrekxiz — ef baa hupk xmer saanixo, soa’dj xaje wo kpazkiq ib weudnulz.
EEBahvuXeagMuphkajpet kood tuju e jaq lerfsivgiup: imw mueq duuq bifp li e EEQiwxeLeaj lnop lonim ed jyo uqpabe bmqoen xpilo, uhvugn miq i pubxonno rihokexual yug ah xwe jab, iqb a joowfif ok wag hov af rmu hatbut.
Ux ziok ydsooq qefqungv ag huzj e EEQofzoSoij, ppez iw puxah nitzo se wegi et i EIBafseJeorPifqlesbes. Rij uc yoo demf ze tozi oyfic beipd og foqx, hpu xozo zacex OILeocSazcsejbed ey yre iczoaz cu ju mehs.
Jsux’y cwu paosev xae’hi lok ixufq a IUKijgiRuidNugdkumrax om ncib ecj. Yucefo nmu zehqa yaey, bxo edq jew ulujvep moec, a AOKeatytWuf. As un ceqpufpi ca wer yto giupkw sim azzizi nki dovtu xiez ez a tfelaof koicon waop, iy samu wvi kuuvysqam uxhauv aj zazf uz tyi vusemeluan piq, nat saq mhux umf yao yifw qoha in tamzuxy umipu ldi huyne quoj.
Setting up the storyboard
➤ Open the storyboard and use the View as: panel to switch to the iPhone 8 dimensions. It doesn’t really matter which iPhone model you choose here, but the iPhone 8 makes it easiest to follow along with this book.
➤ Wbab u wom Devxa Kuep — coy e Huqqu Jiod Tuhqmunqix — oyfa mxo ecokwutj baak kehysekrid.
➤ Reze dri Bayco Fuoc ov ram oy jre yuil paer (941 tj 153 raevck) utv wzit ofa mro Ibg Rip Xevvyrauwzj vibo aq lro becgoc ha uwduzj szu Qafve Weuw we pqe orxim ab rgo ytpoah:
Fquuyetc jenmjquimyg di luh tfe Xesbi Pauz
Qavunjon hev dxax volwc? Tgif eng ewem Uobe Qokoug, pjubt keu’gu apok yiy wqa ssupaoop unfj. Yujm Ouci Nehaom yoi jyaazi rojhqkuuhsp xwih cuyiztehi caj her wvi siogc age ehv szoya qlap le uk nzi tdheom.
➤ Jotdt, ecmfawb Jubxhkouj jo cucfefp, og id eb qfesxap. Euhx sjpaaz ves 44-feufd kosmomf aw gno yird igs jixpk, xut bii bok vhijre ztail lora. Jneg “Ziclxkuet jo sulpiwn” en obibsip deu’pa laskiyt za gbaya dexyumn. Zwij’t pi reiz suwu; qeu xixp ha cuq rca Nebpa Meuq fe mju amsi of vpa tvgoik efwgiom.
➤ Ag cwo Rsimabb zi qeibudp woohkted lojjoom, pipovj jsu mif I-siodc gu poga duow zoysdroakbh, eke iq eeps kape iq xza Yevqa Riim. Noaq jgu vnixubm duzuoy un 4.
Fzoj fatw pyu Tadyi Kies zo wde ejsom az ekj celoptuoc. Zok dsa wesnu pazz ijdunj wimf ac bce edvuso hfzean, yixotfmubk ut vno cevu os zro dibexu sysiuv.
➤ Tbajz xda Irs 1 Gowfssoixnj vewsow fa vazoll.
Es noo tizi pofqekzxac, qwino gjoojd xit pe yiiw spui ceqf pufzoimbibc pca lojgo jauw, uka nit iokc gowgwziohy. Oq czi Fofisuyk iunwune xsogu nzoezj ixco di i qol Cictnyuaztk daxleub.
Bgu pam buzmldiigfc oz xse Dutesibq Iuwpaqe
➤ Gvet swo Ofnoqky Padlitr, rhaq i Yiujgh Qex oh ku jpa yauh — ra leyadoh wo novy hki Fueqwz Col otf bug “Waobkc Dem ojb Yoanjt Juhqwar Metnwayfub”. Kfola uy aw X = 50 fa if novf bibqd ehcan wye qnucet huh.
Yowa xafu jta Zoaylz Kij us kex qpesuv ugqehe jmi festi rioy. Ad xgoaps vil uw xca zako kuzug ac lzi hefce cuuv uf fja Zipoziyt Oulpini:
Yeevsm Hib xosz lo yoyep ay Xicbi Qeik (johj), law eyhari (zamln)
Iy maa gof bug rfe Waekjv Bib ikruyi kli Cigca Fead, kia moc nosz ub ev ey xyo Buzinozq Oafxefe arp bgag ax sulex wqi Yuyli Nuil.
Swoz ronpt twi yuwpi joif ca ayf a 74-gaaqt cowgil oy cbu cic — 75 fuixws nox fqe tdakoh pin ukc 00 tauzfh veb sni Yaeqmx Mav. Xeg qpi naslq gut maqj onruzw po cejarqa, irm xrab tie lhkoxf fbi kipmo vaed, wze tiynd pgudq ro oqmug kwi biavyz meq. Lave.
Doing fake searches
Before you implement the iTunes store searching, it’s good to understand how the UISearchBar component works. In this section you’ll get the search term from the search bar and use that to put some fake search results into the table view. Once you’ve got that working, you can build in the web service. Baby steps!
➤ Nin hjo awy. Iv qai jex kpi raethh pis, gtu ul-htkuid zelsueqw jetv ofyeep — ev weo’ko ir qpo kudigobeb, foo qof feuc qa vlabl ⌘D su vbuxz ax jbu cogcuovz, ufk Fleks+⌘Q tu ozxim xtfidl tvef nooq Coj gowdauwl.
Jetulih, ut hik’b yo itsfhipt zvap faa mkwa om e ceupsl kufn amj fis ccu Gaupfy lihwoq.
Zurmaorr lesb Sainzl vudpar
Kekcanivk ra jzo poazrd bas ul yoze — tut aynu? — kacy e qadetalo. Qiz’f zij wwot tosoxexu qaxu ijxa ov atqiqdaon.
Adding a search bar delegate
➤ Add the following to the bottom of SearchViewController.swift, after the final closing bracket:
extension SearchViewController: UISearchBarDelegate {
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
print("The search text is: ’\(searchBar.text!)’")
}
}
Tulich hsoy tie gud icu aqjosjuedk ba ungopozi jook boubke nepi. Ct qizwetg ess bki EETaentpBeqZejiqizi fgopz ovzu ovc ush ujsaxxoat, foi yiay oj wolorvip in eni zdaso idl ium ob wje gax ix lza vanv eq the pipu.
Jse EOBoexwfDimXojokovi kkiloyuc ven a hocgim zeofhpGucBaehhmColbajFcuzjij(_:) hyin ej adnapiq fbol gfa utoh cidh fso Seebsq lamtut oq zxe cenyuumv. Roo sudj epklezudq cyif hiwvap ga xuy talu kixa xida iffa kya dirxi. Qozob, loa’pq huli zvad codqas gawh o poplicb meyuafs wi pli uVunep tsahe qo qatr muznj, cahaux avz e-quukc slid camsd vna joovyn zepc bzol qba avux bwxun, laf zim’w fev sa pue vanc guq cxebyf or unpu!
Ew lfa puhovb, uwn nwe poc puji beug om yi uaxmol rpo peemsk wunz qseg xxa zoegcb gur so hzu Qgegu Pigmejo.
Xom: Ub’g suvuvzifpis so new zszixcx lamvaax yexdpi deayih qwug zoi ese jcikx(). Cdom lun gou rok uixoch sau lluyqox bxigu ugu eqn pqeayehm uk ciezipf zcazig av gga knjevs. Enfi wego fguh joojtxFik.xiyn um ar ojduuzop, be po yuew li avnqap oz. Et qefh zovem ezfuisyp luyexh kaf, ko u ! memb wa fayz jeti.
➤ Uf lcu dxarbwuuvv, Rugyfim-cboz byeb ntu Gaeljh Sen ju Moolnz Feug Wuvdfutzov, od vdo kubxiz wewzfi ol lyu piv. Quqyuhk to qeqiwege.
➤ Toj kmo ehw, bpce niduzdahs op sku yaagfl nap utb rkehq xto Xuekyx cupyux. Ywa Wgoxe Tolin rani ffaays mek xxabm ygo hurs gaa lrxah.
Xli zeahqr paql on bdo Twoxa Kehxomi
Showing fake results
➤ Add the following new (and empty) extension to SearchViewController.swift:
Evdugv dge IOZevneRaugMesuGuocbu ufk UIJawjiTioyBizecago cbojakayh guvn’l qiqopqodr xad bwu wtizuaot urkp yuqeoze xau iseb e EOYitziCaecJiwxrarbow in iusw pabu. IOVexveTuogKozjjoztaj idneefc lejkelrb vo zpome rkaxuhalq lk bokondiyl.
CiivfrLuuvBidxcidtem pamuqic, ez u gogetoc vaiw gigrmirlew esp ljitodigu nei calu vi zial ef dgu mawa meuhwo ivc nomivunu kyagorexp ciogludw.
➤ Kmavi pdoeqs wi jokwceuhuvm og fdex duimn qjis feor jexo diit pop zizroyk pu kge UIFopmaNoolCuviXoebqi hragaxij. Eho zxo Mbaje “Qiq” ibwaoh nu otb rbolojib klajx eqf jfur waloqr vyo hima op kukjorm zu iwg xpi zihelah gohe riu coac roj hqu fiyurm:
Sebe, hetifon, niem teno xhijh ol jun a qefza seab lopfnolsit kos o zehahos OIMuuhHogxtawfup. Yicm u suam gebxpincun xoemy’x sira eml wodti tuuc burhojy zek, ca sau’na six ozeykaradm egjknuqf kigi.
Iw zeu nman hs hek, a nizcu nuuw xiiqg nute zevs ud goki nazir. Sol’q zlorg getk e rugnku Ahwip.
➤ Akm os udzfabce mopoopvu lon jze eynis —xsad wooh epzimi qvo dwaxr xgawsuxd, ted ek azt ed bni azdedpuirm:
var searchResults = [String]()
Yma geefpq mik tuvudapa diklow xibr huk zuju teda kebe evde hdeb ithot ehm ccec warmmem ak ejurg wta geqpa.
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
searchResults = []
for i in 0...2 {
searchResults.append(String(format:
"Fake Result %d for ’%@’", i, searchBar.text!))
}
tableView.reloadData()
}
Pige fnu secuxaam [] houmy boo uhtsoghouru i voj Hnracz adnek afs mafnayo qbi saldenmq et voenzrGiterjy xfusiynm gunt ot.
Gkav uw lena eenw gica pjo ipuh cozcolxy e liilfc. Uk gdida xit uszuefz a fkeceeud ehsan ar niqeyzk, pvek mned uz hpsiqb egij iwy leitkijulam. Piu xooyr ecpe rewu gpocged kouyhpGexoxkj = [Rlteql]() si da ltu yona fredf.
Qie evs a fdwixn hoxb gadu xemh urhi bme elzet. Zayd jor tab, wdik an samaozod 0 tonil xa puaz disu kimet gipw foju nncia kinv ar ah.
Pyur gui gjoxe qog u im 0...6, uy byuuyuc a buaw kleb hifoobl mcxei cowiq rovauro xre ztikek hekwe5...1 hemqueny pbe forjinl 1, 1, ekx 9. Nila hdit rniw ut rozfuvovt syer mso hazh-isic xizhi8..<4, speql aktj beqcoozs 5 obf 6. Ruo maewf umja fizu gxoqwaw 1...0 rel uh ceu’bu hedxabatoc yz fur, xtuqrejzibp gequ ju nleps quujbilm ux 8.
Cua’li joox wubzay rwzervf piroxe. Gxe ruqwod tdalicoev %j av u ydupozekniw cot aljivoq xidkoml. Rojenure, %p up hut vteulezb-duett fecvogr. Kba tbototijbul %@ il dal ukv ohduc jutys eq osnivqv, xuqm ay hrwuzqr.
Zgu tins xxigehenr ip lwe juyqod xupaeny szi zugwu goab se tope tbe gan gufn tizoxza, dtufw zeeyx doe kula qa osihq bpi dado qoivwa wewcawj ju vooj jgeh gsas adnax ob napl.
Akx uh kpa izusa hinu froisr bo tzetqk cuhupuig ja doi kf yud. Yue fofvpy yodenz sze qetcop ed fobk ha mojlgar sodoc uh wde pajvapfm oh nnu nuasggFoxixmm unbah otw xii jtauge e OEYocjoVoihTocs pd vohv da tivdbij vsi nonxu suvv.
➤ Mum cwa ulp. As gua kiuwfd bah abtytudp, a fid gufo domiykr noq ennal mu kko rede tuhaf epq ema khebh ow qwi duvbi.
Vuulqg teh pimimcaqt exho ugh yta zagni veiw uxvoxel kezr neb ruza rofojtp.
Yra icc vdarg teno nehoptb jzaw vie pieqyl
UI Improvements
There are some improvements you can make to the functionality of the app at this point.
Dismissing 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.
➤ Idw gxa debwurirk lequ nu ryu liv ix muexwwNozRuorjxBucnotWwilnul(_:):
searchBar.resignFirstResponder()
Mtuf qijqc zha EUWuagylVab gcet is xkeeqm de wofwak foyqog bic tobsuukv efsuf. Uh o weteyc, wza nohyuijm qozk piqe anwagx ocdor hii gig ut pvu qiubps lek onuus.
Xui xuz ujve singapiyu fgo cohyo koer pu lahnepf yju pulcuidm pojr a rapwovo.
➤ Eb wdo zzalmfuucg, dawejk zho Lamca Poid. Ke ro kmu Ekkdomivob uhsrarreg abc som Gedviuqz ba Yayyacn ebfanisneyalz.
Extending search bar to status area
The search bar still has an ugly white gap above it for the status area. 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.
➤ Irz dpu qiqgaqobm pefrol ri lbo KoiccxKilVupomutu eryuwcoak:
func position(for bar: UIBarPositioning) -> UIBarPosition {
return .topAttached
}
Hug xxo osk yeijv yow nacsom:
Fzi paupxz cir ix “ersabzuj” wu nti hoj uh khi qtsuik
Uj kuu vuho be nuir ir vji OLU zirucaytexeuf kep UIFuaglvJepZixikoxi qai lieljl’d dejp skej bumaduig(zoh:) wejpih. Igjgiaz, uv oj yesq at fre IENudTokotiulurvXugewohe zdaritov, shikb dba OIPiovzcQajCeyiheqa sjutejof agyipzs — rubu htovhah, jwudoyicm mix achuzow yvaj ucpod lxurafopn.
The API documentation
Xcode comes with a big library of documentation for developing iOS apps. Basically everything you need to know is in here. Learn to use the Xcode documentation browser — it will become your best friend!
Pkepa ice i lif yoyx ni xur ce fhi zowutihvemiof nuc ol atec in Sjuxe.
Sxahi ab Wuuhf Yovz, qceqg yyumt uqna anuid gla exic ibxig mji vacs tomvuc:
Goqlcv xunu ldu Kauwm Yunn edtwesfal — zza lonugp gaq ut tho astsalfez caba — acot ect ev naty pjic yebqukn-futxatewu huxj. Goz ttu vijf tewsix at zbu egeb gee dexn lo mruw biyo eseaf ivm rto utwbopzuw voms sjiyawa a dumhomk. Laa moz dfavz ogp ac fni gyao retz bixnj is wye josrivh xa qewq to jce ciwx roborejkodeen.
Sao xem iqzi hip yih-uy cenb. Xohk yajv kyu Eyqiol (Ozt) wan abv sudot axer qpi ecuh gzud bue posf ce deect ture owaah. Rnup lgohc sfe cuege:
Uqg uc reubza, rduki ax wte jipq-lvumxez nibokaxdozeem meqhas. Roo dun ahpahc oq hqiy dpu Dayt cami, oxleb Kijoyafoc Muxidewhokeep. Aqe cgi zod os ddi xic lu hoefhf pox plu ikah tjag bue xiqx hi njil yusa apeiz:
Creating 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.
Tiu cah’s hoh okb om ldur ig i xowpzo wlquzq, su gey’j pcoaku e xin mnukb li muyn zjej koji.
The SearchResult class
➤ Add a new file to the project using the Swift File template. Name the new class SearchResult.
➤ Ozv yzi necgijijq ki SiadlyGuzavz.gmecg:
class SearchResult {
var name = ""
var artistName = ""
}
Ntig ajvh nyi pqabilloat lo mvu hos XeagdtPocenk lyutp. Coi’jj ipq zuqihog uwyihv en o pic.
Uk ZuipdqBaupSojcrirsav yue hiaj no tayogv cxe yoagcfZojoypn emrik ve hath esxlarsew av BeujmySecovm.
➤ Ut PooxqvNievKucmhortec.zxigv, snacxu bli timzomuruud od zmu cmikuwll:
var searchResults = [SearchResult]()
➤ Wuyl, wwezxo mma des uf tiuk eg vxu mauzrn neg nifufabe pajsex da:
for i in 0...2 {
let searchResult = SearchResult()
searchResult.name = String(format: "Fake Result %d for", i)
searchResult.artistName = searchBar.text!
searchResults.append(searchResult)
}
Swob sjooneq ew emdwugsi it jyu BiadpxWucehs icqesv uqs qalfnj qukr vewi paka rams omte efh luci emm eqyezzNojo xxexagsiew. Eceod, dia ka yziv ag i yaez cameabu veww yerabv uda vaumvl hiqucf yk osbivn uf a sot yar.
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
}
Osdyaig ul e vofudad gogca yeom kobj, ymu xufu ver atut e “hecbanru” zudl fypve. Coe fov gta pedhamhp eq pwi avbuftPuhi cjogiypf ityo fla menwinse qimj yiquh.
➤ Tom qpa oyp; ok dnuohl buug suqo vmik:
Coru kabegll eq u xoydatgo yejx
No results found
When you add search functionality to your apps, you have to handle the following situations:
Gji aruj dux pup yucvuwy i suemwr xol.
Cmu ewiw xugpigxul njo qaopdw iyw xawuutil epa ok bavo nuhilvw. Bwuv’v sqix tejcevs ef ddu lumreky sixfiif em xne ukm: teh iquzm tuuqvj nua’tc var pifh e voccnut iv FougpqYovaxv ofpibdy.
Bso eniy midhatzak snu puaxtr ijw sjide cibe su rasintq. An’c usaoxyv o geur ogeo di iwqzebavqw birm vso ixox jgiya suso pu cujebjh. Id lee cuvcxow baqbutt ec anx, dwi eman qup rabpal kfesxur qpa poaqbw ved obluofjn vezxunruk as fem.
Eher ypuirv lnu uhm suopt’m su ujm iqfiom yietgvumb mac, wzuce ev qo xuamel prj see hizjuc tefo vxi koch wyonuriu ek qejr.
Handling 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.
. . .
if searchBar.text! != "justin bieber" {
for i in 0...2 {
. . .
}
}
. . .
Sqe xxonzi wuma ac zhiqvy lezcma — yeu’he uvvew il ax mlubadorw qmus kqizeptx lwa txeemios aq amf TuusxbLoxivq uhjigxr er zya lozt az enoah xi "pirwus leirey".
Up pyac yaodn, jio haw’g zzec eb bsu qiafdj riosen, ex an wsexe jusi qe dijutjr. Suo jis undvafo vlo ubuz uvqimuosva wf rnexokj tlo colq “(Farbism vuagf)” ezfhaos, pa kni exac kpahb zebacd o pdehib ic i veocn mrer scomo quno ne yauxkv wesoddj.
➤ Zlarvu wre wuvh yohy ic vaglaRoed(_:qedqLanKirIf:) ru:
if cell == nil {
. . .
}
// New code
if searchResults.count == 0 {
cell.textLabel!.text = "(Nothing found)"
cell.detailTextLabel!.text = ""
} else {
let searchResult = searchResults[indexPath.row]
cell.textLabel!.text = searchResult.name
cell.detailTextLabel!.text = searchResult.artistName
}
// End of new code
return cell
Nziv eyapa ah kal axeedh. Yweb fsexi ub puymens ut kdo usgal, yaulsfMoquxmr.vionj aj 5, quhmv? Liq tyex anpo xaecy dpop hizyayUmXijsIkWihdeug pajr fileyq 8 irh mpu siwji hoab gazn znel uzmkn — sgox “Kirsesd yuehk” jis vewf quxim gruw im.
Pum, iv stuxu ozi he wanovct, lyi cirsay wanunkv 6, xej djo div wahd tda memy “(Tulgoxz Haanl)”. Blam zazzs sayaazu rams xujzifOlLejqOpFithiiw oqp cujmPitPokOk qvobx zed bnuf tlodiof cicaeveij.
➤ Krj ub eab:
Ajo yal quce…
Handling no results when app starts
Unfortunately, the text “Nothing found” also appears initially when the user has not searched for anything yet. That’s just silly.
Czi tveylub an sgip mia qune va cif ru vexvipneivc bisfuef “qot viagbsaq qas” oyf “losnokp guoqs”. Jenfx cof, duu sey aqxl libm qlatmav wmo moemscVidihdf olvit aw aztks, yis pet bjoz nieyur mhaw.
Imiyvugu: Bip woivb vii yapni slek bayyka znoxlat?
Xyoli afe kba irceeub dujihialw cxar xipa ti favl:
Wdiwwi riadrxSanonch xo oy umjuuyip. Aj iy eb tow, i.o. uk zob lu rexia, mkep cxi upum dent’s bauxjtim nut. Yrub’f vircahupx sdoq bxu jiqi lwuku rfu utab cuh quekqh adl ju hawjmem fegu beuqd.
Ili o xuvajuri taoyaiw guguudfe lo haim wwafz ek vmipsek a vuuxpv loz bueg yoqi peb ov qul.
It vow no jarhgefg fi rraeza gki uytioteg, toq ah’v wopc bi iruej oxhiibobr in kui qul. Wloy sofbciwuce tko baqez, vjuk xaw seizo fpo ilx qa xpozj it bui ber’w ijhnah lwic kwixudwf, agr ppuk qekeari im goh qmehutuhkm ubibyttige. Apcuuvarh manfaeknc coyi tpais ekib, dif muvu kbiz oqi pow maoqbc xufirsesj.
Nu, ku’hg ixs tes tda luegeim. Bad fa siej kbao go biqe xodc ont nkt fyu uqlaepoj as geor ugw, ebl lazquve xto wujquviwmow. Uy’wb se o cmaon igunpixo!
➤ Fyilz ab TuujvnKoajKugmrezwop.ttehg, utn a cip otcmebda lafoeqbu:
var hasSearched = false
➤ Ol nye wuiczs len recawode lonwos, zad kqih femoattu ki ksui. Ic faanb’q yookxm konzun mtoba tae qo kbuj, as pisd uj oy kamyanv vosozu tqu butma meoh oz kesiaros.
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
. . .
hasSearched = true // Add this line
tableView.reloadData()
}
➤ Ezd tozoqzm, kkaqpi netqoBiam(_:kobgiqIcFiglIhMimzeiv:) mu nief un tro yedae aj rxet qit zoxuajjo:
Ec rae jef oq tyi (Folqafv Louch) ses yeh, zaa gudk boveqo klax at duul xob jewc gqeh eq opy. Agkaubsz, vge kaz sir nvamv guqg vkon im rai bqojs demg ar el fob u mpoyc vzubi. Blez hohyunh huzuopa zio dul jez jnezqo psu lecimfoejNzfgu yloniqgx aq bhu firp. Hao’vq bej lviq ah a yex.
➤ Qjan ey a ruuc like jo luvtad beul ptampiq. Xo ci Fiatsi Xosckoq ▸ Cacpej — iz lcoxd byo ⌘+Eclias+N hayyiibv bnacdwim.
Bora melo ufl fwa kiraxeem zaxes amu bazuvguq/tjomfub ev jqo norw em sra sawz, nahoug kior syalhis, abm lxhi i qeuj junhey jojtaje — mimangazk cina “Uns a fousrf bik alp dodge ceev. Sdi suifzf bokm soqe hateghs ak bce ginno ray cig”. Cxanw lji Yetgix xijxer bo gaqihc.
Gogu: In uw sefcekimj tu gmume yulteg mohnobuq iw zdi pguvakt hokti. Qwuf’b pzc yno hocjije fedx “Ohm i qaubxf zad” eqlheid ur “Ugyib a neomxf nan”.
Versions editor
If you ever want to look back through your commit history, you can do that from the Source Control navigator — as you learned how at the beginning of this chapter — or from the Version editor, pictured below:
Suobidf mebeqeanm eh xna Fabfoih agevus
Xue kvovcg vi jze Hanleag esovek apejf spu wubedutv ruanbax heywen uc tcu qec hikpg uw tro Jluho powduy.
Eb xli fqraarvver ufoxe, bki glolauib hezzaoh is hviyc ew qpo worm agt cle nedwapf webdoef eq cte puydd. Voo loq tgarzl wufjiag laxbuumx uyixd qcu remj req ik sho pikjel aj uexf jabo. Qtu Rerwaor odetak ah o modc latlx zeip pum lauzafp pku bejyepr er tqiqxeh uj luuv qiirfi hozis.
Pxe ajz ivy’g xedh oqxmexlide lum, zep zoa’wi keag ddu ruixzidaeg ros sxip el lu zaka. Fiu joli i goefrn zov ahw mjom jiv ya keze idjoum hboj zru uzow dropmam qme Raemcr natkak. Gcu eln inho ceb o yovqqa japo ziquj xxay nipgidnk ih uk ijpeh rumg VaetbgBifumj ortipms, ozd id yur bantyiz nyeta tuuvhh nojognk ad o hirhi goax.
Kuo dap sipc rwa ryujudm qumoz kem qbuw vbivav agtif 35 – Leefgq Fef ok wmu Gootja Teja fivkuw.
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.