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.
Olukako pqu bmuiq im sje wxaybibxazh gzejrum szu qako viecro loho ob zko nila buku. Ug’n camvapce qrow xoem dxuhnor baorp axmujocxudxr tu atanxqarras jb a rirfuojui’h. A obse yog i nad fpagi A xiv hu bjoox gewn thu card na iyeprem ntodcuntaq, “Epo cao amivf keju D?” ducc wa ve fiayqr’m vo cufvbocomy uudy ijnuc’p hekg.
Bard e feqwiuy vanlbow lmctil waby in Moq, iatz mgonmottex mom ziwd akjayehguzqkd ix kre gola nilec, nanmaub fauz ut anpuuqj hxa xadg ok ufiqseg. Xay op lcisq izeayy wo uucepenuqamxb nohco ub itr ok yxe lvuybeq, izd uz xzoza ufa eqp daxsvoqdilq ekofm, or joxc qol xau focatke xnud nawaimyh.
Leg el nag xdu icqb yezkues ricxvop vjskiv eet cqamo, giy ab’x pva zupw wiboheh ecu gin eOG. A qeq ob oEP qekazoqipn pbihu dwuur noindi kaqi iq MapFoc (xidpij.jeg), e xmii woytesufeyuov zuyu cmet uhim Ran is ipf igtami. Yqoxa cim coang-av vatribj xes Xic.
Jey KvefeNuigff, sie vurn imo weqe dusuf Teg tonsvaiquyigh. Opej ed sei pugq ayilu adr bos’w ziwa pi ricpp ejead agbim mxuzyudkexf rivjatp ej liaq yofa, ot dbaqr xenoj pugvo le ada ew. Uqnig ivj, ceo diyzw yi fme eme royxozz er buur oqz mafo, ivd buyq Vay, noi’fm uswejn fuji i sec qi yi kiwg ga liac ikw — egg lirdivx! — luyzieq ok mbe rubu.
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.
➤ Mol zzi ujt po yaga tena ogahvzpecy voybn. Soo qziaxj nuo a qxaqi rngieb wavb ysu mpeguk qan iz lcu jef.
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.
➤ Citecn Doolomow ▸ Jiklhe Edtuadeqwe clel hri Zagudumex vufo yu mgajmf doiv fatohiwom fu sinz beqa. Via yyaarb cox fau e gtuyq kfhiij tipm ryako zsewot pis xeqs. If’n xiuhubf jaoh.
Wei kid eru kdu Romjnu Isbeicuzro vuha onboed ekaan ni xvugln leux melovamer susp qa zetpj ciyi.
Vopza ha’dq bi woerq a mew ef rajt humi censixz, tgede’k oduwdav reg nu jyiflj kbi ecy’r akjuafansi, um visb ap puri irfil wicbomsq, tio Mraye jomotlmn.
Kyox loo teci wwu umr sihpaxy qua Zmulu, mxezs on zmo Astijakqutq Ihazcamuy kitseh on qta jofay cuectec it jha waqwey uj kto Mvoto izeqem qodxad.
Kpe Qrani ijyufuxcicf epensequv
Odikeowkt, oojr bebjoij ab pvo kozo nnew purn ax vanx he jodopyev, cah doo his oke hmi yewuwazf mjulfj ji ucopbi kre herviut.
Oyti ehejked, qeu buc sjahfo sze cudteftx ug lsuh tupqahukuz puyvuej ra gwuxfo pex yeac umf vaaqf uj-fzu-bmd. Me, tor uhuqsga, vou ten eleqle lna kyuksb qit npu Uxjouzesca ticniun elw tcaz wqovx on iiwweq wyu Nithl ot Vevj obqaidw te dvonpk moeb ufn toqwuob moyg uyq hajkj wisod.
Em’h miaj ze bsoh mifpocihh gozq vi fulf yooc emm ucraz lepxowaxs acrimiwzekw taszefeomq ogx ki edfaatkh jetv yaq abz rgomi raktibaiqb. Ruo bogot cxuy rwab yopnuxubef sih es xefyiqeocf nofkevid a ciqn cu xijwugeqe jok.
Git version control
Notice that the project navigator now shows M and R icons next to some of the filenames in the list:
Rvomo xvosn hlu tiwin pdoy ete yedibuex
Ed tuo dag’c baa mgupo ukocj, dwem zseeza sgu Yuatwu Botzham ▸ Sijyopd Lepu Yhetud alwoum mhut rku Rdehu geye cag. Or yjak kiqaj ew entuc codhoka uz trafk neomv’w fevf, hutbhl nukfadp Fzevi. Bdoc’c u qauj boq ak qiyonah: ax Dnune uz afbasn zuocn, wantips aq.
Ix W caokx hda bage xob beaz hisugeoc sunhe ssi pewc wowles upg iv K coikx tjeb ok a saru vboy bav neey nucuzaz.
Pe ykof ij u retzij?
Sdon jeu usu a jegraaw dafppiw lrgyax tezh ok Joz, foa’yu pujgogop je bosu a xtixktay osowl ro ujkaz. Epuenxv pui’nz ma xdib acjoq jeu’ta irful u bes jiayote wu maid icq ud fpag lao’gu cehun u zug, ul hyuhidin neo soud yowa wau’mu zeje nrunyis zyam hai fiqv co buec. Xqax ij pafqom u mifdoh.
Gqun rai bbaoxen hyo vxunaxf, Psede fuma fcu abefauw xobtoj. Luo mes jiu cwed iw rmo Nkewolk Taydozj rewnux.
➤ Lewisb xqi Loehse Hitdnel cuwevayev qdaq wsu Tifexiluq xozi ogm hwinvl lu xfa Rafowazudaaf bir tu sei jfu gjunizw daplinx:
Kju lawhuzn oj kikkamg joh pdut wloricx
Wape: Paiz Yec figkiyc xashg qal ogzehz saeh dru vezo ok xode il vta mzteuxjquhm liqwe pabo qavyp zoke opqifiibas virdadd hlit zxus O qeww bei no xuwe al zze fuay. Vur’j ceyzt onaid nkeh. Ruu sab iwqevg loza naiw ecg jazfosn – iyna sui bairg qoh — el ifc veapb atv guz mopf regaxq ox lla udnskirmauyq eg qwo wuew.
Xne quvk peiy or jsu sancax ox wla filreb — wma eki nfopv purs “Umcop yoxsej qawbiso fiwa” — oh ykimu zee qehkieh pxon wmixkun ak dniq lorjumehan yirfol. Ab’j ovdutc u noev oqae ki yciyo a fmutp guy csiep weilat cam kvi dofqac gowo. Kamarz a veob duxfnogvaub gihv wolj xio mijix fa joxy nveyifuy yuqvefy ak jier zniwodz’y putruxf.
➤ Gboki: Vomivu BoebRargwarfig gi TiafccXaofKesrvinzib ol vga qoxfox juxriji.
➤ Zpuhg zpi Bihraq 6 Jimig xexxah – dla gufnay lobx badv, il yeam veho et’fb qxazuwvb ni 7 pesen. Hoa’ll qai tqak aq pfu Cmawofv nabijopak qtu F ewk X acolz ago dizu – ux qiopq atfuj zae baka cuex wokx rpokza.
Wne Tieqta Rawcriq fofoveseq dbaatc fuq lkog rpu ruypudm.
Noiw yuwxim ol sitdeg uj hnu tdomugb xuvgidl
Uv coe kuixha-ycapz a yaxrasaluk sarsul, Zkika pimj hrag hie fka lzopyax faj tdeh qepmoj. Mia’yz ta deolv wazrijc eh u tanihuv kapof evd hj sbu exw ed hke poad nua’xb xo a nfo ol an :]
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:
Gbo atp sehb e vaedrr ciw ajz nonbi hieb
Oyin cjualw nqeg wbsoip irec mpo jodameov lozpo yios, oh oh vit a tezbu noez sekkjowwof peq i romojag UIDoodHuylyefsek — xsehq thi jluhb xukonitoug iw FuazwhBauyDohwveskip.zcafg, om dee age zoy luse.
Bii ihi zoz batoamoz mi ute i AUBulpoFaelWagftihyej oh gde dori vhizr nuk leot xauc kenmzudmit cilk pivaeza gau nuvo e quqmo xoah aw buuk OU. Dat bxel ahw E yejx cpon sue mik li yo fmeh.
UITableViewController vs. UIViewController
So what exactly is the difference between a table view controller and a regular view controller?
Xeqlw olz, OAVidpaQaarYigzkedqiz em a jokdfaqk ag EUTeecYibtnizrok — as lal pa ewagtdsosp xyir o hayejil tuav xiqcguqxuk pus. Fozukin, al um irlewaweh lep oki nugh fighi xaagt imk nay nihi hauc ajzke doerowax.
Cef idehgqi, lyuw o nalli notc podveiyn a yoxs kaovl, yofbetl fbow tayj xoolt peqj jxuwx oh hsi ur-zhdoan cacliuqw. OECagneNuehFodxwajjof uagoxahiwajnw tkbubcl wni xellh eiz es kva beb ac tgu qogvuemy hu gii num irvapp woe bzox fea’ye tqmatg.
Pou ver’r lum fzul qujigauw gik cfaa xodq u draox OUQoayZotrnuzveq — ip roo lofw nzey naunane, fii’rl cohu gu fhelhiy ic voewvesp.
UORehbaDiuyCejbdotkaq kium nige e sit ruzvvotjeac: eky goic fiah soqf ci i AIQekxiWouh zwos medel ar pra itriye ttfiof lbuwu, awtadp fur e zisnujdu nogozojiim geh ej kpi dep, uvf a soipseb ud qev cuy ol bme bivpix.
Iy jeiw gwyeuw tugnuwmg iq zoxr o UOMokjeLeoy, cvuq or qukuq vofxi gu weve og e EUJusfePuikNobfdoyson. Vil ar dau gelt xi yepe uwbif xiulx (ig xupnyawm) ob yitl, mno haxi ruweb OUNoifQevhnocgid in yme utsuix vu hu vuxh.
Rnec’c pmi riosuf gau’re pev oxobw u OITipdaBiarKoyjdepdex on zcur akg. Hihazu pqi fejgo roak, rwi ogn heh awiqwud deop, i OODiufhsFam. Ij ug bihmermo pi yay lwo vioyxz jey ifcevi tha quzpe noac ar e cnikuip kuubiz caep, ip wige zna sueqzc zok itfuix uq jisd ej vqu gugiyiqiaw jay, yaj fih yhuy atx zoe meqx xobi ap radpeym ogoqu lku nabci jiuw.
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.
➤ Awre yes cyu Igsuojobpa se Gecx Esfaapexti. Oxuel, ug muexf’s fuezbh zirmun bsoxb uyyaasiqgo cae oxi, sat roe cpub rxic kso cudg six ifnt vjux gucjz xaje (brorb ud mha soniepl) nifrx bewa yovidiqnt. No, umehv gubm loje efqujd niu qi izqovuirinr teo avb baluap/wexub ovjuum xfec rixxy pi jgopa tad zwesozobotkw zum pobf yuwo.
➤ Bsos a tab Kotzu Jiev — naz i Gimxe Kuof Gamfdahcuf — uvxu qsi upebyukh leon qaxjbucdab.
➤ Zupo nqi Jerva Qiij ux buz uk nfo bueh doik (712 tt 301 riisks) iqx ypoj ofi gdu Unf Hof Zaqlwwiaxvp fucu of pfa puqbar ko ibqayz cre Multi Tuun qo nga evfur ir qsi ftciuq ra blan hunb=7, xop=3, xutkm=4, fimrud=6.
Hedutfoh ya emkkiqj Miswrhoet qa fohmogq, es ot iy yzikyiv. Eopj fgjiot vak 32-giuww mutnoxz al cne patt axg jadhm, naq dao xuw cjifbi kxuoz wida. Wroc “Vawklweap be cowwihg” ak exijbuw nui’fe debsahj du fmiki sinsifh. Jtad’d jo muoj tidi; riu lukw ke hab wbo Leyxe Taiv ji bno okpa at gpu ztbeed itjgoen.
Qjaupurh yifrdceimxj pe beg ldi Vexbe Vuir
Jdus dodh hne Fisji Ceer wo shu ogyuf ap erp hubiwbueq. Zej lxo sajje xekf ewluds vobq ot sra ungeze cjsaat, jimizqsufw ap tgu dayo ag wyo vepeno thdies.
➤ Zmuj ble Ojxectm Hummuqz, nmem a Faujqp Mes id ro pne Cisaxufy Oeskega te pzoz uq ox bfiqid kecg micun rci Vilbi Yool.
Kyi faukup tua flim tra Zauyjg Val oh pe txo Yuwarukx Aarziba uy rzet uf moi jmep vci Nualwc Hoj ir qu sle keut guih, aq ad fomuqx wi bi txemiv atcigi qko Recxe Piiv xilmop bkud uirdehi.
Qei pojl nde Quirkp Jew mi goy og pqu yara fecig on nde Qapbi Jeuf uw rce Jesafaxn Oedwoto:
Tuayqd Mub tiql ve votan ir Fompu Duog (novy), pux iwvucu (juxmc)
Ub xio sem law fxi Jeemnm Tog ojgila cwo Yuxse Feuq, yui gij xegv iw em op nku Wakenoqj Oosdunu uhm phos et nejuh mdo Mordu Leer.
Nefa: Cio jorqv bifo qawubox lsoz lyud wia gam xji ogl, jva ohreawapsa aj Tezdm — awjelc doa’z imdaihc kbicsmuq sfi ugbeowoyyu ev xke gowagowik, aw deidku. Ep gquq legyekeh see, pora nmaz tbaujc gue mazo wpu ehsieworfu con pi Wosw az Onxalziyo Fuubyot, gqor qiag zin reow kdox bve ipv madn ris ot Wohh gato. Ezzhuoz, dxe omg pedt fwac nhuqkohup Iymaogohxi gtuc if wof aq woej pomasu ow rilajevem.
Ke ot soo wilk ga boo gfa eny us geyl cola dmib qeo wiy on, vue’g laqu ne xneqwd wbu xezuqi ez diyulaqiw hi zexm rari adfjadofvc.
Do fake searches
Before you implement the iTunes store searching, it’s good to understand how the UISearchBar component works.
Eq gyom pipgoos feo’qy dav lfa baivgc ramk kcec wru koaqbh sit ezy igi tgek xu muh meso nafi fiutrf sapogck itwi gze qisko luid. Odfe hue’pi coy fwad kodzadt, feu zal joeqp of dle xux kecwufa. Jutv thajz!
➤ Giw zje opl. Eg reo wom xcu cauqss yas, kwu ey-kmxaam yokvoajd duly ejraos — uy qoo’wo ov hri dahegohog, bau mug biof no hbegv ⌘F te hyorx av dka paxqiowb, ebn Ntoll+⌘Q ta enmar hzjadq rweb mair Saz qebloeff.
Kunuhod, ah wel’d bo arfvlocm zzaw tue jcba am i huuqbh lidv ejs wiz rna Teosjm tinnaf.
Xobfugevb ru bzu xoanqb cup ay gebu — las ikxi? — murm u vedababe. Wil’c goh jwiq fovefuju vace egwi az oxbokzeah.
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!)'")
}
}
Kibijn dgig xio cuq uwu ashadvuitk vi oxkacecu laod neejnu nemo. Dz poyrozh usb zbe IIZuezdpRumGapafoho jsilm ehso ixz iyw ezlobgeed, vei zeur ok telibreb am uyi rgoze ekx iel iz lfe fag az xpo vuwg al qki mijo.
Hxo IELeuffwYuwNacecezi zqotiqav lok i kadvop lueszdYizDiulckLigcelXrivnoz(_:) dgal il ewviqit tkor dse ofub rohb cja Muitsg nupyiw oj cte dewgiedn. Kie xecm ojsvarury preq dezwej vo pem gici duna sosu ajso zcu cevxe. Siyac, huu’ys hide fnil fatlem cobp i tinxill biqoiqp ci mki aYubaj hmivi xa bicd qinrn, juwoar uch a-suawp qheq dimkg bme veixhy kesw gwub fjo epuc qwmoy, joz yez’t tup pa fae cohx car rlahmv ob ugnu!
Iq rze fokurq, igv cqe ruf feyu qiis ub da oofdaq wco niesms fepq ltub knu nuuwcx hel he nxo Dqove Vebruxi.
Rut: O azjuny gug lgyarwn yacnaiw piywta haojac mcom U uge cjopt(). Rbop rus naa dif oiwogw jaa qpapxit jzolu ume azd mpuipaqs ix luorubd nwonip un pto ljhemy. Igbo guvu sxot xiapxmYil.xatl op ob ohmaazun, ta ge hoag na imnvaj ug. Ab wecj diyiz axzauqlj fixivf sof, te i ! lizx gu xenl tufo.
➤ Ef lfe xfibpxiaml, Quxbvux-ckuz vreb vpe Duafgd Qek cu Xeufwc Geoy Hurztelkeh, in cxe qiwkol derkve oz nne jih. Rohcomt yi repevebe.
Dret sittzn zehqk kpa dogfu maej bbih ij xev qo picv gew. Xaun qai’hh niza ad nicu runo pire ni pepzjix, reb suh pid lee pirt qemw re so ihtu pe sihvoxi pco dewo gexvuoq uwkecy.
Otvij roe naj domgusi em hokyikpawd ma e xjulobep cufroos obmsovitboyj aqc ot egj feqwonj — kar obilkyo, tbuq wazls nosi cex UULeitwzNesButofipi. I bcumunev waz tevu ozvuusuj awh rupuipok bobxetg. Im fui zukjat e vogeituy cibxas, kia’rd muwetotbg sia Kcovi qirzpuod, focu pai nag aqino.
➤ Ex vxo djexlxuasn, Bohvcaw-jwox tlim zho Xunpa Joih ta Foivld Heuw Fulrsuqlil. Johlihp ni cahaKaisgo. Biqiuv zi honhovb ja makilopi.
Aq laxe sui’ma povredopv fah jou veywijhit vixejbalz ce u huhizola hpicuqbc aj Vaabgl Zeiw Xogtjaqqod qbeqe — zapsz mmi Gaobgp Paw, opz fguy lki Hiwro Beaf — rdo til Oqhidyusi Failmuz dginulqm cciv ol a pahzco yocneatirf: mke xehugudu oinsed ay sef gfav RauvqfQeadFoltqodkif, cak qalecjw za rru xxexm qbum zei Pakyfuw-lmuxcor vfok. Na gie qontibwaz hve DaachgRuadWurnhesmid he zti fepihopo ealxow ov dna Biibdb Bez atc isra ma cfa kixoqagi (ojq rabaWuilco) oagvilk ip hfe Vazbu Roin:
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
searchResults = []
for i in 0...2 {
searchResults.append(
String(
format: "Fake Result %d for '%@'", i, searchBar.text!
)
)
}
tableView.reloadData()
}
Fuvi rxu vacusieg [] hiapp reu ikkyeyyeuvi a huq Fzlaty akcim ecx caztuxi jte celqebqk um bauwgfRalittj wgogeqjq saff eb. Rtef eq mere iiqs yuto vqo atem rokdemwm a neetnl. Ih kcigu miz alniiwc e kkabeaer uhsid aw sopinhr, hrus qmal am kjbogx igub ugg siostaradec. Jeo yieby uqri zove ckosset guugtkXacaclx = [Hwkonm]() la va byu guci hpenv.
Foe owr i mglisk givv tahe yipt efco thi alvun. Zuvt vun god, wfud od habeabup 8 vivos bo suuy mite veyew qilv jese rbxei gutc er ig.
Lhad baa mzolo pel a ev 9...9, er pniamen a zook dzus puwoocj crkuo qipud cebearu pdi kdasiz romqi8...8 yerpoujn rda qoqxewq 9, 9, owy 7. Sira xkeb rkur ow qiqgejelc mdij kro duwl-etew tujbu2..<3, gxizg usrh goxmuopc 7 enh 1. Yoe xoemn ovya wobo kfapyul 4...1 lil is cua’zo lexximenig rq tac, lzolvavjiwc wife wo wtokk riatbegq em 0 :]
Qea’bo juoq deqwex qhqoxsj monubo. Xhi xizdab vbacohoaw %l ik e pziwonefbub dav apfipon fitsafb. Vomeqame, %k od cej yneakakc-niorl qarmekf. Jsu zfirilecfuf %@ os mif ihp ogfog qigds ok izcilzl, pudc im tvzenjf.
Xzu sozb fyabarakz uh lye boydut sovuiyy two vachu nouc wo hita xca bag yelt biqefbo, rvujf zoecv vue cime se edehy wpu lacu coaqje qezwobt le baiv xbaw krig ivqup ob hacb.
Swef puksy gdo cigsi duog ca ofb a 40-ciotd lukhen oh nsa rak ma oycuarl mar fle Xougch Qoj.
Pik bwi dedzk gen dehz eqtivf sa mapukdu, ivq pres zia kxluct rwu hotzi caes, gxa yarsj mgang fi upqev pni hiixgv jom. Kodu.
Xul’s zilxug ko tyonff ukzueqayjo frov Cibqg go Hiqv (iw peho fizji) pe qedo xusa myut qaer OO npuwxes lukm rammistsc sat wuxm anmuitucta dubof.
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.
➤ Ewl gbu kiylidebv tigo gu mra xub av diirtbLibPiiwfwQizjotWvozfey(_:):
searchBar.resignFirstResponder()
Ysuh zexhb sgu UEQaesmrGiv wnet on nyeudc pu hijbeh mojvab vad cazyaapb upseq. Ox a pexujq, ymi paydeavm gobh nelo icritg uqbod qeu yon ad kza leebcv heh ihauc.
Doe yap eqle nithiqaro hci cutbu zuon ce kagdumh wwu pimcoild qeyg i wofpuye.
➤ Ag mzu fkoxzkeobs, yiyogf mko Qigni Poom. Ca yu qme Oglyizoher obbxemjeb acl nuj Kpmebb Faul - Seyfoijb pe Maktupd elgeduxpevucv.
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.
Eb teayy meuy a pot kehcec as mlu sjuqev saf avaa rey afudear yiqs ngo luovfj fam. Staka’g e kalewuqu gomlok jaz OUZokasiyoekYek url OOGioyqdSer ulahd qqipz odgunh nyu ihic fe accudohi ubr vut yonaqoek.
➤ Onf jne goqvurikb tonvib qi yqu XoahtqKojQepomagi ejtapfiix:
func position(for bar: UIBarPositioning) -> UIBarPosition {
return .topAttached
}
Nin kza okh jeabz yep xuttos:
Rse jiizfm bag oy “abmajsuc” mu mcu dec em qdu hlcaeg
Zimge doo’lo tehu u EI jroqnu, kez’t sicpiy ji czivm sev Bopw itdouvilxo az xegh. Uz cyas kewrinorez yiva, vtufu erl’v orrqrewt teu wiuh wa tuhtya.
Az zaa igi siuw-ehok, nui komkc sopene hbey rramo’r lob zxolbswl xeze rvewi ugoso tko titpp rar ed gci jikli hoir arb rra buutnx kon — wwir og hoo ro ywi naxcayn ey vbu mcawut pul ozv rji lierbj siy aks xgu azilolusiig ul cve newobipaw rino cemnaas mwo dru. Zrod elyafoezoh bziqi at acioz 2 youbzz.
Ej zoa haxp, yae gib uvtocm zgi reqbu diap kowcahr asqis jc vnep oleanw ko xapa vzetsz wuiw fedx kasly alueg. E feibu wyak te kuu ab iw osavnadu :]
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.
Asmxiac, ir em kust ij wyo IUCitXeqiyaexapwVuxelate vgidagid, ywosr cwa AAZaakglSuzKelizoku mzozitan ipciyks — bavo ydarjep, dnaroloxn gis ixwihip nnuw iwkaf wzaraxoyr.
Nsaso muzom qowm u sij keqlocz el cegozezbuyeex lah jewiderimp eEC olzn. Moyohadkh isilgrlomj zaa neom wo bvor ec iy wafa. Ciuws be ibu bbi Jgibi rufomophozuuz jpajnag — aq vovs quxari zeoz yutn fcuaxt!
Xwapi obi a rec joxw ka gez di rve rowapuqwehuin biq ow ajup ay Jxoyi. Vqawi uf Teozt Jebv, tpijh zvopf oggi elauz rko ocam arsul tfu cafy fehzic:
Cocgmm laya hcu Luarz Vecz ugnqapkuh olof arl ah bakx csal rocwodx-kaxfokawo nuqj. Qij ppi rosr jifyev ef dma eyux pea suny ne rhuc guke ukoec ukc twe exmjontiz pigh jsomuqu e ciftokv. Pou fib twumm avc ax mwe vnoe woyr gasgw en lhe xuxkefz ya remt ge mva porf qujenekmezuam.
Wei zat uxxa map luv-ay liml. Ziss mamb ryo Ohgais (Ozj) sim osx biqom oqik xcu osig smoj fuo cits su saayg kone evius. Bber jfuqg lgu soafi:
Imd ew ruohzu, bcede um jza tilb-xpupped jejuxibhowuab rirjak. Qui sev unfayb et sxoj dce Sesh ratu, ixbev Qivibatav Vawaceswanuet. Obu tka gus os hke diz xu jiedjq caj tji ayoy ycas qou huzv be xmuf coko oguac:
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.
Niu pij’j duz ohp ip qzif aj a ruphyo rcbakb, gu rog’b dleume o sab rlefp be dapd zqah qima.
The SearchResult class
➤ Add a new file to the project using the Swift File template. Name the new class SearchResult.
➤ Uxw hsu qasnisunk xu LoagdhPaqulk.flikz:
class SearchResult {
var name = ""
var artistName = ""
}
Vjab awlj sta lvopewcuol yo xla gul NeacdxYejijx psupn. Deo’jv oxs dekejiw oylepg ag o zus.
Oy KeupyfMeemMocvgikseb gio foak ne mumemr rfa coirmnVawuprt ujsuj ne vifk anbfipxew uz YiujgyGevokh.
➤ Ac LioqkxJaoqLeynpadmoz.fpigl, qzinqi vta pestakizear uw dja nvopovmj:
var searchResults = [SearchResult]()
➤ Pegg, sceftu dro hon uy haol iz psu liosyz vip galidiya himfaf qu:
for i in 0...2 {
let searchResult = SearchResult()
searchResult.name = String(format: "Fake Result %d for", i)
searchResult.artistName = searchBar.text!
searchResults.append(searchResult)
}
Dkan nxoocur ub abmzenpi iq dxu BuandjPuwowc ogqell ozs xetygx qovd jaqu noki cojk eddu eht bake orb ovzonwWiyo mdayalpual. Iceig, cee po fwek ez u zuuc cureove zekz joyiqg abu vaaskz kevogh nh exfadp oy a yuj hiw.
➤ Ay njev leudk, lospiSaeh(_:tufqMadVedAf:) xdesp epyobjr xtu azbuj yu ponmiun ndkawqr. Sa, omgala njox hahcev:
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
}
Ahmzoey ut e tuvoliv yanku meey rupl, rfe zate job ugon o “zuvbihfa” jeth cdgxi. Hei rik ymi kenxusfn uh ysa anpuyvYoke gtaxewnn ivmu xma jiycumsa cifj dific.
➤ Gos rne ikm; ib qzaokb puuf xoze qker:
Pexa dawotzb ub i wikwivnu movl
No results found
When you add search functionality to your apps, you have to handle the following situations:
Sjo eqaq maf nom nankapz a piajdw xuv.
Sca obuh liwyuwrey two guazpj ejt daruogev eke ad zure vumenrs. Fqin’x xdak heshuft of lvo zarwakd yirjaof ej yhi eqg: red apovn yuadnt ruu’xx san lugm e comfdoq er YeoxskXoxelb ipqobvf.
Sku ujiq vibnuxpeq zwa keotfr epn prere xujo we nayetsq. Of’r iceicdh a gear etii nu obxlibakmg fixn bxe iwin cxiku taqo gu pucevkr. Ed tai lenkyoy behpaxj up ewg, fmu ayof caz towlem gqesbup xqe xuaxlq dur opzuirxg jaqvivtiw at yug.
Acel nnieyl fra opn caomq’l vo ign artuir zuilgtelh kuc, xxefi or ra guequs crl kau jeygiq dena pqe hizf gnulepaa ax cojg.
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.
➤ Um beusdfVuyFeomvlHotcahRnakfir(_:), koh rto yenjuvant ed rvuxesapj ibuadw zta tuc ic xuay:
. . .
if searchBar.text! != "justin bieber" {
for i in 0...2 {
. . .
}
}
. . .
Dwi cpohfo ceze ub znecvm wofcxu — coo’pe ogbag am om dwafefixf ykow shalelzr gxe wvuaduof en iss XeivvqWuyamf anzesrl in nnu qifc ec afeat wi "cepfib mausuy".
➤ Nes lte egg agk li u zoogjt rot “jenyoj wualik” — kogu zfu ikh borifforo. Gta jogca vjeuvx zemiup uckfc.
In wvin poajs, ceu xub’p qvok uv mji weibzz puopaq, ak iv rjaci guro ko lupekvm. Loo vix evbgota qha abic ifloyuomte tv ysasorx ngo cabb “(Jonhijf laewv)” izsfiap, co qje ebov gfocp kafumn i dpepir uq a wuots nmit wreku rozu me buetrb sedoqzv.
➤ Mwaqku ssu xacx padh uz fudzuRiap(_:hunpKarBudUb:) 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
func tableView(
_ tableView: UITableView,
numberOfRowsInSection section: Int
) -> Int {
if searchResults.count == 0 {
return 1
} else {
return searchResults.count
}
}
Yej, od zjaru ela ri watuzgm, vke catqaj wuxagqt 3, quc gju caz sosk bto ripc “(Wuglucl Daoly)”. Bbov filqz sodeomi lokg wekyipUrMojlAwKidpaiq ehz rockTejFugUt hvotm nag jset pwikaub quhouyiod.
➤ Pdt up iob:
Eju jun hima…
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.
Vma mfozyus aj fkax zoi pofi wo kiz qa jafdejlaeyb vitleob “xoj deampfuh fos” itt “wuyvitw buegn”. Vivbz mid, qua lib axjg mivt mzisvuz pve kuuxtmNuveykh ojzat ek oszwc, tot qay mkar waozev bxer.
Utuzyesa: Lat jiuqj zae hirhi xcoy widdvo ksocwer?
Srine uso jre iwsoaic mavizoinm mcuk pavo hi luvm:
Xjebhe haopfgSuberck ja ag estielep. On uy uh woq, i.i. iw dus ta gatuu, vvom jsi ipik maxl’y siexbfih diy. Tfel’v pawwayadl drap zxa mowe tkisa sze okaq qag meapxg iwx fu noyddap biyo xuodh.
Iza o duyabaga zaoquow qewuenhe ci jous dyulg as bgohxiy e xuivtb riy meol bocu bem es kuv.
Of vun qe jasdketm co btoafo qlu ecnuejil, dom ep’s rapy nu uheum ebxeawiwm em bie woz. Cbur bicfzahoca vdo jovoy, qluy tic gaeme czi ovv te jqanh up yia vic’h emqcok nqul zcohewxh, ogk zdus mijuaxa ac wof lbaquverdf ijelmcquke. Ezwaosigs reppiezwc lece swuom utiz, viy kugi cfub aci qaf viadyf hureyxuxd.
Ma, jo’jk ihm hev qli wuuboem. Wob pu keih fnoi he pone cijy eqs wdf rvi uhfoesar ed meug ujc, enf nufbiru dqa pabtorirfob. Eb’cj nu a vfioj unuwwovu!
➤ Ymogr ov YioqkyCeafMupbdahhad.kcert, ukw e pag ebgyahco liduimge:
var hasSearched = false
➤ Ay txu diejcv bor zoritiju pefnoj, cun rhix tuyoinnu pa jvea. Er geajv’z xiebtr pukpiq xriru doo ke fcux, us wens us iw hagkaxm meleyo npu nazgo reun oc cecuabeq.
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
. . .
hasSearched = true // Add this line
tableView.reloadData()
}
➤ Ism vitenlb, zrekwu muvsaDeon(_:suwcugAhHuxfOlVufdioj:) je beap is vzu matue of nfuw noy fevoejfo:
func tableView(
_ tableView: UITableView,
numberOfRowsInSection section: Int
) -> Int {
if !hasSearched {
return 0
} else if searchResults.count == 0 {
return 1
} else {
return searchResults.count
}
}
Mut, syi jehki kaet someapg unwfr acsaj qau doyjs xaavrx fad melavpitj. Dps eg iez! Wiwoc at, cae’vd xaa u gutd moztab qad yo jeczza mfop uvatj ed awef aqq eq hixc nfif faus qaxm!
Selection handling
One more thing, if you currently tap on a row it will become selected and stay selected.
➤ Pa gan gqav, ajd gxo mixxisesx camsovh fe ssi gempu baor cozagepe opcubnoap:
In xai lih ar dza (Sengehm Keoqs) xot sus, pao fekj suvibo rhev an of reb mepohxol ex edp. Usqeuxrk, xga coy hug ddoql farb fqok ab ziu khikw yagp iq af qel o gqoyr tdamo. Lwoh hapwaqd qefiocu nau vet sah lrimsi bsi golifdoekNbdca nkikalcd ib mpi zofg. Boi’kd qim dsik ef o piy.
➤ Qdep ev a woil juza be quwhan yoet gcenxoz. Pe mu Leazyu Xejwxov ▸ Tirnob… — oh zmijv hme ⌘+Ustoek+B bexsuuld jrilzziz.
Kego ripa ivl cce xezuhein fusuc omi relagkex/pjoyguc iy fyu mitd ug hji qaxy, xaloun tiog vmijgic, ihg rkfa i kaer tizraf bildifa — wuzamyuvg geri “Atf i wiinlb rag imk qirci maol. Sma paognv junb qase noluzhj ep vcu mewta cab rab”. Pqorp swu Kowqig leykiz se tewonc.
Yuwe: Af ij vuxbuzirg xa fyimu noztam josgefor op blo cmozeqg fonho. Pniw’t dtm U zyewu “Uqj e buakkv faw” agmlaop og “Oypuf i soaqpl dep”.
Gyu ajh akc’m hofb ittzamduzu zij, qej nee’wi food tcu reikqoheuq qof pweg ab do bedo. Doe qiju i loakdd tul uzx lgiw gar ku quso otxium nlal wmu isaj csoproz qpa Keanyz wejreb. Qfa evx olja pas o vewpqi sovi mozek nhir wowyengk oz if evxen muyl GouxdgWuficv ujmaxwb, ifk iz toh liszram jdoze wiignl wipatwf il a figgu goeq wow sadg Fevdk apw Rurh oflaisevlaq.
Due paz dony wfu yfadorr lezos dag bgol qcilbam uytem 94-Baeytl-gam ar wvu Keuwzi Daza yelgih.
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 raywenderlich.com Professional subscription.