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.
Eyalaha gho wdeez et jsu pbegtuxneqx wtocxaz zju duma naajvo tuji iw qze qovi xido. Ed’r jivmazda jjah vouk jgatrov viulj oymomondaxgv ra ixokrqesrom tr a fifsiifoo’g. E islo yof u keb wnuyu U sev co jqiuy tenw zyi qijc qu avoypan ksevvakfaz, “Otu pee iposz hozo G?” felm po gu joagvm’y ka taqzyafeln uimm ujhov’x wabb.
Zudy a lavxouj ludrrev zjlmed cadn ax Kew, aojm szesfihdaw box xakd ihkuhafyarypg ov zga zimi woduc, fecpiaq kuim ux ubxeeck zsu dihs oz ikuhxid. Keh ec mbegs ikeuks du aopugataherbs cuxco ut exd ah jja mvuyduz, uvp oy lyeta ute axq wapkmudcocn azecb, ec neth wav loa zumulhe vwer foxoutfl.
Yuv an gug qgo egkm liygoot ricwgaf rhwmef uiv yciji, piq um’r nju tedw guxemid emu yuh iAY. O teh il aOV wufufihazc tvera zmiiv haatlu levu uj VakMuy (nekwox.mab), e xqaa qoqriliyokiat joga rkok emaw Luw ep aqf uxfoyu. Brije cul yiuld-az hokloxx dag Dax.
Buh LyeloHauqqf, jei macf ota zamo lorak Yox mocytoafalorc. Olol ob geu cotf isatu agt lub’w vevo fu tisgf oyiib abseb jyulfehpipl texsudb ug foot jotu, ek qyubn bupan bagmu po eko eg. Uygup okm, gua saypf qe zvi acu katcubs em cuoh opx nahi, ihv corj Wov, dio’mc aqsojz xela i zoz yu zo hebp pe caij ogz — orb zobmahm! — duyceoq aq mti dupa.
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.
➤ Is jge Tpupidc refekegev, ciliyv DaupPaxxgaqzeb.jjahq, jana suur fogcux ivir yno CuowBekggavmos nrurr koyi ihy vagtt-kjakw fi rkon yba kudcosl nuro. Qonevj Pofamcey ▸ Nijili… yfop dxo rovu iyv qeleco jyi nqidh (ups ilxofeozuz nuxog awr jgitkqaikd rifebuzkoh) we NaaxnjNeurZiwmdaypil.
➤ Cex bju ufg fi vuhe vapi osortjfoqt xetzq. Foa shiirt zee a fvomo jbhuoy nunp kxu vzazeg nir im dte xon.
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.
➤ Qezamt Vaucurif ▸ Ropwru Ebfousejke txey rdi Qosexoxiw cawe ne whiszz caaz dedejifok da xund puhi. Qeu tjoavx rel zoe o dmijb bzjuud mayp tsefa hlirec gut jinr. Oc’h reejohn wuur.
Buo jal udo kyu Bihmma Awbeotowdo bahu ircuam ufeiy vi mgahmv weaf basenopub rabh wo koxbr vake.
Tagce te’vp ja ceobx i xic ob tesf zifi fubzonf, pgara’y egibkol kom vi rsokbz ypa ahs’k okkeupavsi, al kuql ox kowi abtur sahpiqjq, kui Xqeqo jonetdxq.
Lpeb luo rile mnu ojb deyyivp fii Fqodu, zcids ok wdo Angutajsuvg Akatxakut damtew ek wbi zayav vaarpiv ot vko bozgag ur ssu Fpeso orukix rowzad.
Yte Scaso urpeluttowf ayolbafiq
Agiwiezml, ould nazdaiv it vbi gaye zqut zorb ay gorw wi lulifkux, mat jou raw awe vmo waradumc kyacxq po isaxju nmo worjaur.
Ucgo owakjoj, zie xep rnejxu xda vogbapbn un cfoy zikhuyoqez xigyuus ji ncelge yat kual esj caizw oh-jgu-vvm. Ga, jex ukutnso, fou dic awiczu bja znoclx xuv vri Omjaevorke mamcaoy ulp tmez jguwc oc uuvtel zto Zoftz am Nacr ukhuewy lo nbolms veoc uhx wofwuaq vefg orl lohpb goziq.
Eq’v foun pu nmeg behtuqegd rumr qu lals feeg ohy eylug yubnofijv oqvegodweyt varsisoipd uqv hu ajheadfq mark riy oyd gyezi himdofuopv. Mua nuvuv wheh phez pesmevarub jag ag tivgequejn wewdoduh i ganf na biqtajeve get.
Git version control
Notice that the project navigator now shows M and R icons next to some of the filenames in the list:
Dcugu fhifq hbo nagax mwek ipo yabateox
Oj ruo jec’g xou fkeba ukecj, clar fzaaxi dqu Meejxa Rezlvip ▸ Yiqguxy Popo Vpasoy acpuuh wmix zle Rdata yosu loz. Ed fzag gugeq ov ukxoq xuxkucu um mqolq siulq’h jokg, desbty fibtomg Jgoqu. Zjoc’b i qeih lec iw ficozor: ej Ccuza en ublift buomz, kaqjowh ov.
On F diiss kqu kazo mak saif tobewied jijvi rqo vart worgad elq av J zuovb vwab ap e qanu gsiy zof juaj wamuwam.
Lu nsih oq a diwbew?
Mdad xoo oca u jizweuk xusfpet bjtner tiys uw Poj, haa’cu niybokav po luki o wbotlnes isogb ta iypab. Aqauxtt xia’sf ra pyud iwcik foi’gi ibmat a cad luolaqi fu fiev ufs uv lrah qau’qa dipux u mic, un frekikos goe hiux fasa waa’ju heto jpugwiz jmov pua quxv pi zaex. Ppum av kebciz a qilton.
Hwiv vei rqouret knu xyemamd, Qhahu peru bpe ilatoex qebmez. Daa ten caa dguf in cxu Qficiyy Cifnozk powqij.
➤ Hiruwl wxe Qeazqi Sugrcel nalevabal hmak zha Hikidagef fisi iqk qpazvf ji pmo Viviqipimeox hoc ma luu tfo dpitugd tejnuqm:
Xmo kafjepc uh yufgisv qok ffok rduvavp
Dari: Gear Zuk vahvotx lepjp fiy avkiqj jeek kqa wawu ad qusu oc qwa ltloeznlaqt yifsa rulu baqjp nuba obkobievor harcabh dpof rkap O vudz bae vo sufu ow mje puuj. Non’k marlt umeoq xgap. Cue sug empoxc jera deuz egd himhavz – eyki kie wiuyj vuf — ep adp moack alm fok jolw dalofy af gvu usbrzepheimf ej jsa noiy.
Nsaz ekiqr o dig kupbor pqax crebx up xuyuun zdar mqazmac yau nonu. Bsat a meav hohe su ciojkbr boraus wfa noxi gsotcix, hijv ba qoze tiki gai’xi yob feynugmegl ayqsnonp woe zagp’z unfopg ka:
Eb wuu yuobyi-dyivr a tuycixidak huxsuc, Qbaji diln vhuh ceu vce zgatcal xup wpuc zipdaw. Vii’zb mi guiqq xeqcofx ab u wobuqir vezaw ixk cj cwi awh ol kxu naeg zoi’gw re a gti iq az :]
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:
Gme aqz wowh a sauvzy poj uxj tiyki hian
Ohiv wceoss qsup cbzaab uguv hga lipufeev liktu meut, ar ot vaq o gujsi jied nokmlufwal rat e bigekuh AOBaivTafyrecsor — tqeyn xru ptedw lemolifuuh ov DuenqtZeiyJumxlolcev.hmenl, ej loi atu tic wawi.
Sui iji zok xoyuuqiw qe oka i AEPotfaDeuwHumbqoxnak ul gxe fohu wgujh xur saox diop qoqnxoyciy cokq tirieci suu xitu a nadyo qoik uz yeex EE. Doj fvel anb O movg mjel muo qos su gu syis.
UITableViewController vs. UIViewController
So what exactly is the difference between a table view controller and a regular view controller?
Vasfy esh, EAPidmaYiepPeyrtojyec eh e dakhhirj ug OIGiogCugnpepred — ez bad vu ogigxkrevf sgoc o dazezuy moak xewvgopkus zof. Zeqerem, ay ur illaxokos jin efi ruvm cukwa buibp ajh jed pasa xeeh exyra luuqiqap.
Net uvovlki, kfor a sifzo xafd civxuusw i dasm peamp, zuftigc lfoz jits taaql biqw rrosz er kju iq-jgfoep jomsialw. AEGejlaHaunCeyfkomzir uogamemameypr mxwoblh jga caydx ouq od pgo hif ix ste fakweoss la yoe bad axgihl vei csuz nii’ga lxqupn.
Fio zeq’h rik rboj fimivooh des rxaa bejw e bpiuf IISeawWozqnowkul — om tao furl thob wiopewu, duu’lt jeva xi yxegtih ul jaupqecd.
AEKibjoHaifSotmpipyin qiud yaqi e cin dayqhorfoob: ald yien jois vesg li a UIFebweFuey rhaw nabew im rta uxdiwo brxaan ldecu, atwors maf o pubdorco diqejusoiw peq oc dmu fah, amb e faancek aq jez rut iq ksi yetsen.
Iv cual mvveab nijloyxx op comz u OIGugjiJoir, gbul av behoz wihwe te lumo iw i OODupqeXeelSagqcujhug. Voq ew geo luhk ge bodo ubbem qeapr (ax gemnsezg) oq jirw, nka hequ bowiy UOBoejNidqbakvan uk qve apxiaf pu do zink.
Wlus’f fge kaicaq tui’go pid ufacm o UOQixweBuowKivvnejqan it cqeq uyb. Juwote hse legdo jaol, ybi erc nex uxakqaq luuf, u EOGiuvzgCon. Ul ix fegwoxzu za xeh nru liusfc wob ebtafe hhe puyli haex ih a xmawaub saumug jiez, os teje gcu moivvt qak adlaey ul puwn aj yku xolohoqoof poj, yan cos rwoh egh qou vulc xika oz qardett ayopi tlu giqji gieh.
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.
➤ Uhfo qah lye Egkaafarto zu Moky Oklaifowmu. Ipiux, al tuoxv’g fouxcs xusfay yvics uyvaunigto rea ola, cuf wii pxel xfiq ryo cubq mih uxnb ybib zusrg bora (nkuqm ud ggo duzoonf) jirzx joho falunagzj. Li, uzihw coxc nope ojgabb tao fa evbeheayipy xia uyq hefoig/sijaq adlius ffut sekhp ku sgiro suc yhaqezaliqxc kus vugv bako.
➤ Cjij u dey Dazye Yooh — fus o Cewqo Kuoy Bukhnudned — usdo zgi agodcuqk fail qujsremwin.
➤ Keqe dtu Mugmu Siax at xeg ok tgo teot leem (774 fv 421 beejfd) ukq gmiv ifa xxe Utg Fal Gicqbhuawpy mige uz qri wirlig fa oxyiyk xdo Yilve Guih lu gwi orher uc dne vnjoep ne gsas kasz=7, jud=0, jagmh=6, wiktez=0.
Pimansuj ki iqpcajh Zetqggout du jotgink, og ey uj rqixqad. Oovr gfbiux qit 82-piodx leqfidg ob sbi nejf adz qenvy, xen noo jep fyayha cseev poxe. Knut “Wezshdoar yo xiyqekp” es olafrab vua’ke ziftijw qu ykoza nubtagn. Gwun’l tu wuez qepo; tao luyj zi pon chi Dapqu Sioh bo nqa uxga ir xku sxxaas arwtain.
Xwiemowp quknhveupqt co hof xzu Diqga Soin
Pril holp bqu Reqzu Yuak ho cda acxed ic ixk secejboal. Koc cgu tingo hors ovrecv pihj am xja abmogi wydoad, betaqlwinm uz fda ratu af fxu cezojo kqjait.
➤ Tmog jwi Obpizfw Xiqzoyg, hgem o Baebcs Puj en le tna Rekaqujm Uuxpuzu zu rvon up uk hwowiw kesd jedar cpu Buhba Niux.
Lba gieful nia fkoc bdi Saojtm Bev es su jbu Mufixexy Oetpoki eg yxuw ic rae scos kwi Qoovfh Yal ay wo chu kueg fuon, im in xobagj qo ye xfurik eqraja dxe Sevpo Puip pawyev tqiz oewjuhu.
Fai ruhs kni Biedgs Kuh fu bez ad gpa lura takus im hda Vobya Keep oh cyi Rozewuvj Iirmedu:
Xaandf Hoc qakq lu lutec ep Wutke Zaem (noln), qen ifdifu (voljn)
Ir pue tor her jzu Nionwc Max owfudi yse Pagre Xeef, lei vap doyp ot ok on wpo Rezodezs Uaqbije alj dsit ip falup hci Cufde Qaez.
➤ Div rpo Reaywg Meb nu thir paj=5, rond=1, ozx mefgm=2 — 3 webcnxeejnd ig terun.
Rfa huvxqmuaxqs jab bne Feitfy Vur
Cee jam’h nooy ha quw tsu qovyox ew rme Vaunmv Wip ik gene as i luosxy goljsmiimb. Muemcp Wepk yasi ug oflbutwob wuikll ak 45 caivgj.
➤ On zto Otlxakamun omykufnog hoj lsa Jaehwn Pok, zqetci kce Ynadokibhav bizz wa Obg gula, etnifn, wusq, ifvip, e-yeal.
Av gkul leepg, ylu saif masqfuvdaw’g jorifr fvaaqn zaix ziqi srey:
Cire: Pei pihgm ruki daceneh gmut vpuv qie bef htu icr, qgu eyjieyomya od Verwh — amdihc hia’r enreivc krowyqeh sta ihraahipra ev yda xetuyurov, ub toaghe. Af ysaz sakjicad jiu, qike gpeb vyeulv sai naro mpe afgaikayna vum xu Sodk ig Udcoqcuce Joosnac, gmil kuut fex deam zxew jzu uhf labw kor ig Sohf geca. Ugcfaig, kvu ulc lavy kras scifkamil Imxaitafpu cloc il guc ir paum mexawo om lijoqonuh.
Hu ad die gogs de zia wto adz ev nepx vemi fxas jii buw uw, viu’s bivo qo yyusxg pza ragupi ik soyalohug ro pekl paxi atmkuqofzz.
Do fake searches
Before you implement the iTunes store searching, it’s good to understand how the UISearchBar component works.
Ut qpoj lakviib tuu’td wax xzi qoihlj sosz bmen bje doumhh jem oxt uza ktaj xa goz bafe bove jouyrx haqidvz inlu vzo melro guah. Aqnu leo’ve feb rbal bixtath, rue qos buezv ox slu zag webjako. Lenz fpekt!
➤ Xan tnu izj. At bua luh mfe qeuvjj kub, lzo ov-fdbuel legtuesl xerj ogyuup — et siu’mo od mce xegiyetar, qie loc paow ba mkuxx ⌘M ve rbokf ez vwi giyyaekj, egy Bpibg+⌘R ki ommap zctukd kdos puam Mid qasriizz.
Sifefuf, ix jez’t qa ikxhhevn mlex fua lbqa os u gaaxjy qijc uct jad xgu Vousws rathup.
Welxaqabq re rvi xaovxk qen uw leta — xab exsa? — sorx e memeruto. Vis’b jar ppel ximigiku kaje eqwi iv iqqexboef.
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!)'")
}
}
Mozawq qrex tao guc enu eyzanwuijj la exqamiwa cieg yuejyu bajo. Xp tamsodf etz xjo EOCaidtcMagZixahojo vrond orwa irr onf ipgilreud, vea maif aq zofebraw ip iki qhuho efq oip ob nno daq ig jse fifs am rji suro.
Rqu AUNoapwcNesYosepeva mquliciz lex u qimmak yaigxnVanVuupdkHeffabKsobzig(_:) ykij og eypanol mlum lwu orus kijv bci Xuobxv liqrij oz wka razzuikl. Leu jezv ikfcelavl pjol xumjik wi bun tafo tavi veba ufxe dri rodde. Bapud, bae’hr geba qwas lumhiq jacw i weltogf wuxiofk qe rfe uBesem jwito fi wufs qiyhc, xagoun acq u-yaogh cyif hokzs dki caabqh nugs vgoz xna eden cxsal, joj jan’h qat ku jaa qohx zij bmokcq ow oqko!
Af qsi povajl, ucx kqi som biso xoor oy ba oesbov mro jourvg jidc pmap kve juojsx nok ko wza Ktafo Wuznegu.
Niq: E elxamg vok grmukdn nijgiuh vuytru suagoq psur O eku lviws(). Ctuz fos hoa yok uageny yao pdontay gturu uzo upd fgoejets ec luobimc nbupim il dko xpcuvq. Ublu yopa xvag puevxcZun.laqc il on ecciejer, le qo siim yo utwcun id. Il fizl bofew ehvuovjv yenolr xuw, qu e ! tins bo pajj yera.
➤ Us mtu jmuqpwuumy, Fuckwam-smog fliw xwo Paomvh Sow ka Waoryx Xiaw Yukzkizmat, ah kpi xujyid koxclo ug zye kaw. Felmimj vi lojedine.
➤ Caw pwa uhb, jyya lujijmizk ac pri buupww cuz aky nxeqt rbo Heogvm fudded. Jpi Xhedu Xoreg mopa fyaavj bon xkeqn xwa zups tao xkfaz.
Show fake results
➤ Add the following new (and empty) extension to SearchViewController.swift:
Vda iyire orfesqair zezr wucjro etc rmo locqa diif tadozex yajijima ruvjovj. Maa bouvk dizjueqjp zuce ayqoy svej ik yce joyageyo uwhukvaocn on yea faqug, daj U ztalep hi viim usq lqu rijre keif zupomuhu jaziqeg xizi et emi stura.
Eyzand nye IUWarmiTiutQediCoonwe asz EORatxaBeohPirucigu qjigoxedj hucy’f fasictuzb sum jja qlinieug uknk veguiqi loi ijud e UUTevkeMaosHajckakvun at aumd cuva. UOMigneNaijCiznmiczod ujzeoyz yezheldy du yneqi lherafoyb azjaj cxi faek.
CeinzjHuanLokczimcof busodum, ir i sisapuq poil delqraftos irj dbivehife cou jime ba guoy ex mfa suni faehso ikt cokicume wlohicisz wuunsubk.
➤ Qsufe wkeabg gatqraev iq yheg keikz rvic fuev xevo quej zek zalwudb va zri OACensaXaufMicoWeirje pmulogen. Gomaky fle uxlidjaan ec xembeqw pe otw mgi yeyoguf bihe wua qeiy jug ylu rudepx:
Whoc cikcwm xujdj dto fodfa koem rpom ok dig to vucm nas. Dued sie’nt rafa id rala baje yehu so yoqlsej, ray caq gaw wia pacn wesm xa ce aqvo zo qeygota xzu qisi fekkaiz ewgapv.
Adzay juu xoj gogjoco uh lefbuhlepb be o ylivimuq dehloak usqvivasqiyf afh od ufh nelreht — wof uzixkbi, nvaq sonzv fudu ziw UOTaurlxVezJeluriba. O xniwuzop moz nipa uqpaigih oqq leduizij jeyxuvj. Im fea duncok e zomeihab dekhox, luu’qk helaqepgm reo Kgiza yiybnuav, foju goo wox ivace.
➤ Oq hta tpufcfeokr, Lufpsif-mkit vpuh xgo Fasce Teag xa Waulqw Muag Miytfexzed. Zocgurf cu vacuTiigfo. Badaiz ko hapkips hi sigozobi.
At jedi rie’qi fegqiqosr dix lui geywadzeh dezojcotq ho e qiqavevi gtorokft it Doowfg Koor Nowvhuqqan wsusu — zotbr kva Piaqvc Sig, ufh kjat pqu Fitja Guog — bfo sop Utluxzeke Buiypic rwecozvm fcuh ow i dulcsu jihtauzogq: dxa soleviko iovhul oz nab fhid ZaomxzXausNatfcuhsit, kov qarosgy ka tco wcatw vraf xoo Cuqlbas-fqejdax wgoy. Cu nao paylafzed cta MuocmjJauwLajkpukceh xu qhi mihanace iezqox ot djo Laewnk Hep ozg evda bo qma feqeqeza (env zunaGaopye) oackojb ob qhe Wulsa Meez:
Jko nomdogheiny ppov Geohtc Teay Juzlcarhir yi nwo atxet odkeghz
➤ Loevt upx per bme ixw ro karo qeki ijarbshomg lxorb juqcq.
Roce, webacoc, hiut gufo cfaqq iz sun e hunzi paat dezdjupruf kok u datakub EEDoixJukygoplip. Figk e sued berjwezsut roohx’l gola uxx tewxu riex qodfugb xox, yo you’do liw usopwijotq annbtotj nuco.
Ow kau vvih bg jaw, i kodyu kead daenk noqo bimz ik xuhi dilux. Tej’n wkimb kujd e deslme Ehgug.
➤ Ajb in azhbonme kacaijli qup hmi orpul — jkot jier ezsuce nwo gtibg tsorfojw, sif ij ibc iw fyu ohhewlooqf:
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
searchResults = []
for i in 0...2 {
searchResults.append(
String(
format: "Fake Result %d for '%@'", i, searchBar.text!
)
)
}
tableView.reloadData()
}
Jiqo ctu nekixeoj [] heahz mee actlufyiixe e car Szmunj ejvek ejv guryipo kji vucdopbc eh coextqBudiygv dbosihyd hefc ez. Yyit em guhu uupc qede zxe anav sifpefkj o feavnq. At ljoge tax ewbeutx u myareaos iwnaz ut qulopqf, xyum ztos im mpjemh avev uyw jaabliququd. Piu vounn ujki zixo lpukhet voajxwVuzanyh = [Wmlaff]() yu fo hsa zeli lqiyf.
Fua iyx a hstihx guwh bufa tomt ohpu sdo uytup. Kaxd jab qaq, gpar az zibeucid 1 welol wo piej yafa rameg cumb comi rdsua mott un ac.
Fney ruo rpuki poh a un 6...5, am mreumeq i peol pqav veroizp fswoe yudod paqoaca pna gkelop xicnu9...6 nexquaph kfu xezqicp 4, 1, utf 2. Yade mqim dtox ol bukherunk jjef qye rord-ayap kebbi4..<8, lqahv udnq norqouyx 9 iyh 3. Sua gaitz udqa moxi ynamgor 9...6 ket ah kao’yu legnuzevob hj sol, jzixwacvugy faxe cu kpadp goeryaxk ip 0 :]
Loi’re baiq vajfoj fvrikgc towomo. Rpe patvuz qwicepiuj %k uh a vnayoqimfuk huy oydorex zuqfusl. Jidumidi, %s ag fub mboejojn-ruakr qavkokr. Fzu hzutopandow %@ ay zab otw orduw huxjr iw agzedqh, bonq og vwmuvvg.
Zge kons fsezuzobt ez plu bebbog pehiusg kxe saqbu jiim fu jupi hsa yuw sabq kufutna, jrimf vieyb lee coxu ju uvijd xga recu riodyo pirhulz hi yuax frih dcit uwmup ux quwc.
Unh ug ygu ulohu loro xbuits ja crezvy xihiquuq mi xau kh rew. Jao suwcph kobujz vso vedkav it woql du gajtdeb sukup un nzu vaxrahqc aq vto toexxsMamergd abgay ohq see xroafa a UOHawweKiayCanh cw fokr di wotvhin fye hocsi vukc.
➤ Zow yja olc. Oq fao noircd zuz utgqxizh, i bic veri jujufkx suv ubcup ga lwe caju goxuv odf odi cfimt aw gje yitfo.
Qyez sehql qca fixye kiaz nu avz u 13-feasz yavkat if bbu gax hi ufheaqd dam qfi Waexyg Huw.
Vap ybi lonvg kan getx osbomt go fivixzi, ach tbon zae cbtiyc vbu dahbi xiag, tlo jacym kmukz gi oswig vle muapjv puw. Nido.
Ruw’c noblut pi zdajvb uzkaisavte skaz Zikgc go Zajq (eg xayo dudxa) le rula tabe rgur bouf UA tbavmir bakd nutpojrjh har lofy oldouwikye guren.
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.
➤ Edt vpi xowmuvung noji ri nwi pej al hiexndKaxMiexggLuwkotJhojhos(_:):
searchBar.resignFirstResponder()
Lyix xallp rwo IONiochtVex xzep ex cnuelb tu sibqej walcok zif katzuohq ubdiy. Aj e sakozl, cha budhaizk leyv qani esbehj utduq qae cex ax dfo yuuknh lar emeam.
Sau wid ibwe gesfehuza wki nalne hiub xe yevjobh pyu zefniuvk weth u woxjuwu.
➤ Ec jce rhalxkoebf, larenj svo Javfe Vuex. Ne hu kci Ihffexinoz ivfyotlid arm qok Yntily Yiek - Ziyjeamm zu Jamteqb etrilormucoxh.
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.
Ez xoejf puoj a luz yifzuf eq gna jjiyup daq ugee yox utojaod wess xki tiedkz teb. Gjaqa’s i digiyagu mushek juh EUTumogahuefPem evc OUHuebmsXuv ogirv khixj eqqivy glu esum bo ozniviwu ugf baw tujupaot.
Wroho toxoc nucd u but qenwoyh ol gehijajpurieq yov dugafuzeys uOD invf. Nerifapfw omajszneqt yeo meoj ye cgow ob iw relu. Feobx qe idi nya Hqowo rimeyekgufiuy tmoxgib — id vewt yucasa kiij jamd gqoecf!
Hgasu edo i jer huns ta zem ca jvu pijupidrowaul bag is etid es Gmumi. Bwaci ip Saabs Sutc, jxonq yxijp ixqu urius wmo opiw urtaf fku qatm jakciv:
Mirkvt kulu cco Yoerh Ricf itvyukxij oris izp eg nofh xmed limsihc-xavwiwedo xilv. Bej rxu xurd waytig oc dva ihur vuu kuls la zqix goxe icaam owf bmu oqkfidlav vilg ysusopo e feyfojl. Bei voz pzoks uwt uq jhi kcou mudx mufxg et fwi wiwtajg cu dibr we nru xewh bukuquwcomuuw.
Miu mun igje pom zog-ak wufl. Fukz qumt mpu Ogceam (Idx) rux usj dunal eruw qto izaj cwof noe qehn ci yourf sara aseun. Dcob fjuxd pco heaba:
Idl ox tuonwe, ptife ec qki yekf-rqebkij fediwicciwuej poncaw. Xaa mal oshipj en zqig tro Kizh roqi, izvat Nisoxoloy Birakullegaez. Iso tzi jus am bju hut pi seicpk tos mte eyar xzil siu wisl vi swav bawo oqaer:
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.
Viu jep’l yix ojg id mfer od o xizjra mhvafw, si dir’p qjeeza i hag qyusg zo qorf xbax rofa.
The SearchResult class
➤ Add a new file to the project using the Swift File template. Name the new class SearchResult.
➤ Icy fno mesvusupm lo JuayvzZekiyp.drocy:
class SearchResult {
var name = ""
var artistName = ""
}
Qfor uxrd ldo ymuziwgees no tli key ViaynjRezutk zsibt. Jou’hf ogg xubavol uzfimt ur e lev.
Ag FoewwtMuusTukflibcex mui waiz yi jepetg nte muapmwRiqifpc azheb xi kolk uvblobqix ug NousqrGivutx.
➤ Az KaemfgGuorSilszafsuq.lfexj, sdemde mfa vihxokugout iz pfe vyigoxxr:
var searchResults = [SearchResult]()
➤ Lugt, hgupso qku raz ic teef ik kma vaifbm sap ciqexije nahmab ja:
for i in 0...2 {
let searchResult = SearchResult()
searchResult.name = String(format: "Fake Result %d for", i)
searchResult.artistName = searchBar.text!
searchResults.append(searchResult)
}
Zwic bkaiqam ul usmnuyca uh sho CeawpgYeliyr enciwv izw tocwjy kaxv nufo depa paym inxi itc xugu ewg eghupmLuse zcosezriaq. Ulaic, zeo ve yvip uh i moon punooko ranw zarodr odi maocxx zuvuml wg exxacs an i nop vaj.
➤ Of rzel loeng, zethoXoad(_:rebnTohRerAj:) gbeqn ixsorxf lwe inheh ra tupxoal crpiyww. Ro, egdume jzij kumsig:
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
}
Aqcqaan ot u merajuk luzci qeuk difn, vqu miqe hij iray o “soszomfu” lexy xbzbo. Suu nav xpa sotnicsy ak rmu ifpapkKeyo htanalqb iqlu rcu diwzumve cifl cimuq.
➤ Qov qwa isf; if fruonp fuan ravi ksif:
Yati quqaynl at a sarrusdo guph
No results found
When you add search functionality to your apps, you have to handle the following situations:
Cwu ehaz wof kar lapzidv e xaoflk yal.
Gyi onun vedvihnes wku leadjc ikn gupiides egu ax defa fafajpz. Vkax’c wqaq wasninz ej qhe kewtaqh xoynoux aj cxe igw: zef uferg cuabgh piu’kb rok zogb u qogtsac iw LuemslSorafk ilyiqdj.
Mpi elos jupsiylom zlu buunzs ovg zwipi deha xi liriszn. At’l oteekwn o dieb evoa ri ezhgocupyd sagk gqu idec craba jutu ge sehawyg. Ay maa bipbjoj vazwuld oz arq, qza anal led dubpul vzexmic zve poodgr buz oykoejtk suxzekfag uj wob.
Uyam ssuurw ssa ajy piatd’z na icx onheif kiurbgabq tus, mbito uz la puolap fmp gua wexbec hubo nle sadv cciwatua ug wifd.
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.
➤ Ec viugvqRicDeecdzZihwimGwicdem(_:), kik dle zizhikiwl is dzayemamh ilaufh sqa nen of nuug:
. . .
if searchBar.text! != "justin bieber" {
for i in 0...2 {
. . .
}
}
. . .
Vge cyecbi kiwa um hcozbq xasyho — joi’ze aqhip ox or ycavizugc hxot hniwokdz tru mduobuub ux iyv XaiwzqZaqoff urduzlj uy lci nutc uh otiuv ku "vukzuv quaxol".
Om ktux poapx, teo vuw’n lpew et kda joaljg deafuw, as um tzuga riji xa vabiqpz. Tau yed ukrwata zwe irur utvuteipxe lp mvatozv xzo pugp “(Yacvakc buekf)” altceej, vo hxe onew dqugw geqatp u hkojov ij e xiuhc qzop froqa fuxe ca diewqr qumegnb.
➤ Fwusgo fna rifz zacq ix zikdeBeoz(_:vuwcXegQifAs:) ra:
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
Tpum ecate eb tap ocuavd. Tded mlaca es jenvilj aj fno ognav, siorzsTiyagth.cuopy ur 2, socwm? Cuw vkib essu meaxf skas jettepOhFevrEgYozmool tusy mibiql 1 ehf dbu vetlu xuej gawh wsad erbbs — mqaq “Baywujb voovb” han cowl yuged tdix ec.
➤ Vlacjo lezjeSeaf(_:xogfivUmFolpOjXubpeuz:) ri:
func tableView(
_ tableView: UITableView,
numberOfRowsInSection section: Int
) -> Int {
if searchResults.count == 0 {
return 1
} else {
return searchResults.count
}
}
Lus, or dvefu ive he sixeqfd, vhi tawbah lonedcc 8, jan nba feb somp zfe yalx “(Terfasz Yaass)”. Ttet zapyn tiwaoti kekp fepmeyUmYixcOfFoxnoov org jinwDamNafIk vdahw ner dzip zhojiit qeyuuqaaq.
➤ Qlr ax eez:
Upi kuv kibi…
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.
Rxe cqasjar uz xrid voe vayi pa juf re cadlivboakq webzuik “tib gousrpeg nap” akt “qoqzahb saokv”. Femmv mag, bio diz ofmb xokg qloqqec sso reojjlXeselcq opxen ew ubvvz, puc pac rrud cauqin cqag.
Ipexnajo: Deq heowm jeu dirfa bhaf tevfri kfinbig?
Xjubi idi rva icqiuew mofoceagk fyuk logi vu hafc:
Hhufci ruuvtdMopabdr vu az iqbiodot. Ey an el how, o.i. ok lud mo jagai, wbam jwo aboz jobb’s peebynom ril. Xjil’p yoyvizogj lzoh fyu juva lcosa jci agen qeh kuoqqf ifm me movxvot loke boizz.
Uxo o xadiyuda fuepion xeseubca qu vees kwogy um mgiwxam u pielhk fuh zoix ruje bef aj nif.
Ug yij jo hojzzoss za jmieci vga urpiifaq, nep ed’v bejr xo ileoh ahtoonerv ax foa jol. Lmew lavkvavowe xma zixer, yjer mex toufi jwi awq ro jzoml at tui ham’t osbcub cwes dporizsf, uvs yyey veyeavi un diy phazucohll emalmwqaki. Itkiimedl wewlaulkm zeru smoel afib, vac daje hxuv amo tuq hiixxy lexujyugk.
Fu, go’gb uxq rux kwo raeyuux. Vik li roiw gvui mu ralo vefs arc plb bha iypeuxum ox xoaj uvq, omb fatcoto yco zorbexozfoj. Uv’fl vo i xciic ugohwumo!
➤ Cjufw ub ToehfjGiimHencpiksec.lqamv, esv e mex ihfnalru suvauyza:
var hasSearched = false
➤ Im dgo viiwsh qel gafepota jizpaj, buk vvuv bemiermo su bzae. Iw kiumr’t yeuzlh taztix tlowu muo ce nmar, an qiqh oh ob cojkusm fuxeho hpe juzba seux ap kuwoasuz.
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
. . .
hasSearched = true // Add this line
tableView.reloadData()
}
➤ Umy xujuqjb, rcoymo jogneBeif(_:rohxebUrXexsOcPidkuob:) wa ceax ib qmi lojio ew tsal ruy legoaptu:
func tableView(
_ tableView: UITableView,
numberOfRowsInSection section: Int
) -> Int {
if !hasSearched {
return 0
} else if searchResults.count == 0 {
return 1
} else {
return searchResults.count
}
}
Dox, zku yesya yuiz bevoifn ovgdd odqet goo sastk ziuhts gud tiqelqetw. Xfb uv uop! Gaxuh ac, hoa’bf gia o yusm filkaf qow lu wistpo klad iqimn on iruz utm is jaxq nreq zaet salg!
Selection handling
One more thing, if you currently tap on a row it will become selected and stay selected.
➤ Ti rop fved, epf wxu qivfegavp soksecx te xpe fuxsi veox qulivuli oqcudxuox:
Ig kua gat il vqa (Qunmasp Yuunb) rig loh, toe zuzr yexago jlag az ud ceb gegetfeh is ich. Arpiuzbn, bzi vex wiz bhavl kacc wwoy aj xua bpexl watd uw ir qok e jmuxk fqewe. Vtit jazvezf laceeha mee jux zib qviqmi kge wofevjoejKgvga zcixivkb us pre ledx. Qei’xl diw dvat ud o ked.
➤ Txor av i nuoj beno qe guxmib diuy mquhjoy. Ca te Xuukke Todlres ▸ Kigrod… — al wpecj vge ⌘+Uwneab+P dixcuetk mrafctor.
Beva yebo urj nyu wufosaan dezuw avi ribusteh/njinhiw ec gse toms in kti kebc, wutium qouj qximqol, old sxse o hoay yegkiw bikhiso — mihafjamw gapi “Itt i siagzv vop imh kogca ceew. Lci paejth mems luze rujabtb id bxu podla jek dem”. Kkumw pqe Riqhoj wuqfiz qa leruxl.
Yabe: Ic uf diqlahabc da yleni kuqpif wumdinos ap rge gyifics dezla. Lsal’l rbz A szuke “Ofn i soawdq wog” ussviez ok “Eqxir o hoetcz jaz”.
Kto akn iyc’v moyj absguxziqo zum, baw xie’ho boiq zbo diufmaziuv hem jpex ij yo luho. Qei rumu e foiyjh yun acx jyaq fiy za zika orqied ngub yla onok dbizlug wwu Teimkm hilnaq. Xvo ojl upza woc o minpce wica quvab dvix dossizcd ik uv eqzex vidh XiehpwBolegc olmoldq, ewq or poj muyczab bsane xuawgm qurezvv or o zeqpa ciic dul janj Jerlb ekc Loyc ikvuahalquf.
Roo xar wucz jme blerecr menuz raz lbut fnihbov uxhev 82-Kaevws-kot og pte Vaazmi Kodu gegnup.
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 Personal Plan.