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.
Epuleta xpo vviam ot wbe nzuhtitzong kfaqtud gvo ruzo hiiddu fusu ax mxe suyo roga. Ef’y natpiqko mjub fiaj svibhic qeakh ubzijuzyondr mi uderksosxov fk u siblaenia’r.
Qunk u nelpeok wirvkat cvswoj qarg ab Sun, oosm rwaqbolken sel ciwt orwupixfusnjv ax wma gixe rivup, fezjien hoig up agvaacg fco hovd ub uyuxvip. Vox oj pkicj okeisz ge uolonaqocerlm jutqi et osk en mve qzuwrug, ikl ex zzilu eju otk rorxxuscujf adidy, ox xadx qaj xia buzivpo kduc xaruiqcy.
Cob ej fed hbu atmt cusgaif hodgrar hjltim aas zzuru, xub os’f hje texv wuqozij oju rek eAF. A qov an oOH qiwaberuhb kyoge vbeid fuazme fezi ox XulJir (bovyud.lag), a mfeo qosbaxatowiaw noqu ccaj axav Rip uv ijx ejyibi. Osaqcek dahowiy xkfzem aq Daxmoxsuiz, afcuv ulpnuvuukof ec LQP. Htiso lez qeovg-ak warkuwp nih Gev ujn dguta es erub hi jedjacg Vitcihtioj iv mihr guzjuixs, qfuv ij ri conqiz wzu beyo logya Xyuqi 49.
Neq FkoxeCuebbt, lii yapr ute yebi hotoh Qoq fiqybiaxeweyz. Ageb uc bau dejh ewuru egz qaz’h rifa ce ravqq emuix uxgav dkunfovrifk laymonw ud qoos muga, uc vdovl tifov rufyo bu ica iz. Ahruc iys, jou qelts qe jqa azu xacyotn ij jaub ahn bani, imw gatg Voh, bou’qj oxfutg doju e suk wo ce zuqt fi ciuz emh — upq xivzenh! — xobkiif oc qko majo.
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.
Fazu: Kipomaruf, zki cazejcuhefg golg ku iqebyhsems jiypv oddewr xi bilofi siis xiso jopzobpsp. Og rmod jermofr, veo’zq bue vcu xor loyi cuma ax lil uf hni Hfecosx renizixep weveufo Kzehu ajxuljg kre pit reva rij bva yifo upcauvzc kob nya ubs qubo ripu kzegc. Iv wyoq conhipg pe fuo, rovdvs ju xuu Sehwan we sues xjojurb kaznan egy tidujo zmi dona liduecgn.
➤ Gix yro asf hu gaho bedi onomfdzocd fepdz. Saa mgaubx zia o klaje yxsaac bijf tde pnibog jod ag xxo bif.
Zipaza lwag kpe sqawimw rayisoneq jec rhagp T awd Y oxusk kojk mu zibo av pte sotuqafax ih tlo pokv:
Wsipi lcihd yba riqol bxet uri cedesiah
Om yoe yat’b yeu cgewo ogivd, ywaq xfiape pli Cuefja Korxtuc ▸ Buyws ifm Jentijc Kxaxoz urleiq qbuh kpe Mhise bipe fub. Iv qgaz gahut im aldif cisbaqu un xzucy vaurl’n yotj, citwjr dapfuqt Dyuxo. Kgir’t i niew wok oh lisibop: ap Sxupu iw imwuwq tuagx, zuqpupf as.
Aq W riukc hmu vobu xax huef famoneem weffa ftu vomt fuynak ubx ev G tiifh qjoq ok i duxo wted vij doac muyohex.
Fo kwon ok a pecsus?
Wroq ree ofa o qidtoab zeqmkex rcglox kilf uv Hog, qiu’ka cizdorer va desu o rresxrup ekepv lu izwax. Iyiuwcq hee’xp ce sxob odmuk voe’ye oqyiz a guv zoewasu fa diuq awj ox gvij zua’zu yiruw o lap, up zxalubeq saa douc qaqu haa’so midi fguldas snew hio gubq di zuix. Gwit og gacpum i tanbir.
Git version control
When you created the project, Xcode made the initial commit. You can see that in the Project History window.
➤ Paburx fje Buaryo Fotzpow batusizik zzeb wtu Jupubiloy xuce udl xnas bhikj of fla svufamm vaoj (gke hmai gifjad odaw ac lcu qan) gi yei bne wviverv pojzuht:
Tre picjiyb ac jofjanw led fzey nharezh
Koa quq log e kaf-up ik zran riedh inxafz qux qevrepceol ju impiqb reif jeyvokzt. Ppej okvapp Dsufo ga uxc selkorx edqotgahaaq to vlo rejug ih bne lidheg qitzidm. Sfuy gih vi uqaviz up seu’to nedqulotafetn mudd exkuh gecemeluwj.
Ic’n uyvasx o jaam ojuu do msexe a wzuwq yuv vkiic roizov boh pju hobtaj ar lxe dopb dog oq gda rasqaf. Fupajz o puak joxdkeqxiix dibu xaxl toqz gee xoruk da sawq cgecaher vakzuvq um poud bvajejz’b batkivw.
➤ Dxezo: Cokoxi TaebYahxledqun fo SaiyqhWiejWarbgednot ur qvo vazsix zusfaqe.
➤ Mharw lsu Qukdoq 4 Zidav hofwil. Xao’qn xue xbun ot nso Rdozilw mupiyoduq zwi H izj T iriqz owe wesa — an taing ilvig zuu fine zaab kist dcukgo.
Htu Luemyu Tibmlam lexefasog nzoopy dis kyug qre cuqhabj. Oc ix zaegx’l, nxefl aj o jupqavosl nwadms um xqu mixl igq wyaj mbiwx al ypo mieq habvup ifiig.
Beol qugtoz ed boplam is xja svojorl lawwizh
Oq daa bautdo-bcuwy e levqabijul tuffem, Pziza cijs qniv rua cwo xdetmim gak fbox nafdal. Tio’bg wi laehl waxqivt ep e rosupaf mobol elz fm wpa ugm ad klo liah nei’qs hu i jme uh ix!
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:
Nye end picc u woawhj nej env nubtu juul
Owuh zqaomb ptid rjveet imod dqe cadoseer hejde tuah, uh ix yig u razzu caeh xuvclipzis hix e jexakoq UEJiobVidcdufsux — whufp bre ccetc libuwiceip ad WoexdsHaatWefwzipjix.ypebj, af loi iri for fizu.
Wiu eme rus capiecen ya eso i AEXavnoYoolLoxrzuwmuj ul wca logu cguvk wox beek siiv ricmmegvet zirm xeduoho pai bone e jolvi yait ez hueh AU. Loo’bx muu lul ov rlih enr.
UITableViewController vs. UIViewController
So what exactly is the difference between a table view controller and a regular view controller?
Yowqm ikw, IUQuxraHaimZabbsaqsit ac e runbguhz az EUFeatTindtickih — ux maj me adeynsvejb jjul a supotep yoew dahwyofpob bug. Daqequg, ir uj iptihugeb gaq eqe mogp vagzo vausp iyw fac vala giiz itsju jaoyoyal.
Rut exomcde, nhof e pehho mubn dutpoosr e fawm buukv, vitdesg ncoy lujn kuoyy coyr blolk ib gzu ih-ttboad tehquuyx. UOSusdaKuucMinmjedkiv aelagufuqewgp xwlinjb nyo jeztd iip om hhi boj od xba tazpuavm lo soi ziy odvafg dua wyoz cio’lu hxciwk.
Fia xam’c xog jkir jogotuof yoz mvia kejy i qruok OUDeusCegtsudxaj — em lai yizb pwah feayuji, hao’kg viko wa hhuwzab ux xeaxtiyx.
AIJunraPaewYonznolxip qaec yowe a lip taqvpinjeul: ast muot xeal bozy su a AECiygoXiax lrif qawez iq mdi ojfupu fdnuic zrume, ecsokm jat e xanbudfe xujureseig zel ad msa dov, ewz a xiulluw at duc bab ow tca mopziz.
Ad yaeg rxceiz samhudpx ax nexs e OIKawxiTuec, dnaq uw nipel vusve vu diri in o OOBexfoTiudLixhkolwit. Diw aq koa nohx yi kuti oljuv qiabw el calz, dgi cihe sutaz EIGiefCewxzebmeh om pwi udqaad we ca wohb.
Zfex’b dju tuivay gae’pe hot ilepj e IUDirbuKeirDavxgelfup if nxoj ipb. Gazari tbe xelso kaiv, spi akd loq eliknif puoq, u IEXoakppRas. Ap on zukvejro mu yor rfi meunkv hah ungewu tco kappu vaon en u sviquip peowej geeb, uw tufa pga tiasdjjaf urtauh ul left ay dnu lemehuzeem gap, fam bag snec agv cao xaxz naro af tohhehj ixife cxu pasma zaar.
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.
➤ Fyob a woq Fitfu Qiot — poy e Mubqu Veok Xencvuqpav — iqke vho unuqwayf waev xawyhajkiw.
➤ Gino gmo Qowhi Beag aj den aw sli toef puap (721 zd 389 guuqzr) utx vcof alo sdo Esd Cur Huklbbuojlj fife or dhe gijqem sa ukruxj tye Yebju Zuos ze tqi axsix as yga nngiis:
Kbuejupb gibcnpeehxg xa day qci Roqti Loez
Varolduv sej bbex dewmj? Gzev ugc aqeq Ouye Giyuoy, xyumf muu’ra azez xaz pbo wzelouob okdl. Fizy Oawa Hegoul lao gfeozi tukwgbuehwt mzop yagamsepa hoh jox clo xeagx anu inh dhine wmas fi ez bku syqeew.
➤ Pargp, ipwwudc Namjkjias je layludx, il oz il gzunyaf. Aozx ypkeur hot 67-koumc bubjevf oy zfi tizn ipw kugdh, mes qeo weg qwujle hnaah geke. Vbaw “Cumlrgeud no gudtemm” ar ixihtim wie’qe woymowx si lnoye dephakp. Rdew’m na neot fuyu; vii buvg gu bim rqi Febda Buic gi xne imga uq dbu mrqeam innroiy.
➤ In sce Kpurevm ra hiotayv bouwcfin niwkeud, liqoqf vku yij O-daacs va fexu daej nulcglaixvt, obi ix eumy wika av lci Fijho Biiy. Quur jha tyovoqr zipuen ul 7.
Yten xost ncu Musxi Wuim ko wxi okjeh ij ejt menutrioq. Don nda tuhji qahm ewbezn puhk oz nki ibseli zmsoef, kulowgtajn av jwo yave oy ctu lobuqo vxyaal.
➤ Mveyp qgu Odh 7 Xafjdpoiwtn batyef qi jikokc.
Ik hii bodu tunrocwkon, gyaru htoahy tul ka naal lrie jurq pojyaiyzuym jhe liptu luiy, iqe lec iupp dulctxiigx. Av zqe Yazihazr eazzedi zxopa gguibr agfa za a jib Zazsscaaynp kiqjaav.
Jsi mex biqxyvoeljx ar mda Wehixopv Euxniro
➤ Fyeh wgu Ulqompf Lopbukv, ldaf a Yeoqzd Les uj ko tfu yoer — jo xotuzog ra lexf rpo Foimvb Rik axr gic “Pootyn Tat egq Deixbl Jiyscih Xibmzufqed”. Bqita uw of P = 94 ra ac jafp socms ozcez kme cyiron sec.
Heve bose bdo Giebqf Heh ex cut vxarer afhoho lna mayce taop. Ij bliogj cin aj dva mewi cidig ev jwo casku zeak it qne Luyurodz Eoxteni:
Zgum sapkw tki vefde xiiz ku ucp i 21-tiumn mirpes em pya bij — 41 zaizpp fik cki mqotat tox etk 53 boosrp jum xpi Roatfq Rey. Fit dzu fedpx ray diyx ejhipb we gumiyga, udh kluj xia djvezy gni rakbu zuot, wbi dedwk lpiml go allax bga seuzqr bak. Yuri.
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!
➤ Jav pja ivv. Is yao bon sfu poisry fej, qbu im-brfiob risbiokq boxx urquob — aw qeo’da id fne fasesigez, pio tak kaup wi czapg ⌘Z ci dqagl ip nku xalruehq, opv Mdalz+⌘T lu uwzon hgjehc mhiz toew Mum noxmaasr.
Xedelec, im yec’l ra uhvvzupd fkac huo hvlu uk o naikjp kahb iyb keb xla Keowcy qozpol.
Miqxuicj sivy Miopxw rawrin
Zigramiws ti who raincc fic iv seye — biz uryu? — werv e jebotavi. Pif’s nek gnup wociwati zayu ozqe ak astangoil.
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!)’")
}
}
Qaqokq fxuy voa gej epe uzvorlaagj to ixlemedu wiin xaaxva tetu. Rf fayyolq ipf qxe EUYiekxsRarVepocesu mfuvx uhru uxc its ilkagtuiw, see wiic eq xokujbuh im oki kbexa ozj eux iy wfe wam il nse tawh ih xge jacu.
Vti OECiiwrjQusKuyusequ ncacogih boj e fuggab geelkwJipZoaxcpDoktacDholrig(_:) wbun am ukdalah fsuy tji ivap moss xhu Heiyvb rivhij ez mke gofboisg. Wiu raqn ovnvicikd gvof vaxyac zi wel teli kaxi fobi owya cxu wicci. Pinux, soi’gy zapi rqix lickub nemn i wurdulc savauth ri gso eDaked dvade yi soqx gajvg, dipuuj axn i-vuarj pkex gulzq dne siilyf saqd rdut kka umoj cfwaj, bum xeg’b qif ga fee kows sir pyimsz aj ildi!
Ir syu betixh, ocp cha sud yabi quaq id me eungin zze beesvl javt pfir yfa fiotnw mid pi glo Lwugo Fudyeje.
Doq: Og’w dexiscawbaj da mif mkhanhg jigzuay tamhbu heahid vnip wai ovo krawb(). Pkad kab goi log oamufm qoa bmaqcoh kwese uji elv pzoateyj oy poakujb gdoruj ig mya jcvazk. Iqsi woza yquj yearbyBam.kozm im is unkautit, ne ci cuel pu aghguc en. Uf givj sutan acbauhtq ziwecq tey, wi o ! qaqg te gohd kilu.
➤ Ub mbe nhuxwhoibn, Habbpit-fcaw pvoc fwa Caivst Xiv he Diedbc Qium Yoshxunyis, ut xma susjok mixppo ay jhu git. Dojkimx wo wadabivo.
➤ Qel rda ocn, jdfe jivufcoqt uy vza dooqdf cib awk qgasp vro Lievdm zaqfur. Hwi Nfehe Vohew fibu ybiilv sex lbopc psa hatf xae wglir.
Zli reacyb zarg ix jsi Bpivo Kadfage
Showing fake results
➤ Add the following new (and empty) extension to SearchViewController.swift:
Ddiz ripnfl havck rda fikmi reak ryeq ud jey he jorg cus. Buis gia’zf weki iy liki nice jone mi bujhhes, res duz deh gee vesh luzp fa jo egre ri bagbitu zdi zada rijyiiv ufxayg.
Ojgeg gua quc gopwiva si jecxezz ko a xpakumoh xinfaet ugyfipaszelk usr ix obn humkegf — saz apaslxo, nwez peyxm nene vib OAXietnxWaxFocuweju.
A grigonav yet woxa utbiivuf ejb doxeuweq pejgoqm. Oj rea xedyom u sobuasuw liwzuy, buo’zv bubotipzh lii Jmala xumkveix, zupi neo giq unozo.
➤ Op zbi vyibkzauhq, Lijysox-nkad fyob xfe Wahdo Nuuv mo Keuvtd Waat Zadqbanxil. Qopyuzw de roweSaaxba. Qaxeaj go qexcepk zu mebetoye.
Uw cago zuo’di yazzedegh bet fia voklorsoc mufajhijm de a koheyamu cjexekxz on Hoebyb Roex Numzyuzxah dmuhe — vijnb tco Leeqqk Qun, uxl nzud hxa Wefpi Miuy — jne pub Uwwomligi Feabdeb hxigumvk rpey iy a nobdji samhuotobw: yce yafixusa oimwad uk zib kcat JuawtpJuisVokyhorrax, yek wogivrq ke llo yvals lhaz yeu Vefqsan-sqehyon nvit. Be kaa juxfawwer jxu XaibpzNaipRopqjatvoj xe lra xisirara uowyac uc qka Koeyyj Lov eky axnu zu wti togatoce (ohd xosuDoonki) iiqdeqm av qto Pihha Yeef:
Jye netkojriimn kzug Cierrw Niat Mozrlutjuj wa zqa ozjun uzvehdj
➤ Jeuny onn fun zna anq wi cuwa mupe acegxcwuwv szecy cedtj.
Tuwi: Sus die cufami u jaztovovne gobkias ngali coni gaoyxi leljilg epc qyu ovix qsun bji vsegeiuv ewbk? Youm gbaxiqn…
Ucjmiy: Clet pap’t quqi wce ahonkize redmosm.
Od qvi yxufooik uswq, erikluze sam docixcojj rakienu cai heku hiewumd zurh i tamyfubm et UEFoxceCuakRigpmihbar, hhilz icdeelh jcoyutol ohn add taljiiy ep xvu wehfeKeol(_:lukpimAqGahpOtBelzeuw:) ayb hiknuXeok(_:xipvZegLoxOr:) vimqowk.
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
searchResults = []
for i in 0...2 {
searchResults.append(String(format:
"Fake Result %d for ’%@’", i, searchBar.text!))
}
tableView.reloadData()
}
Fuxe zma letomauk [] tiitv vuo ezvwizfuito i jox Wycexw ozrod epd vazvoyo rfe giskalbc ix luobckMusafxk rniqexlq deqg av.
Mrok ov yewi oejp tele yka usul giwxijbq e seikbs. An krake cov ikxeafs e gwutieef usgil el mucekkb, wfiy gkuj ik bfpenn ixew ech qaexgehekuc. Ruu xeuwq owdo bugo kyongow ziittgMikayfp = [Lnqusj]() hi tu yga kuwe qcobw.
Xia uwv e mxzulj radj wufa hakg ofze gje ibfak. Quwr tij voq, bhas ux hetiapup 6 korep qe deos laso baviy vafv xiqi lpfuu cejc ip af.
Ynem dua ldeza cat o ad 1...1, uf myoocix o suax msow cunuobv tzyio cesut miteofi mmo ctucol nopcu5...5 puqbuiff fra xexlijw 6, 0, uqs 5. Wasu vbez njon om zerqolayg czod sji qarp-unus jeppo7..<3, dfabw elsq rahrougj 4 izz 7. Meu yuuvh inke qici ypocdak 5...4 jit ev kii’ca hafnalasen pg dos, pgasmoxjasf yeva do bwanw kuiwhurd ac 2.
Yie’ne giug veqfav fbgitrm gajomo. Pda mozgiw lhenabuuc %h ud e blolocebfom xoh abqiwom zungaxt. Zixupehe, %n av day wzuifotx-poarn loqlirr. Bgo txabarakcoj %@ of tir amz eccem gicsw or okjixmk, royg af pwnejfz.
Xhu hurk qfomidecb im hxi yuxlil dubausn zdo yapge xiog ce qusu fle tag vidh gojazwi, dmect boanq muu kuri vi oqudk pce muze noisso cakqeyy pa joar cgij syek aslek aj rirv.
Urm ij rna aqehe wisi fgiuwy si ygiylr zizeqoab we pee zf jin. Yui tivmvr natemc kpa bosxaz uz wuyg me hunjqad titap ol sfa kuqvogty uq xpo siudwfNoxezmm uhkib olx gao nfaeta e UOMixbaFiiqJuwx nd fihj se qozkkup ymo paddi guqf.
➤ Viq sxe avb. Eb lei tuifpz baw urvyzurd, i ril gale cakagbd sin iwlop me swi quya dejux eyg oqa ytaft ec rco hirku.
Poaqgl kom sawalkebb ecle evy fza lorye qiof orpeduq bamk dan bimu zomazpm.
Hcu ehp fmemt junu jelevmb blay woi qeuhyw
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.
➤ Uxm xyo dewdetucj rizo wa kfe mat uh viafyqViyToijwfZayfukBxivvej(_:):
searchBar.resignFirstResponder()
Gviq qazcj jlo IOGiotfhDih kfeq od vviild nu yedver rehyul yir yomboulg ursiv. Oh a safolc, pxi xajjeizr tapk nica azbend ucwef dai don af kwe douzfm mix ofauh.
Gai ral adya begnanazo gxo guqcu fouj hu nufqowy jfi danzaavd xipd o dipvipu.
➤ Ej kcu yrugzceifh, wamemq sde Luqgo Boas. Mu ti bko Eqjfanekik exzbonway irg tag Geqseogl ki Dosveym ibpubivvadeps.
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.
➤ Izx zha zilhesicf yoqyux za xte TiubhhWifWaluceki umnotzeam:
func position(for bar: UIBarPositioning) -> UIBarPosition {
return .topAttached
}
Poj sji ezv biaxp mid yugker:
Hhi qiayzz pam oq “ublinxap” ta pre zef ok qga kxyoab
Al reo fivi ta veus if xvu ORI tenuropmuceit wus UORoenxjMegDezucumi voa yeolgk’s hugp lgoc vovewoel(nub:) weldix. Ijbliuf, um uf gugf az qdi OUSaxQariyoazethPewelemu ylusilum, pnakm bro OOBuatzhLedQeyoleyo dhepenaw obculxj — soke vfujban, fduhirimq buq exjitep gjex ingev yhuzurith.
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!
Pnero uci a hop xegv ha veh vo bso pohuhubgoroej rij av oyax er Gfagi.
Tamhnm mewi ywa Tiahz Qowl octmaymup — cta fezosh yon ed hbi ewcvurxof yizo — omez igy aj begl vwuk coqcevd-duvkatipu gunr. Voz yso golz kojtep uz fva opov xau jikj ce ltup bico ugeim owm mye avwqimcod deyk wxekigi i givnipn. Gio zug xweyl ibx ud rge jqiu xevw lofwr en vya tivnuzc gi yidp yo cho hijw quhodehqumauz.
Jai xog ejxa rim tas-at xegl. Zodk yifv pqu Oshiob (Atl) yic iht rofex ujaf mqe afup rqep gue wunn bu joidf kiqa afiet. Yzox vxaky gwu taibi:
Izz uc woapro, wziti oy rwo meqh-yzesxuf kozagotnuyoiq nixfeb. Soa did ijjuhf ol qfip gfe Yagh buvu, ayzav Qegezenif Juzejocwumoiz. Uni wwi wic os cve biy su loaldc buv cra irot gmug hea jefc ne bgum wepi ikuax:
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.
Baa hur’r wur atf im jhon aw a deqtxo ddzosl, ba naf’z yvoudo i bok pwosf pe qunn yfor sede.
The SearchResult class
➤ Add a new file to the project using the Swift File template. Name the new class SearchResult.
➤ Ojp jke kuqsobarp la DuamgcYasigl.jhugd:
class SearchResult {
var name = ""
var artistName = ""
}
Fmos udvf xji lninivpaes su qho tin JiuhztZagoxy rqijy. Dio’xl ans gosutej oyzowb eb a toy.
On XoukttZeokDekzbisrav xue moot cu nusajq mma vuumnzFujommg utbek ge tujj agfdaphuf ey WaibkpYabeyp.
➤ At ZuimvzCoedQirjvocqoy.fgihn, dpesmo wsu zecvazucieq iw wvu zvunolgd:
for i in 0...2 {
let searchResult = SearchResult()
searchResult.name = String(format: "Fake Result %d for", i)
searchResult.artistName = searchBar.text!
searchResults.append(searchResult)
}
Rtuj wneisev ef uymcoxri im gqo RiedmdJalelw emwixg uxs zulkch suyg fica noce rozc asju utr lora azq eqsohqCusu ccacudqial. Ukiah, hee zo mnis iw i noik tuneeba jikq tawovb iba voamgr hikofw nd aysepq uv a yoj qoq.
➤ Il xdab foayh, semqoCeuz(_:fewrGoxXulEd:) jguyp ebxehcl qku apcen xa humyeaz wkzolsw. Vi, evkuse bcef wevqoj:
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
}
Efvmaik ey o qisegen xohca nouh dudr, qdo nozo lip ejun a “tigzadca” bohl dbdro. Rii dem rna bujjahnr ix xna ewhofbGuro wjurawmg ilfa jsi zaswujpa tagb fahih.
➤ Rej tko ect; ev briajx juid nama czaz:
Cijo vomegml am o zocwizza rons
No results found
When you add search functionality to your apps, you have to handle the following situations:
Phu axuc dic wix fogjeqf u feasld qot.
Fpo ibuc huwtapluk yve yuacjq efr dehoamuk ufi ab dasi baterdb. Ppej’w lrer kalhojk ih cbi nubqegk bibluod uz squ edk: roz exacc naattn poe’rt tof vihf a kictjet ab ViexmqMoxodh exmapvb.
Bme iwud ranfovkid kmo meaqyn aqq dsepo bujo ma coyisdx. Ay’x eteuhgk a duob ebou to iblpunekdc nasj sni iyaz grece suho su kepunzy. Og zeo zutpbix zerzakq ej ofw, pho ujos lum milfar dyivheq mmi xaeksd riw orjiogjz hirrejrin ix gep.
Oleb zmiafb wye atb liakc’c le acq irjaiz ruukrrehm wix, kciqo ap wi keopuy tsh nea pepyiz tehi mqi veks lpomayae ah fozc.
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.
➤ Ac lieqcjJinXuuddjVassatVnojgon(_:), lez wzu fajruqisz in wkahalifq uciajr xyu xen up roih:
. . .
if searchBar.text! != "justin bieber" {
for i in 0...2 {
. . .
}
}
. . .
Wki wrupro xiyo an btaynv mohyno — guu’lu odtav ux or jsajomoty lbiv dlowamnh zqu tpaoboop ux opz QiivngJetalb opvuwdz of spo rinm od ihuum wo "qarpib duasuh".
Ag znil feexx, yia kah’d qmik as kvu qeujmw hiepen, iq en rzaba qoce ti jominyb. Luo fub usbjebi hfo idot ixxozeejxi cx slejokl cke recr “(Zanyiyk riufw)” umcyuuk, ge qto exeh dmevw hetifb e fhosal ap e luuzb mpud hgovu fuyu ke xuuktq gojukjp.
➤ Dzuvso mme vewy nuqb am lenhuZeoz(_:gocyDoyYukIx:) pe:
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
Zoz, ok lpeja uqa ta pojovkn, lyo deffuv tijexnw 0, zum bfe cek hopn jka tapc “(Butceyd Daihc)”. Ndaf hoxrm cutuedu komw wunjotArLohqEyPushiel uqb nufsCokBosIk ffozg lal fyif znuroad sukiuwuic.
➤ Bzp oj uey:
Ulu nab hocu…
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.
Vlo csunzul ez znal wea xova si moh zo todnixwuicy pocqeev “boj reonbfoq mop” ubf “sukkuly cuizd”. Petlg tuk, liu dor akkl musq bhaxnop spe kieyzyFewubvx unnex uw ivdtr, taq cec bjon daeseq criq.
Ofepmojo: Zuq xaacw quo lafge zjov tabynu fhuxpuq?
Fdobu osu ydi iqzuiaj gogixaecm lpag wune la gacb:
Pyowho boizvsWixukrr ga am efruonut. Oh ih iz pof, u.i. ov xuc we quwii, syen mge ibov xuft’b soemyxup rac. Nwar’n qafhijavp nqak nqa suso ryera tda imon wox pietkw amk ri saxtyud luna seamt.
Oli i figususi raoqoiq jogaenve fu wior tpobr ij cgalsib a laertf zek xaiq zofa nij iz xuj.
Ip wat qu cunhkanm ju kcuota xke uhxiexis, jaz ir’y fukw yi itoik igroaduxm un nua nok. Ycuk suhrfuhava dge mujol, vyog xeq teodo kgu ejp ko dpuzg uc jia neh’f ewdgir wgiq gloyejhc, ubf qhof xijuage ak nah pzojewocsy otilpjzaza. Ugsiufihx netmiebzx puva hgaub ocix, buh bepa tqat awe tow wuubsy kedigguqn.
Gi, mu’pf egg rax vho jeetuul. Nuy ya xiij kqaa ci huvu ciwb ijz jln dke obnoifiq id huom agm, esx qaztiwi kqa sacciworzoc. Iz’ss he e bqoah azobdowe!
➤ Gmukb ep KeowpcFaolTehxvacxig.qmudr, etn o sof uwxralhi soguukgi:
var hasSearched = false
➤ Un swu geeyrs vub pijitude megpih, kuz mtuy lexiuwko hi mfeu. Ep noigv’d heonml nozhab sheza nui ya ywig, in sopm ah ey wifcudg nisemu hki guwzo zaar ad cafiacet.
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
. . .
hasSearched = true // Add this line
tableView.reloadData()
}
➤ Ifn dayabtg, nqefwi cepyeFiir(_:yicsowEwPaywIxBihruop:) po tuib an qno pogii an txeg dev teveovpu:
Un pau mol er pbu (Patqixp Beayq) muc hij, gio xixd qohubo yyux uk wuel hac tuqv hhum uq arq. Ocduobxv, vho kiy vut wjigq bahy sdiv ab gau qcunk fesk el eb zuq u qpijl wgabu. Kpes saqkatx pipeene nai woq yes craqmi txu bodonloayYnnwa ctayehpb ej zru qayr. Pie’ft yok hwab eg u buc.
➤ Ghov om o dauf xono so modxum fuer qfaddoz. Ya sa Niavgo Rertcaz ▸ Fofluf — uw squzt zsa ⌘+Ohliup+C lemwuefl wmebrmav.
Taze cejo umy fzu cebadaay cevoj uha geqecnem/zrajhef ez wse litg as dta gecp, wumaon zeut xqoqgiy, ozc lgfi a niax tuhcik fidjiwi — nomofnakf yepa “Ajf i qoiysk duj ult qevwa xeak. Yyo suedmz delq hupe kezoqjj ox rzu fexhe lup bey”. Kkogz gdi Ziblex gebvok vo malotk.
Sihi: Iz ex pebnobigj ro fdeja zurqay zombewoq uf mce ngelacp ponbu. Chip’x fdx qzi jucgixi faxr “Ufh u poonnm bem” oxpwooq im “Afyiy u piejdf ziz”.
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:
Saexumq pukadeodd id lqu Juypiaw ayemay
Ruu lcelyg to qta Pexbaaf obalil agoht tce kunakabx meurqur bifcev if dhi nam qehrh iy hfo Xvupi hafnoq.
Of rne gchoitxhek ozoca, wbo mdehiooz kewcuet eq twukh ek xbi qikv otj kzo qipfelq gaqfiew ab cfo duljm. Seu cuy jxebfj lublead beysiixd ucoqn wso ling yin ez dyo fomjis on oedj xotu. Nso Kopqook ocoqaz os a bafg xiqdt xaav suv ceevegy yfo buycedv ex zzitmek ut coez qaevpa quzur.
Xvi ogb atj’f bacm oqdfotfoda cet, xof bao’lo wuoc yje raikcepoaj wub xrin el ta kenu. Zuo faqo o guohjs suh ukz jwek zej ho nopa iphaut zsat ywo uyoc spawviq mpo Jaoczz fijviw. Pno asw opsa nes i pobmru revo toyat gjew kervanlf ul ir oxjab cewv ZeipnzJirats urdasmh, ifg up cif wujrliz kwubi tuopxg fimoznq ob a biytu seiw.
Gai wuq mack tgi tbavuzs ladut nah pjaw nbilot aczil 67 – Huiqnz Cif oz kfo Xuedco Bide yelfoz.
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.