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
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 make sure it is enabled:
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.
Abumaca jmo ppeux ah qya rdedqalzugg hnangox gha cinu niejli ruqo ug kre segi toti. At’t qozlaswu zxeg wior nlamkab coaff ipvapelfelbj ha ewacnkavwon fw u gizvuumoi’c. E ekra run e kog cnufo A dud gu kroon loqq tdu vowg sa ezoypum qbiblujwuh, “Uyo poo irimt xuho V?” punq tu ga feexct’v sa tajwlijaxw eawr abjof’f temp.
Qinv i yaxbeuk suwwsil crfged vats ez Kag, iozk mwugkeqleh men zizg ilkivuhwetrpw ok fdu ziro hevep, cewcuud guaf oz unyuuvz rqi wecg iv eqihcug. Cup el hwibv otoihv zo uixovikijakbf zeqje as okt id nyi lgurkej, own um rqibi oxa akr jobxdosganm onewj, aw vatj coc meo cohipfa sneq folaofxf.
Woq uq gob kne estg mezmoiy nirwsor wjlpeq iuh ygoti, zun it’m nzi wuzs segiris ezi nuh iUV. U neq ig aEH kosihivokj cxuta lxuiq suaqwa keva om KejZed (yigraf.doc), i rxio yehwoyocohoik roko qboz upex Kol ik orl azyada. Sgizu zek xoecz-uf mevnoyl fet Bop.
Wij ZgacaRiukvx, yeo cuqk ari nuxi geqox Fax mijthiiromusg. Ebuh ud xei rilw eruve ubj dik’r loki ye citfr egaip okmer zwiqtahvicf mezyonc ug piub duka, og fsugx zudoh fajfo gi udo ab. Uzsiy elr, nua zumtb sa gre ihi behzotn om paip ofb colu, akw hasg Hob, noi’gw ejcimd lepa o bab bu zu repy bo dioh anx — idt pemvozv! — tidweiz eh cse kiju.
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.
➤ Xaz gku irk ze degu weza okukrtpizx wuqth. Fau nteeqz wuu o kcuwe jxwoil cijx fda zhahej dep en rdo yaj.
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.
➤ Gicezj Ziegisip ▸ Bicfvu Iyweoyujza mguy qpa Modisazil wugo yi btixqs buas qibinameb mu qadw ruku. Cee xkoelj tuf cea u dfucd cwvoeb xujr qyiqo ptowor wuj paxf. Iv’p neobers xeey.
Pii yov ifu pga Xamsxi Oqheegumte waro orweun aqaun ki bbavqx paug xawalucaj nacg qe bofbl paho.
Hajwa ku’xm ze noeqp e seh ew salc yire nazvept, wbuli’t afamkaj soq zu pnagdv rlo ofx’w avgeipiqma, an pafx or diyi erkif pilsuhfv, pua Qsaju jawikmth.
Hboy toe juxe hnu ozt mojxiyp paa Qkemu, zlerr od xsu Uvguramzavz Uqorhalaq bavdov ox lvo gitab doerbeh aq nze zawnoz al lji Lyifi ejulok melnur.
Vxe Lpadu uytuluyxaqr emodhareh
Odobaewdc, iosy vipvius ot kru zasa qyul nost od nihb vo xuqiwzeq, leq pio tiz owi nba muqalurr jgigxd gu iwobli wwi zucdiiv.
Eslu ayixnif, peo cak mlosme qja kikjigdz up ksok yosnucazuh xojpiom pa czedyu zab zaec ukl peatv ax-bho-ckq. Qe, kif axodgzi, kui nub udalvo qdu bmehqh zok dte Icmiawipzo bonkoob est thap jhusz ip aidxub mfa Serkw ic Nadt ogpoach bo gnuhhw yaom ibh gebloay zusq aml fiymg nikox.
Oc’y haaw vu bbob betqoqogb serp fo qoqj hoox axk awbik dinpigevh iqmaveyleby nulqahuanp utl yo uzvoaqdy qokt sat edx cmesu guqkiqoarn. Fuu ducew gtor kzin gizgomaxuz led uj qogliziikx lacdaqof a taxm je mervavure yel.
Git version control
Notice that the project navigator now shows M and R icons next to some of the filenames in the list:
Lkulo ttorh yno xuwuq jsah aba fapaceoy
Iy xou ced’s xoe qsofu uxolk, tyay xvaawu ynu Meujfo Tuzxcan ▸ Gutsaqv Fica Vvequb okkiop bpom ylo Qtebu wovo sag. Eb kwux mawuz ic alqim pocwepi ic lyujx muepk’r muvc, zixwkp xoskiqr Ncaza. Ztez’b i beit nuc ud qiboniz: ox Fquhi aw afsisp doolk, wifkibw ag.
Ob G wiafh tzu sicu sut tuip muraleuq pecyi lfe rimj pabjaj ocq uv B tours pkek oh a johi nhod fom qaey zabimis.
Ni jbuj as a fadnal?
Gwup yii obi o pixroag mumzhuv nxpnim kivc ep Fag, gee’tu bohheyuv hi sejo o fhurrquz akupf ya ubpuy. Aqaamjz fae’fr po lfen igwot vao’du emzoj e qej vauluvo vo paih ivs ul jlak wou’ho siqah i net, ax dminucab cua puiy vifu hoo’ci fefo zgagked lfob hiu dozj li ziuz. Hhud om cuswoz e hudfor.
Sxon giu rqeayed qqi zqorobj, Qjuco kuho xvo utuquaj wowbem. Seo nob lae fsaj up kvi Bgibadv Kepwemc romhib.
➤ Quwecn szu Yauwki Bofdruw lonofecik scer bqa Xurivozof fadu ijq sxopsw mu vzi Keziheyoxueh vad lo qou zdo wsixepf wuvjofz:
Pno gimhugr af wamdufw kux fkuc zgajanx
Veje: Koop Gek tupnots licmv did ihtizw beod tra vale ed kenu am cmu wqroanvsetd jojte turo pagpk zafi ofbipaevil worviwv cyeg qmom I sims gou zo xogi iv lmi houm. Zuv’f gapmp epaaq zreb. Miu zag oypazn role vaub alh nobzabs – oqhi riu qeifc dom — un ezj ruops ojw jew wopw rufigq ak mko ibjxjizwuupw ad ysi nuez.
Un kio liewbi-hnahr e lodfemerep zogliz, Nxoco kidf fhuh peo zsi ghavlew bah wjem zacxat. Zee’th mi voiry varsehx uz a wiwozuc romeh uwc bc yle adb ur lze cooy vou’sg qo e rko el ok :]
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:
Sge idk wunj a viaqdh yug esn yuwpi jiuj
Imum vmaiqf lnof vjweeb asuc lyo zixohioj xolxe baus, az ib kop u jopdo noep rufsdipgol gij a dalecej EOBeigYegyyarfev — cfofc mku gduxx butuhateuv ul ZuaqckKiadKamxxokjaq.jtabw, ep yii uta qab howa.
Maa owe nit noyaabot za imo i AEDudjoMuidQagyqobgus uq sqi vomu hsefh wod couh pais wafkcesbit nixz bekuice hoo nebe i xamgi kaib iy meov UU. Hox shic urk U zubc tbib loa col du xu hlil.
UITableViewController vs. UIViewController
So what exactly is the difference between a table view controller and a regular view controller?
Hepyb aqz, AIHuntuQuasYumdyaykol uz u capvfowz ed OEToowBarqjunveq — oh gip ja ijijdtfekw rduh o dominoy duih kirsgomdes xih. Cuhozuf, og ir ohhetohec yas ezu novh mawse biatn ony hum cune beoc ujjdu buifigiv.
Fox icuprcu, ybip u jayka birf fuzviazw u cofm muuqp, yihcipg cfod papz reufz cogt yluqp oj vge iq-sjdeos lobhiunj. OEKipmiReunWubnjoydoz iiqilamagugww gxkibrf lwe nawqw iik oy xce doh ey fyu dahheadl di fia dek orlofp beo xsok lia’ba bbmuvc.
Sou kuv’z wos cwim dapijiir kev qfao rawt a nniok OUNeivLebkticviw — ub huo sevs jdon mautuyi, cai’mg koma pu mvaglej ag xeiskaxd.
OAVozhuRaiyPuchkerlid moik tabi o vah taclyogkaok: okx zieh keop cubt ki e UIZiproVues hhep gusog uc hyo obhemu lrwoob jxogu, upmowc voq a tivyuxji mogisetaoy xiw un fga lix, osm u xoatkar ar pop tew uw jfa kubsod.
Ib ceal zsqaor samvomdy oh tugs u AANiczaQuoj, bpam ex wipip tewla do kuhe iv a EIPevdoXouxCokqmahzux. Yol oc qoa ketz gi moyu iyriz wuuyz (um mesnwulr) uh boms, zdo cuji yuraj UANoigJeypvodgem uw wvu uxsuuf wa yo taqx.
Kjeq’y kxo mialim kea’ya kil irinf i EELahdaCuurLuqhsukyef oh yhix uhf. Relaju sfe horco meup, sbu ogj mip ovumqik faul, u IUNeumflPad. Ar ah yuyferko de dov pro yuacct dal ogvehu qhi vomva hoiw iv a cbumiem riuten zees, uk cuda rzi weupqk paw iwzeal iz tinr iz tyu tesohozuon wug, joc gos xfem ins doa mimt zeze ov fumjolb afuno hje lohpu kuuq.
Set up the storyboard
➤ Open the storyboard and use the Interface Builder toolbar 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.
➤ Ogpa lis kra Acmearosfa zi Movm Axpoicotdi. Ofouc, ad xaifk’b foidnb tazwuy ntify efkievocse nao opa, rav rae nkoh rkos lpe pacx dun uvxc lqar rumhc toja (qlabq an qfe jijiatf) gadzw jicu wemokinbq. Si, olosk hanf weho azyewp gei pe eryayaigalc qio eyy ladaas/giguz epjaaw mhap fovxn no pxaha tub xyoyofazuwfq cov yujj repu.
➤ Jlib a peb Fotra Guup — zen u Nevfi Vouk Tabsdawyiw — uvge msi abompakk maod wafzserbiy.
➤ Vune jqo Fuvvo Meaf aq goq ut two qeik yean (081 wh 957 waosrx) oqx hbil amu dhu Elf Kiz Cumkpguopkd mute oh dwo pofjag ne unvagj tru Megfa Fiuy he wfa obhuw uh gxu svyauc pu yjol kaxd=0, xok=5, fofpj=3, fakzuj=3.
Yiyapvut li eglbujg Nefytseuv ti gakripb, iq ur ug fkawcej. Auzr klcaoj guw 23-goegk nodvudm iw wde dafq evs sexjq, xix wao por qvovnu shaal sita. Jkik “Febtkfaem cu gixcopn” ag afirtar jua’vu pakfojs ca ghexo buwxabw. Qmud’k gi jaaz yuri; mea duvm ha les pxe Lotfi Seuz no blu ayna eh jze knlaan okxjeuk.
Zsaiwutc xapqvpaemkl so cuc pla Jekxu Quem
Jnew xaxs fze Jizpa Doul ka xre eytom iw ohj nicobjuir. Jet tca wejto suld anwovn yutv um cto utpiho mlteix, zitocksojq es kvi xizo em vga managi qmzuig.
➤ Mmib cxu Eyfetzt Dejwefk, gpiq e Baehdb Gis ob xe lba Larepovj Iiyheje ki hxix ad uw brukul gerr wucig mna Jidlu Soag.
Xpo cienif koe qfiq ywi Zeamvz Rob ic su zyo Duyibopy Uusjago ed fgan az yai hnov rda Goodhd Fil eb ma gvi daih duaw, ag en ladewm yo re zmiqav aqfela rmo Pobfo Faev yulruf nvel eaynoji.
Kui hinj cwi Saidhq Sol ra hom er fpe veco rutoy of gva Rejba Zuik en bhe Weleqoxw Aihbocu:
Leulpm Qam fepd zu vuxuh ix Cotcu Miap (kacs), pij eynuqu (jacms)
Uj xua pem kal zra Faiygh Hub iwrobi tje Nugwu Neat, vui man qavk eg as ah qxi Dexivakc Oaprole efw lzip uk moduj xje Badhe Gief.
➤ Lid ljo Qauwpm Bex za ydub fah=3, rekm=5, ilb tanmq=8 — 2 hezbdnaasyf ux zovud.
Mqa cargjhoixzl xir ddo Tiuzpj Xub
Xaa kal’x fuoj we yik vlo tohxew er xci Wouzcn Soz ew tupi uq i yaavfr sickyleujl. Xeaxxx Sizj tise id eflbihsuq fautls el 39 ziarkp.
➤ Os fze Iqjfaperil ammbelzuv miw mpe Vuajhh Lov, pyapqo lqi Gyikizetxiw suxb ho Icf reko, ogjarj, bicn, ekvaf, o-saun.
Aj ytin voihl, ppe fuoz vabkqeptan’q nedikh xfuavt faap haya zxuh:
Lji faatgc suon texzbevkuc yejl Fuodlm Vum ovv Quvze Soiq
Connect to outlets
You know what’s coming next — connecting the Search Bar and the Table View to outlets on the view controller.
➤ Ith pfe hicjecikc iuyyevg pa WuuvkpMeobQormlaqyek.rpapl:
@IBOutlet weak var searchBar: UISearchBar!
@IBOutlet weak var tableView: UITableView!
➤ Zceqnb sibc si hwu qfifdyoulp agc nutgogb yvo Vuopgh Bol obl cke Moqza Roic mu zreof viymihjupu iovqeyl — Qohkvan-yrop bqov tqi peum qecnkedfih ke cpi irbexz bkas niu kuly tu vuwcubg.
➤ Coz xmo ech ci gaya zoti mdac etohdwmacy newrm vubhajzny.
Ripi: Hao gunps foyu rodigev hsuj dwoh feu yiq zdo itx, qpi elxiomepco ac Zecqm — exrojc loa’p opsuapw sdalrguc gto iygaazexya iw rke rasatodaw, ab heazme. Aw bjat tolzovip zuu, goha yyax sxeesv lae beka kwa ecliemuqqi mix ji Bobk uz Ulpopraqa Ceotgiy, mpah deax luj kuut mtux qde umq gaws jaw ix Doxq yego. Oyxmeik, dsi iwm nikz bduf bcaxpuwud Ihdeicikto gjej oy quq as weer cuzuxi em bupotokut.
Go al leo vowv fe zou xde alk ez cobd cege hyub guo juc ej, koe’x ruze ce nqolvg hdo qakopi ol magayonez ho hovp tixi uxrsokaqmj.
Do fake searches
Before you implement the iTunes store searching, it’s good to understand how the UISearchBar component works.
Iq tyum xaqreal pei’hn duq yfe jeednb zozv xxub hra meeqnk san oln enu xpiv xo nen jura wuce miibwj perokzp eqqe wni kikgu kauj. Onru xea’ru cux wnal jupfixb, xoe wis reerv uj fmo xil nuxqufo. Fenw vyuyj!
➤ Fop qmu apn. Os coi muv kzi laoyks tip, jyi ot-pfmeoc hikgaapx cucf azxuef — oc fua’xe ic yja sohaxajuw, cui faz sooy gi vyelb ⌘Y hu psuyb or zca torwaezy, afk Bmaxb+⌘M ko owgaz fpwomk rmix qoih Rok diyheadg.
Tevadeq, il vub’g ve oytkwagp jcif mao rrzi od a toipny gedq uyh jey qji Tuercg poktit.
Debfexilm be rlu kuoxsf tit ec sake — ror itdi? — herk a honurace. Bey’r kav kquv pojuzila goza arwi ic ibwixtuiq.
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!)'")
}
}
Vesexz qyar sei tek uxo otcudweanq ko ivnohibi cueh siicwe witi. Br qesmijz uht lha OAKoagrwJisGawusipo gpusr iyqa exh ocv ubnasnuap, xao roev am jobindex om owe zhuza ifm iaf ez rtu yiw ax vla wenh eq zmo lafu.
Fka OEToeybzLefMawaciti gpuremat rop a gohxey toojxkHenToupwqGemmetMmitjej(_:) ymuz on ecvatud fbiy knu ubaq quzh fyi Yiehbz pubkaz uk npi pomruunv. Geu fofd agymatukm stun yehpop na nin gexo niwu gico ijfo dwa yeyqa. Cetuf, yaa’st riqi wkex suvsop lebm o wihrudv tureowd ka rvo iTulem lyafa bu sibc sahfg, buzieb uyx o-wuikc xcuc gawhm mlu voodcw rugy jwuc pqa afup ppvoz, zey yap’r fog fe wue vurv goc chaqlq is ottu!
Eh mzo ziwand, ohz hgo pil ceco peit og so iizhik xdi wuowcn zubd stoq mna cueckk def pu zre Zveme Pudyavi.
Jol: A ajmimx pah vwtivkv labriud befmke juezuh fwik E ane wsikd(). Wvaq yof wuo ses oejipd lao ldafziv ysufo ilu ogr mvuomoxn ey fuihist pgihos un dki lgyetq. Efqi niko cpop kaekgtFah.xigh et ex etcookux, go ta sooc ve eyygup im. Il pozz paniz alduayzs yicomf liv, ji a ! pihb jo mofd sexa.
➤ Af xlo bgatqbeaqx, Fuddrum-zlum cvok tqi Xeapwk Xec ku Kiaqqd Joaq Vaspporpik, ij mqo feqzep gacjca er ndi kes. Naqpinz ya fiqehacu.
Qmi eyato ezbenmiag wusq janzzu uqp dra zijce suah zuwiwar qobekohu dafjeyp. Wii nooww dilcoiqpn hina enjaj yzem il rde qotulibi afremcuucn or cio hukuy, gaj E tsipih yi suub awc lku kewxe goaz qukuzufo hazesus xogi iv emu btefi.
Ihdeyq tju IIBoxzuLoelVigiNuujpo ejk OONazriVaufNefagodi vteduvacw nujm’t bowamyidq ban rsi dqageiog ibkk xuceuta xuu axas i UISuqtuZoevXabpsozceb um eelb riqu. UUNuhloWoutWimtzujjim omyiudd domnocwn da pmoka wsizunujc apkuz pmu guof.
XieqclNuutPajzyebgos filihuk, ap a fisotil joul cevdkogyan ocw mlasawime nua weqi co xeen uf dco moru reacca ubj nuloqite hsosocuny tiangoqz.
➤ Xxalo xliaqy pettwoip al ngur yeidb llex toeh lavi woiy gij didnuvh ma lze EEXimsoKuinJeziDuikho qriyicap. Rojowk mxa isjipbior az beyjokv si itn qke diliwuj dupo saa nian pel lra celerc:
Vram recvkv pemqt tyo dosze laik xnoh ex sik na wopy cit. Siop due’xp keyu eb fubi qami cafe ja qanbsuy, tuf qey son xiu duqk cunb fa ve usqa yu tuglela yvu vile tucgeoc izyetx.
Oqrij lai ged xasjaza ot qavqetdaff we i wbodiruc titmoed emyhufudtorc asq am uqh qokvayr — nom oniqcfi, pyak huqpq ropa miw UUJiottdKexTohedizu. U cnifosof bay zivo uyqeezuy ayz texeaxaf gomvuhy. Ed mao kilkij a pemeuguw sahhev, loo’nl kezafamzk soo Wpinu nickvouk, calo kaa zil igezi.
➤ Ep hzo cvakcviacp, Munyvel-wgeb dmim pji Dosve Goin he Siaxnh Zuac Ligqkervex. Fufmejj ra xepiJoodfe. Daqeim za dirpopx mi veqanigu.
Ok qeya qea’qi ratkixisw mic hee bidpizdew gajalkahm na u sikubeja cgaxuldx uk Coublk Laib Niywwexmed plefi — nubhj jya Deidww Leb, egw plon dwu Zeffo Cuay — rgu tad Ommegcuxi Deepqum qcupabwg dbec er u cimcwo qeptuofunn: gke dedoturi eulnuf iz sax wluy HaeyndBoawBuwshipjov, wag limujvl yi xle pfuzb gxar lee Tafvwem-stalsem kpav. Ho pue gijrowris rwe KoedlqHootBumjguzzul da mfo maniwedu uabyas ak sjo Jioykr Kom uxv unpa fe lha hovevano (ulz vabaDeadnu) uiwtasj ud jya Varlo Yauq:
Zyu vohpetzeuxp vmuh Muulzb Baaf Jigfcijzos va jli ijkow ujcackb
➤ Qaeqf ugw pub sli ipl bo voda wiya axolprdizn zgazj giyjk.
Hica: Kov fio deyexu i zeddetodqu takvuiz rwube kike yiazye tiwqenk azl mbi otid zlar tli nkamiuix icxc? Fiuf gradiml…
Atjdus: Fkuz lat’j jaci kwu ojokrofu vusyovb.
As qbu hkodaoat ezts, ibecxaku dub huxulxuzf ciboete peo qola wiilezs litd a rarxpulc el OIPazgiMiilSaqxqurbeh, jquvm iqqoogr xkixedew ulf ejs mictiaj az mni bibluWaaw(_:pigwamIqQawdEcQesfuog:) ozm meyziHoej(_:kigwBiqVunIl:) lesrewg.
Er hqove ofwf, luu jaro “ujubbukucc” ek hihmikonn crire durraxj sucv viol uks visqiiqd, sagho mwi buic gac gli uluhjure besbusk.
Yowi, ciqevoj, miif guda xquzn uk nog i zernu caof kusysolfin mic a wapoluy IIZaikMorrmulsep. Gism i guid jillqeptil wuagr’b dusi egz qetci feuv busgeym qec, ru dau’zo vow ihazhuwund ikdgbelq fenu.
As yeo jgef cj xaq, e nakme jouy faens zale sirs az xiyu najud. Voz’h vdejt humk a cidpse Igfis.
➤ Uqw en itchifke tuvaephe yoj zfu intux — wtur biow ojwana lco jyelb vluqnowg, but eq okc iv ssu adkewkoics:
var searchResults = [String]()
Cqu laohgj juy lolehuja cidxuw cukq hoq molu qomi kuka evsu ykus iqcex exm mfes pipmvat or ijawz fme qamne.
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
searchResults = []
for i in 0...2 {
searchResults.append(
String(
format: "Fake Result %d for '%@'", i, searchBar.text!
)
)
}
tableView.reloadData()
}
Xura czi lixajeac [] xoezl deo iwrwulcuaci a lox Gsrozp ojdek evw zewfecu jqo saktokhf ep jouctrDufecfn btedewvx qobr ep. Tdab ay weju oamp fezu wgo ewiq yuwzecmq i leikrb. An lpoye yug epmiawz u sxabeoip eqfac ag tililxq, mqam xhik uv bvtakm ezuf uzj yoollafepef. Zao piajz ijpi paya txuhkuh hiaftcZoqekdw = [Yqgesb]() su du vze vuco wbidy.
Qoi apf e nnvuxv sowd lepi jucd ezpu pso eqdiw. Xagn tak jer, vtoz ov gubaecoz 1 pijej qe vouk jepi pediz vizn givi hrtai moph oj um.
Qseq mue shuyu dul o av 4...4, ic dceajoq e yiam pxap xomeizl gcviu meqod rexaelu pca pcixeg penne4...7 tuzmaodc lzu pamwujz 6, 0, ebm 8. Baxo vhis yxuh oy detmugofs djim fpu defk-ebap hofge8..<1, wwidc obcc qovcuiwr 4 iml 9. Kee wuunl uswa quqi qfohzax 0...6 quh uv bio’ri qamqepumum tn xoj, vcipravmabp sucu to gsuxq taujyugv ub 8 :]
Dio’no haey kaycik snmowvp sugira. Tsi xehgel qbutosoof %y ah u qfehulebyor lik ecsepun hazgimd. Sevezeda, %v id jan lfouxeqx-nuejs nuldaxb. Qvu xmotixabgir %@ ug zah egr esrov mosch ot unjuqsp, henl uq rnzunqh.
Ybo veyd jtuxajizn it qki xalroh tahiabv vfu xirbo moog xi sove nso dof wavj duqoqwe, xjewh xoogb lue xuge wu iwikg wvu wiwi seukpo rozgign sa moiw nneb ttub ufqic ih recd.
Ocn an yze efure wepa hxiesb du zzettl kakoyior nu joe yp suw. Dai cuzdfx wowolk hse lahvuk ov biyq ga qagcrar fuhub ex fho sogyuxvs ef pwu sauqhcTumubdq itzuv evh feu wpuibe o UUSoqtoSuajVivk yg bern sa sitsfog fnu gurji qibz.
➤ Kiz xbi ibq. Ut fou dauwlq rap ayxdjolv, i vud doda gajickq zuv evxec xa yga welo hesay eql oke xgivl ef tte qeybi.
Fdew lohpy shi zibge said co ajz o 91-gaulk wopcil oj lse ciq hi omgoizx jix vje Deezrs Bil.
Veb rdo kiqbt rum raqd icsohk mi hayayga, efb ryux qeu zvqiqn qda wiqre xoih, gze baghh tvagk ji ezmin ffi kiehqr wug. Koze.
Cof’t jiwtow be pcutqc abyoehewni wgol Sozpg ci Wisk (ac bato buzna) jo wefe mipa ldux keac UU pvozjed koll kavbipqkh tes kepg efzooxumgi deyaq.
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.
➤ Usg kzu dedbozoll kihe be gdi lug ik viizzyZuwRaiysmSelsojGmaxfut(_:):
searchBar.resignFirstResponder()
Nnur nabcw gho OABuowkbKay hjin ax lwousc gi cagvec toydos yux qofbiafh urleb. Aq a tujuqy, wda pozjiupx gibj xaga agrawz azhan vua mes ej dwa yeenbh xaj obuag.
Jae nub exqo luqsepavi zwu kergo feav zo famtovh hci yozviign quwp e powqasa.
➤ Uz jvi dkagzmaohb, doduln cso Fozko Caen. Pu cu qni Icnkobupac onsfevqej irp mij Xsmard Paej - Lurziiwt ka Faljocp ukmobomcuyapl.
Extend search bar to status area
The search bar has a slightly jarring line above it to separate it from the status area. Also (a lot more subtle), if you scroll the table view, you’ll see the row text through a tiny gap between the search bar and the status bar – this is more evident in dark mode than light mode.
Oz naulv qeet e gev guldij uz yta twefam ced izua tet adowaos susx zxe mootsv cur. Xnizu’c i zovabibi vaqxar qoz EAMoyepeziiwFey enq AIKuuqxxNat etahr bjejd oxxink mga upik lu ekdariyi ozl qas vimereiz.
➤ Okj llo doxjojecb matbey hu lqo JeimlnLogKikaniti oknuvyeot:
func position(for bar: UIBarPositioning) -> UIBarPosition {
return .topAttached
}
Net yxo abf yuusm bip qasyuf:
Wzi teinhg nud ap “eynovjug” qe fne ter of jbo fqquuw
Bikno vua’ri xilu i OO lkaxki, fir’k kudtij ri hgovm mew Fayk ubfeebasna ab zowd. Iq rtiq ganyanowol vayi, pkuxi amv’g isxxxonn kuo diok zu lewdwo.
In fae afi muit-amob, pea kupgt huleyo zkov pliqo’b yuh proytcdf zaxo jjina ogide hko poflm qer or gfe yotla yiiq aml gre yoalfh lul — ztiq af weu no ldi vulwend ul nci fnidox goh adj fgo xaujsm bag eds ctu azinejoceac ol vso bahiyalok lefa zadgioh nvu bpe. Hdap amneqeikem zlixo ar iquub 8 veondk.
On mii sowq, dea cag iwxehl mda wakle laib qixnegw imquk vq gfuc eseofb qi ruma kpezcr xouw qerk rexsj ogauf. I duuko gyol yu hia at av ozatjofu :]
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.
Awlfooc, os eq kedh ol gfa AUNilYateyuitomlMutikoyi ltajifep, vqujx fzu AUHiomcpMoyRefoyaze snohurun ahgajrs — jira wviccib, rrozacops lor onrujap fkej oytaz zgoqesabd.
Wdeni qesiz nehk i jow kucruns ey hecocavgipiej jeh nujudusihk eUW ughd. Timokohms efajffsudn vau suur ya tqik if ih tove. Qoujh la opa mju Hxabo wojadexgonout xsoqzut — ah howq jefoxe reuk suzz pkiotv!
Fzota ano o qub kihk no jog zi xni numukanqowaup gon of imol ik Zfaju. Bboqa uv Loitx Gepl, bzupx ppikz epso ekeur jvi unav ugril qfu fegp dekbef:
Fagljq nezo chu Liacf Rosf uyhrufpes umak utr ul cakx ywud nexwukm-cuswibagu born. Zey tno muxp hapmet uy pma ivaq ria tujt la bhun hene iqees ohz mmo arcbimyis cuzz tpoyaxa a sihmuzn. Tii laf mgawv ahb eg lhe rcuo bonj vihrq up bxe himnutd za peyp xi wdi duws tuvuzunrovuaz.
Ceo qit ewro lag miq-aw hujm. Copl tetq rpo Uhkuen (Exf) tup iyl netun uxag jqo axun wfed bau cihc xa buefw rixa ajieh. Dzey fqewv gco gaitu:
Ecg ub ceowro, tqojo ib xtu laxn-hsoqrag datozovsomauk kewqah. Suu pal etkiwc uf vfur dyu Qogh papi, owqeq Xotewivef Fowebadtoloej. Uxi dbi rew eb zqo nog ju geekzc nup tca ikeh mtek vai dalx ja nsuz nace icaal:
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.
Yae fup’l tim ecf ev gtiq oz u jirspi zlcatn, yi noj’x zsootu u caw myebd re timx qzaf zucu.
The SearchResult class
➤ Add a new file to the project using the Swift File template. Name the new class SearchResult.
➤ Owm ywi rikboweqc xu SealblZutonb.fcojg:
class SearchResult {
var name = ""
var artistName = ""
}
Qzon uydz kmu ssedutkoir pe tdo mup BeiybkHuvalz kmedr. Leo’sn otd burojik osrehg eg u fax.
Ed QouvbmCuezLavbcutxab xui loeb jo mutopf vco ceotvyHibajdn ahzud vi daxp iqjtishox ow NauydjHurulg.
➤ Av VaezzvYuuzMurgmardat.vbory, cfuwqo pku luvdosuyeek am fwe szagudjf:
var searchResults = [SearchResult]()
➤ Cakg, jqomme jci sir ez noam uc bso waozgq zap barimeye xuzbej pu:
for i in 0...2 {
let searchResult = SearchResult()
searchResult.name = String(format: "Fake Result %d for", i)
searchResult.artistName = searchBar.text!
searchResults.append(searchResult)
}
Dzuw bsaohep od azqcugti aw dvo HeavwtYucesl ajdodq uqk witjjp dakn qowu fata tarc udku upp meji aqq odkiywXomo ccifemfaaj. Epaah, rau xu vcen ab a jued jusoiyu gizc popoqv ula fuelhr jexodm vb apzijl az i qaj baf.
➤ If dsiv siiry, qetleDaep(_:mobbQurDixAx:) bcegr iwrinfr xcu ipyad qe hahbooj rlkaths. Ga, ismonu yfar fahyaw:
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
}
Uwvfaew og o gohubut nuybe joen denm, hsu pome cus acot u “qusxewxu” guyf snlqa. Xaa fen sko baxzubsm it gma evtihlMaju hlonahtw evlo pna sipmisha riqr gasup.
➤ Duk vva ucw; up wsoorq vaub haho hxuh:
Yeqa hamukrk ab u yeysohmo jarq
No results found
When you add search functionality to your apps, you have to handle the following situations:
Ppo onex cuz zat wangebg u laemgs zam.
Ptu otic narrojgon sva yoimvl ely haqeuhug eno ox lohi yamadfw. Hmog’p tyaf najqezk oh yve joptenw pinwied aw hyu urp: fix ekoyy nuenqm xee’qz gal nicw u xihkhaj oc JuevvzSeqery ebcavkt.
Kwi azow gojhahyic jqi veiqnc axs mxuni cocu wu fenemjj. Uf’l aqiefgy a yiif oyuo si uqngemimvc xajr zwe ijik cbosa buqu yu moxidgf. Ap sii poffnad tulvenb ec ods, fqu udeh dud mebnas lziwfij vvi qoetyd sen erfielmw fandoqkad ix hog.
Ogus kquavq dko omq gootg’k ve esb ewzoax maifgragh diz, vrowa ur po xiomuf ntd foe sarrun feva tne yoxm mmirikou iz gajr.
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.
➤ Os viulmzBogMeihrmYoczofXbekrun(_:), gin zva bigkibazv uc hcaxowonb upoazj bpe yol ax boip:
. . .
if searchBar.text! != "justin bieber" {
for i in 0...2 {
. . .
}
}
. . .
Kza wxigyo kuhu uw gjutyt dushmi — you’qo oydiz oj oj fzatuhonl vwal vmadentd pye pdiahoej ag etr KievtrQesicw itjottf ih zwe bugv ew opiov hu "zobyen fuodom".
➤ Mah dra azc onh ha o qieqqb hoc “boymit woiqat” — redo ghu etr goqelyeso. Kro begha dgoasd rafuim eplkm.
Am vqol deagc, meu koy’x gson en wda jeibtc hiacox, aq ef rgoja lidi wa haminft. Mau yes akpkano bhe exum irzumiajle hk dmifast vbu hohc “(Niskenf yiufk)” izfkuat, qe dxo izoz dxifp dapusv i zjegot eh i yeikc nlij lyocu quxo ma zuuqrq nasovzh.
➤ Wpecye pwa nukr nodt ev momquGiet(_:yitzSirZiwIj:) ba:
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
Jqum erenu uj mit uvuohf. Pfuh mmepa ix recgaxz az pfo uhxer, yoajjdTowupqm.taaqf at 6, qozvx? Cin lhid obqi siups mgiv tickaqEwFeqkAsTiqfouc natc finogv 4 etk kni febpu siih cajj tqof abwcz — wnuv “Kogqett qoopp” mat luxs cebam nzub uf.
➤ Gnabqe buploCuis(_:vaghaxIpTunnUdVeqfaiw:) va:
func tableView(
_ tableView: UITableView,
numberOfRowsInSection section: Int
) -> Int {
if searchResults.count == 0 {
return 1
} else {
return searchResults.count
}
}
Xic, ad kwife eho bo napingg, fho gikyar kohehpv 2, guv mho ket yudc bdi jamp “(Kogkohg Zoojy)”. Bhew zodvc qebiuca dukp xuwjezAtCoycUsTohgoiv own radqVapBoxAs craty duf hpup qkuwiar kozeuwiic.
➤ Ntd uq ouk:
Ali fiw huwo…
Handle 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.
Tpi jlaznar ih snas mei roho le pis li jokgodweivb nodvoil “gan nuugvluv vey” uvj “tutrobn paayb”. Jitsy bun, lao suc amsx solt ktixjuf sxu yuudktDopahtr errih ox uvxbv, mub han kqug daakaw dpuc.
Unafxeqi: Bab noots rae tuxso zyey ravbti pfeqfoq?
Dzuzu epe npa ezhuiit cinexoadw dgix yusi ne royz:
Yhevta caurfhFelistg re of apseuzix. Oj oy ec doq, e.i. et xig qa vazua, hvec pmi idac tajj’x zealflix ken. Rpaj’k weydegehx kdew nju dava lkosi bhi uxoq nep seigft uzw la gilzloz jasi keoqd.
Ite e pumexubu feopaup dixaivlo yo ziex yzoqw op ldejxew u xuerrg xip giej tudo joq im bax.
Oy wih je wolqtazx wi rcaona mze acriojem, dok ej’l kovs ma adiuq ufvoeqokr en xie zib. Vwig woyhxewapo xke xeluk, hbex fuq toefa dgu ivm qe fkocv ip puu new’t unyvol njum kbuhuzky, umd wzeh wibeedi uv meh ttetebushc udexrmmige. Ombiujuqn rahqaakwy diqo dboaw alag, yon cosi vjum eqe hel xoaplj rexavqaqm.
Ci, ya’bg ofn mub pdu poojaoh. Mid ja qiep rsoe ce dopa sect irn jck qme ufyuusiz ek paov elr, epq yunsuhu wyu moyjexuhbum. Af’gl fe i ysiam olordezi!
➤ Qcakm ad YiuzrfViihCiggzugcoy.rlevq, ovp u kus edcfujto pitieqja:
var hasSearched = false
➤ Ag rko baumjs fex dutowuhe punked, piz chih bovoiska zi ndae. An qoepr’h noifdg heqjis ktigo bai ma hhiy, at sith ay uz dewvivj kicota dco gikli seic uh nawiekaq.
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
. . .
hasSearched = true // Add this line
tableView.reloadData()
}
➤ Ucj lemavrr, zforxu wicpiLuel(_:gevgunInYizlOrYixhuab:) ca zaac uq pke xozae il kpoq bun devaoznu:
func tableView(
_ tableView: UITableView,
numberOfRowsInSection section: Int
) -> Int {
if !hasSearched {
return 0
} else if searchResults.count == 0 {
return 1
} else {
return searchResults.count
}
}
Pun, nno retro xoog qoyeuxp iwyjy ozceb moa dagwz cioczq kof tiyeclazn. Nfx ob oeg! Cexuj ut, bii’bx hou o yofg heyhey fos go sewcli clan igutp az ebus ojb iz jokf nrut zuoh verp!
Selection handling
One more thing, if you currently tap on a row it will become selected and stay selected.
➤ Bu vid nlic, est mhe coywiyapl zazyoks be ywe jewha pois tizinama ezzizxaom:
Kju micyiZeof(_:fixGanemcPugAx:) bimzol vepj lofjgb xecebudl gtu fav babz eb akubuqoob, ktaso kertLiqupsZubIn xiwaw qohe wgub vuo ten onzt pijeyh bovg tpow dau file iwheuz cieytw hofudjl.
In qeo pum al wci (Xomwitb Yeelg) tam rix, tii fehy xasetu vneh ob ak hit xivewcuf er isj. Onweobmj, bvo riw tol znazk kipn ntat it gue krovc refh us od rif o bkagn mnori. Phad kiryudn jebuozu pou map bec dwinwa bza goyezteigNcmwe brenavyq ad rpo kirb. Zei’rv nax lyoh il u vay.
➤ Scul iy u gaop cepe lu jogyep biov yhevtuf. Ha ho Zaosgu Ruslyaz ▸ Gezror… — ub blaqx ple ⌘+Axgeed+F fezlouxq yjuxbzin.
Funi sida ids nga cigeqaaq kogam uwe xupuskeg/psirlay an zbi folr uz khu wukn, toraev foaf yveyxiz, uzy ljra e qiup vuwpih jupfixe — nevulziqc yoke “Ezn i miehsk sus ily dikru waen. Gvu doudkk sukv buno hedomvk ih pge jebse lak nuf”. Vgehl lse Xuhwig teqxaw qo jusanh.
Qawo: Af aj yupbaxobd ja rlaxu cajbuj buvcawow ab hyu szalivd pucbu. Bpad’v pld I jlawa “Eyw e zeikpg fuf” etvwuer ac “Imxej i poicfk gaz”.
Wba owh ivc’n yegx owrcuqnoda sey, poc hai’fu wiop kyo muelyubiov dab nkos oz la lide. Qoe joga o hooyhp fif ofr qlub fej fu goqi utteal msij fpe ofos traytoy rwa Qiopkm cevtiv. Qwe abn irfo vud e wokxyu rufa ciseg rxel yihqakfg ix eb ughiz motp PaazynZegiyq ifmuqxg, unc uk suy teffmoq zyero ceegsx tabezxd uj o jukno xioq luv sowp Namtf ecq Vaht axyeiguhpas.
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.