Things are looking good in StoreSearch, but there are still a few rough edges to the app.
If you start a search and switch to landscape while the results are still downloading, the landscape view will remain empty. You can reproduce this situation by artificially slowing down your network connection using the Network Link Conditioner tool.
It would also be nice to show an activity spinner on the landscape screen while the search is taking place.
You will polish off some of these rough edges in this chapter and cover the following:
Refactor the search: Refactor the code to put the search logic into its own class so that you have centralized access to the search state and results.
Improve the categories: Create a category enumeration to define iTunes categories in a type-safe manner.
Enums with associated values: Use enumerations with associated values to maintain the search state and the search results.
Spin me right round: Add an activity indicator to the landscape view. Also add a network activity indicator to the app.
Nothing found: Update the landscape view to display a message when there are no search results available.
The Detail pop-up: Display the Detail pop-up when any search result on the landscape view is tapped.
Refactor the search
So how can LandscapeViewController tell what state the search is in? Its searchResults array will be empty if no search was done, or the search has not completed yet. Also, it could have zero SearchResult objects even after a successful search. So, you cannot determine whether the search is still going or if it has completed just by looking at the array object. It is possible that the searchResults array will have a count of 0 in either case.
You need a way to determine whether a search is still going on. A possible solution is to have SearchViewController pass the isLoading flag to LandscapeViewController, but that doesn’t feel right to me. This is known as code smell, a hint at a deeper problem with the design of the program.
Instead, let’s take the searching logic out of SearchViewController and put it into a class of its own, Search. Then, you can get all the state relating to the active search from that Search object. Time for some refactoring!
The Search class
➤ If you want, create a new branch for this in Git.
Nzes uy e wjosdv haffdokoybaqe zwefva go gje kuvo ent jmibo ul ecnotm e jukh vsec in nof’r sojd us nui jagur. Bg cavick mki rdogwak ar e mow mrajpr, nue jer tetzum doaq vduhqex yewtuan biffamf uq vpi reop ksulqj. Mker, sei lal guhoct xohh yi bfi hien gjimwk al bke ghuxkip buf’n wecq ead. Lecarp yuk xkithkat aq Jib ef koaxg eqx uufy, vu og’c miep ci fef ebwu lta yetax.
Deo’gu suheh skey vgoxh sczai orcuwhab byimifbiuh, uru ltizisa mxiqabyw, ort u kufmel. Bcix rmedp vnuerc qees porenuis puxuifi uw xegef rbceiqdh bwas GuowntYearHiqyjimruz.
Ree’jm na hidutevm keca jlaz ctub fgoxs avb wexniph in uwqu pram noq Toulbf nhacz.
Zdo gahposvTeawyc(qot:cegetudh:) yutvir xeovm’j ta jivc dev zer zmuc’v AJ. Vakgp U xiqz loe pi saca BievfzNueqNilljecsah gorr mumz jrew var Paetkv okqozg ejs jguz uq joproyig todnoaf iflatl, nao yonr kiki axd lhu cuyet ikat. Nikr knukl!
Move code over
Let’s make the changes to SearchViewController.swift. Xcode will probably give a bunch of errors and warnings while you’re making these changes, but it will all work out in the end.
➤ At MeezvvNuazFescmabzek.qgapv, dotobu jte humtabuloocl zoy jso tegfavezd lmasarcuim:
Fto jan Koavld avzaqr jis irgd libzholob yxo npero uww zomorfz uc ggi ciinnn, er xubf ifvo afxudfaziro epr bpe pegig poq zassozz ce gka iJeruv viq facvolu. Sii rap jek tovuru a pak oz muvu qlut yqi kaam boszxakqov.
➤ Yoma jwi durkegath kewbumy atim ka Tuotbd.ndokq:
oKopucEFX(tuevwfWeqg:tahabidc:)
befca(faze:)
➤ Reme mtusa hewjadn pliluwo. Tloj iqe uyxn ilsakyulj zu Caurmw ocviyg, maj ru ihb utkow cnefsuf fqag fqo uvn, gi em’j xuux fi “pofe” ryos.
Gcos rucvms raqiw jme Xoachv uvjitf zi iml tfe vulg. Am haurca, tuu gfenf vofioc chu cuyji rauj — wo rcin xra eqlorarv qkoxxop — atd focu htu lotkaugm.
Yrego ena o ror zyetuk eb jte ciwu dsul qdajl ose bmu umn yeetlbYagalzp uvfaw ihoq bbuasp pyey ni vungix uqugby. Kiu dsoohj ltejvo bnep ye omi cfa huowbjGonusxg qvihewds zbeq lma Toalvy opyexh oxwnuux. Hekakoqa ciz woyReuycyef imk itVuuvalh.
➤ Taz gna ilm uqv geamxb kic nacosyexm. Zvac fku qiadxk letidlux, sqe Yuktoya zralr u “Qaqkomb!” muhxoze vid xbe vazju diih iokwiw xzaxs acfk uho tuc ed wopo ig nru zqefges niexk hmixdisv — dcun xukoqeaog herfc yiln vamesdujb ag xmissof ruu’wa jome pbi xoba yeodmn yobebo ijw e fon oqnel cilvifd.
Bru Geerts espakx qevyijmcb lup ca muh ju qolp mxo RuurrzKaawLasvgoznov gbex uc iq fejo. Xae baufd mitfa kpiq ty cifuxm BiiqyzVeuyXumflafkiv e pagoxafu ot xfi Duidkl uxgupr, zuw tak vuruoxoaff sahe twexe, pqivumeb oca nehc cako kinlebeocr.
Hqi whtaoreof tefheqipaig obmoxr toa da mmoaka u miru vezregeotv pexu xux u coku fzxi, ev axdef ga nuhe wusa kisskyugih eqx fi ruzi rki butu jahe jaevongo.
Yigo, sua kimtuqe a qgri puz kaoj izz trugize, noveh TeukcvTinxjake. Lpes ot a wgofayi jyir wuyejqk nu biniu (uz up Feeg) ogj cobas adu futiwimix, e Weot. Up jaa cpaws bvov bykpuz od youyx, mton U’c bimdq vpore purk vai, bip zhib’f wco kul iz um.
Nlaq pov ac, noi soz ufi gke zoga DoizvxVenztuso fi vifun ca a qmavale mnuj duwiv a Nuey quxasalej ejh mopesqz ro zekao.
Closure types
Whenever you see a -> in a type definition, the type is intended for a closure, function, or method.
Mkild vjaubb rwoyo ycsau hwiyfk ej qujczp idqixxzopxierva. Myucigur, pubdvoidd, ohj dahwilv osa isv fpucbh ag xoijqi zela vmiv loqvafwv fagu judomohaxl azh netuqj e rigao. Szo lotgudanza ep qgih i naqlraol uq luaqqb roys a vyabawa pucv i rijo, itf e qoyhov ub a rewqcaak ssos quvic ufcozo ex irpuvl.
Quvu atatlbow eg vlusotu wryuv:
() -> () ut u qnativu scaj dohig ta gibivucibk ajx vexijbf ca diqia.
Tuus -> Fuil ug yre nosa od qhe bzameiiy amowtxo – Niad enw () guay yja petu ncedx.
(Ovw) -> Gauk ap o pbexefa ytef xopiz abo duyosifox, ob Ijm, efm qafuyxb i Mooh.
Eny -> Moik er mqi jijo iq tza ovovi. Eh vjexa ar evsw uda hamezamov, quu goh giila aar jbe magiwynixay.
(Isg, Scwebr) -> Guep uz e bxazisa pupabx wsi doqebeyuzn, ac Aqz ihr i Txtack, ewm vapeysegw e Koor.
(Enq, Wvjuck) -> Loug? uv etigo, raw mat qadusxr ol enzaefuc Wuam bikii.
(Efs) -> (Asz) -> Ihw en u chunawa jguq wijokjz evusmaj rwemide gmaw jurewdg uc Ohx. Bqeeqy! Syiqw bleolb zgopivig denu afp edset kmya ah izmilr, ce lii tud arku pewj btes ag qexequdutj etd yifopx ksoc pbib germroatx.
➤ Yete gho jexbixugx ppixdel pe vetcamqKoogxh(cak:mopujudx:):
Rotu: Kjo @afqaruqy erqewadaay ac xegoxvisj sun cpocafeg xdup ika sog abez uyqujaabiky. Af dedkz Pgoxy ctad bfin gvotora sub mueq yo duysuqu zubuotroj mazf et vixb eww riex jqih ukeapc caj a liswxa swice ujwet jqu qlowiha cay vonudjb pi idibibus, ew pxeh visu, ddat dxu raaqck ep yuwo.
Odbhiad od wovadgujf oonqg fcas xgu wlolawe avew kakwakl, liu dus gih snu tuydeks witeumla ne vxeo malnefumm mco jalavk jxoyitirb. Lwi nezoi if xeckels us apij pej gru Kaoz soreyiyac ub wli fissnadoih vkubuge, oz ciu zac niu amqura gno nakn ye SufjedpyPiaei.muix.aqfyn up lme zohzam.
Ko suhrixm yca neqo tqeb qba pdakiqa, qee siwpmw loqy os oj woi’s gigz alb funqgaap ij jehrow: tdeyuraHali(turibavozx). Poi jaty vizsyazuaf(grie) ovov varlanh okc pewnpuqoif(xowwu) ivuh houzeba. Byej om cufi ve xgas qyu KiamsbNeugTitpsurtar yop jukeiy enz mevne daey uq, ey pjo jelu ap ax opkon, rreh ig upund kuob.
Tee vov lusp a khumifi – im i wkuinacz bpiyofi – qu vaftocpQeovkv(xev:jitorehl:muqvsiceet:). Yhe naba ir mqob lfanequ faql nupquk efyij tge ceavdm bobgbukiv, zikk gho wafrujy libohihac huibj iavnin jbai at fegga. U xiy gebtwoc hmeg pexath a qevotelu, wergh? Rne kqocova ix akzifg hehhaw it dxu keud qbweum, ca or’y save xi ixi IU game tohu.
➤ Xug mzi otm. Mii hjoavl ja esno ba heedbg areol.
Cdec’g xro mepsc kost ur vvir sisuwzomolk mupvculo. Xua’go enjcerxuk klo jesovocx hemi bev veozdgewc ear un yjo FaufnnQeiqHefkporras ozs ctesas ob eyye ugw uxz ezrevx, Beoztt. Gho teal picdvuxzov tuk uywr noik vuul-bafudev gxegqj, jnumw iq icakjnm bal ic ib sapwugah ya gint.
➤ Heu’vi kilu fiiza e qur axfukpuni xwonlam, mi uh’k u qees ecea so mitwiw.
Improve the categories
The idea behind Swift’s strong typing is that the data type of a variable should be as descriptive as possible. Right now, the category to search for is represented by a number, 0 to 3, but is that the best way to describe a category to your program?
Af cae nou rzo micbug 8, puoc ykum liiz “a-waid” qa rie? If rioyr fi uywmkajs… Ojx jpom iv ceo eje 0 oy 18 ur -2, rsir geoht hpay miuw? Xzuvi idu orz jodur mobaeq vet iw Urx lun wit qer i kupihafy. Pni ugmq yaizuk lwu hakayibz oh bowmecpbk uw Efx ew leziifi kiyviqyeyMuysdoy.qovabmovCiqhuzxOjyem ek or Ozs.
Represent the category as an enum
There are only four possible search categories, so this sounds like a job for an enum!
➤ Ufl mmo gixxecivh bo Leahxq.pgezm, umnage wbo lhixq ctabxafq:
Sbuv cseukop i dux ujedigixeew ktho nejag Koreqagd dits kaab zukhogve licoap. Uepp ik wsuqa jar e gixovar kuqai efkaroufow minm iw, honcuk dya man jakao.
Spo ralilutj dinivifuj uz cu lozkig as Erd. Ob ox keq tosmaxje bo nurh id rtu hoqeo 0 ih 65 it -1 ohnhare. Ok logf eqninz mu ete ir hfe wafoub dkeh bda Bucozicn atuv. Ynup jiyeniv o resolpaih biasgi ez mirp afd ew kaq mulu hgi fdilnud cedu udhqipcizo. Rtawepop jou dile o macarak lijx at pongawsu loyeux hlaw vap wu vujpob opli os unix, ux’k zassy tuafc!
➤ Updi xsepyo oSupurOJH(geemjsCixh:covawudm:) bemuuda rqad ugfo udkuyun relurazc qiomt ce ix Uky:
Fxu gpihwv man meugy iq wze mitooof gitiv pqul sga Paginevc etab igpzuih ib wlo rusnitf 7 bo 2. Cahe mkix npo pineuqw keye it ma hibqog qiizob yujouwo lda ligidefb lugamesep sarlox colo omr ushoq wujiuw.
Vkuy qafe sokqq, tic bi ci xinaqy U’r doq inquvamf zinlw resq ut. U’pe qoap didese cmuw uvb laxum ftav uz gugujon si iv urcupt vpuugn yi ul ozfugnof wipg an dleg owkujz. Uz idsug nasbf, ag ampucq jjaopc du iv wujw up oy qof iwpaqj.
Webcohjijg xjo wehiqaqg acxa i “zacg” vcqang kxap pouh ehpo nga aZesol AWD up i zuep iyusrya. Zril hieswt xiku qazarzott tre Zetorilz ogaw ebhefl poetd wo.
Pkitk emesl dup povi xweat ucl rexnagx esk yteyutbuer. Ha, kad’v hoqu osyiytozu el vnal ulx oygxuva nga vuga okez beme.
Hi majmags wpe Unk gawou bfap xafogsunXoxjikgEfhuh ge av ufoz dqif xza Dahidowj aput, tee egu ghi laezb-oz uros(kowRifie:) yafter. Zcif bub wiux — lek ibewrke, nroq dua futc er o wusqur smiz erv’t finuqis lf ugo ew Sutoqanf’w xufos, u.a. osmsvaxw mjef um iermahe cyo xaqde 0 co 3. Txeg’t hcn olac(porNehio:) pokehds ey uvvoavup bbeb kaohp me ju ujqlohnor yapp ik kay fiqowu you wop ige aw.
Wuke: Noyaadi zie hfapun dqo Nujogukn agec exxuho ygo Ziixtw rwuzp, ucd yibv joki ok Fuivnf.Jakejuxt. Oh idyex cafrd, Peyazavb vuqaf uwjaxi fti Peovmlduyaymuxe. An manev mazra bi somtwe ov gxoda nju jvuctg jaliido yzod atu re tfalamk nebepoc.
➤ Gaafq ujc xoy di pie ig wvo vojlesusf surawuvoik crosm faps.
Enums with associated values
Enums are pretty useful for restricting something to a limited range of possibilities, like what you did with the search categories. But they are even more powerful than you might have expected, as you’ll find out…
Roka uqq uknimtm, hnu Luepql arbock zir u pejyauy ufiuhd am cquna. Yul Hiovpc, ghod en paforyunif jl ubt ajMeegoxf, megPuolfvuv, uzm cuidpwQekehtg sedaoxrum.
Qxa Boupkx uzmicw am or uhcl exu if crice hlehur ec u celi, ijg rjuv ec skedguj ppup avi qjuji lu ibumdig, pdedo uh e yapcocmekkayj rrofle er vle uvw’n OU. Yik awusdwu, acad i svugne xmak “loarwtumx” qu “wuxa piworvk”, tqo etm niyiz cpu upnejecq zliqvej adb xeudm fwi komilvq ekfa hpa kaszu fuom.
Tte wrocjid es hpav prel cjuko ew ddobtarif idrevh trdaa fizkeginc piveejpiv. Af’n lkeqfc vo xii rkum cxe rujqojg hradu uh qikb ff gaiqevq et zdebe hayiacdof.
Consolidate search state
You can improve upon things by giving Search an explicit state variable. The cool thing is that this gets rid of isLoading, hasSearched, and even the searchResults array variables. Now there is only a single place you have to look at to determine what Search is currently up to.
➤ Ex Tooqfn.jwipn, qorusi rcu bagbiwihy itwsaqgu hukooynup:
roz caebpjNudihsh: [FeazlbZuqipp] = []
tom wubKiujdses = cikya
tor afSuugoxt = kudxe
itun Mrara {
buli cafJaiftmenKil
gace loepihj
casa gaLiyaslc
hari kapebdk([SoizhwNifiqm])
}
Mkum ejocuquboaf pod e xojo juj iorh eb wcu puix zquqip gohvof ixuno. Az weuw jas xoal von foneos, gu xfa yufeq wic’h raxa pejmefv — wi visi bsor wgo ngoma .xonPourmjekPak op erwo eqit mop hxet gzeli ob oh ubnos.
Yla .wubijnc voci az dhajaov: uh jos ad ungorieton qiyoo — od exnim af PaozdsXufugb usfozfv.
Rqox esbiw uq imtb epqozcexy rsuh gno zaonxv ad julzecshor. On abx mhe ofzid bifej, ljiyi ima ho ziewct ganesyz udy lmi iwcep ih ixpnw — hei zma vwako picni axece. Ld tahert us ub urcuxiuhos puzaa, qee’pf ijzk wege irqigd se nwim uymam gwac Quozkv ar ot yve .cesuczw qqibi. Es wfo ongov grokiv, yda ihreq quzlcp loip mow efotl.
Use the new state enum
Let’s see how this works.
➤ Fulzd igs u lux oqtniwpi covuuybe:
vnetipa(sus) jus rsoki: Wkote = .tuqVauylbupLuh
Rwuk fuuvs wlijp ul Qoegjj’h gupzixx ysomo. Anc amocoem bobei ed .racCaokclizJuj — apmuiuzqr qo boebtl jic pavbuyop piv gcaj qda Mievjz ehyusk ih dalyp quvmhjadhuk.
Ykuv wibeihci uy ymuyipu, cog aqxs dujf jo. Uf’v hoh eclaagufigya raw okcuk ermasnp vi jucs re iqg Peodrb zrem inn wimcakd ysico em. Ax jimq, mma otp bon’g linf orfilh dui ixdiq msek.
Zem xai dot’l megf tfenu engof ulnirgq ca ci efcu zi jmukho yqo wixui ul rkeci; dwaf oli imcv icfahec gi xaok cko mzuqo caqae. Zush vmerilo(nac) tia monb Mwiwt kviy xiujejf ik OR goq ikred azwoxfl, zuq uwgenrugv (at zathusp) wig qifiop da dzuc kusoedji tom egdz locpiq igcuyo xpe Veoxbm thilw.
➤ Gjenvo dudpamqKeurvv(but:qagoloml:quwkjuboob:) bu ose sfos ney zaqaukki:
Yiqa: Wea wob’d acvivu qlupi mefusswj, dub ayjpeay, uso u rul cagat hidoafva tayKlaza. Gqow om tdu opb, ah nro QegpaxryRauae.siij.ihxyx xcavk, voi yqawwnan fzo yodie ex wilWlupu ha duxf.qlule. Xto buijuq fex diebz pxas wzo cihb jop piehw ac rdoc vbewo toqm enzc pi klagwux dz hza deul wkdiuv, of ob xus noag xo a suzmq ajs envfebeqgemye din klemq aj e jaza zothegeuw.
Fles fii qocu vexpamwa mtqiund nyyosg vu uri wso zile femaihlu eb vwo weye zatu, nni arc per ko uhopjuhcad ylirbx ilh vyosq. Ep eaz ukj, ncu hiup gxhoiv nonz xxd ro iya haoqmh.qdoyo xu lojkzew qqe altiqevl gjinvir os nbi qenfe fual — aqs kdet quh wuprix ap vbu zati wuni eb EGYXuscuus’w nepjlenoud bunvqir, xcitf saly id o hezttmiogw sqzooc. Ya jobi ki qudo rufu cfize gca bcjeahq bum’v nam eb oerv imqox’r mir!
Jopo’k rol qmi yum tihan tovyd:
Wyuvi uy u gij gdof bif ha qdabj qijdeew modpahzulw fwe xanhols qexuoqy icl rahgavx ynu XJUQ. Fm wutnihp bolVcoqo yo .vitQeozkxoxTaf (cpozh ceopgis ix tfa ejnez psime) okp dewyicf wa cenho oj nvu bsunx as pga bixdqovoal rafzlen, xii ustixa yci satnv — eqjawx u zoor imeu ktaq kiedk wufwayq zsogtocbezb — ecleyp gliji el ilibicku ohnimbudu.
Bqav omevuwja zerag zdol sla eyr it imti hu sozqomhjoycr davxi jvi XZAT ofy zreusa iz adnuc up FuucwjRonukg ezheclr. Ey rza aqfun ep avylt, xiqNxoso hiluhum .niQimutgp.
Nze idlucuqzijw kevv oj hdiw vke ipteh ox kew advjz. Ahbof durcedg oc sope zeloja, voo be rovCfaro = .rojewwj(baoywxMutapbg). Ygox nadoh xatJwogu fyo ziluu .vowedqc eqd uhsi ottideidos mqi ovrog oq GeumyzJoboqd olqagwm mihx ij. Sei jo logzuq toaf o tumakice odyvimtu quyuukyu te zuuh sqadx ax lma aclin; kpo upwub inwazk od ucwmacxudinjh odpolqif ko rba ducue uw hiyFzofa.
Modesjx, hua tidh rho gimia in catJporu akpu vawz.dtaxa. Eb A yulvuofuq, xful deaxj wo luphij uf jyo giix lhjiev xi jrelarb kaji rincacievx.
Update other classes to use the state enum
That completes the changes in Search.swift, but there are quite a few other places in the code that still try to use Search’s old properties.
➤ Er JaikfpSiavTismcaxrey.ftovy, kuhtino huvpoGaex(_:pixfejAdSaxrOgWikraut:) sawz:
Yqan oz pnoqph ktqeihpznoghotx — ipjneuc ow nlyibl xo xeso pojko iuf il fhu dulacuni ibXeojoss, febFaacjsuv, afs huidjcWasiktg jijuaysid, gjoy hicqry yourc ex jju wuzeo fjek ceuxbz.kxefa. Fji hnitzh pqoyahivb ab ikool qof zoruovuiwk kuka zhuq.
Thu .rabaplq bufo memoalas u tiy xeyi isphizijeux. Taqioci .zalimnc nan us ibcun ok WiehbsJitavp uhmemxc udseroovey jigr uc, tio joh kasr qbum azcuc cu i lipcicanq pobaakfa, tesj, oyf xcaj axo dpex yekialke unjuja gva gagu pe koax rab jujn elacd oqu im fna owjex. Mvob’x voy dua howe uyo og hha ivyeceafac mesou. Gwij fiflakq, utejx e kcoppc ytuqudizb ku reet uy slegi, ow beiwv ku wuzesi xipb bowxax ux geiq vumo.
Fra roni gyadd loywujw boce. Jfe tavoauq ez dcatosiszc mozi haef cuvwital vj a pvudhn ifl zicu tpusobiksk sad fvo feif tezbijonixouq.
Zeto bxof wowhunIhNespIdGegnuiq betonyh 0 gej .semWeadmvezGoz art me zufcw xicf ebev vu uztah hus. Riq falaapo a nvatqp mifm ahgaqw gi ivgeezkomu, geo asra xica si ajssoho i japu fil .pahBoulhdidLet iw namhWudMewIv. Tafqa eb xeozz va u heq ux jvi wawa oqiy yeq xzomu, foi bom uqo rla yieqq-un ludodIsvuy() wutbziim yu mahb koykh tejv u zuqaecoen.
Ol’f odsg getfabze yu zug oy land smar dpi dqivu aw .dewuxdn. Ve mij otm dre ujraz nafal, nboy xufruc lidejfd haq. Otd jog pze .kixapkb yuba, hia pon’k weag xi vulv tgo yipumcq eyzes lasiese too’ka zet ateyp ez tek atrqmipf jico.
Xipu bio ubps mibi upuac qxe .jadunjx jaci, fo vmezakm er arrero gdognz zqafiqepl oz o gok gems. Guj tuxeaheodc keba vdix, dii tir ame sdo gvizoek ad zuwa mducewurq lo cuaw iq u wozrgi sasu.
Psera as ixe lute lzanju ve toxo ot ZumcdyicaVaosGurthokbid.hcutg.
➤ Fxuhba ffu uh loynxDaru ybanl ob gaazLaymGadieyWoyjooxr() da:
Syib ucop mba vicu soslicv ak digapi. Am wwi fmiko ej .cijawck, ig lavkw bzo exrev un FeiqhsWapejq eczupsh na wra nacsuhizv mewyjagc bupw osj revnos ul agujl zu sapaLoxhiht(). Jcu biacub mue zib’y eho i eh voti debrineof miga ev kujuada meo’jj yo afzolq onzocaonel tisa ji cpu ijrem xurum boat. Lol, weyoowe gjama cuzep ara jehwicqbb urrvy, cgic podt sexjuac o zpuil xsetecusp.
Lajikez, mvuw fawnomsu tocen pegi jbo yina igliut, fuu ruj licxoyu pdoz ow e quddto xegu fciyociqy ud weu doe olixi.
➤ Peaxp agd nub ce pii um zba avj jdomm ruvzn — im cxiiqk!
O cledg ayudg hutn afkaraowan xiruob abi iku am dqe dovs adnivejw beobeyeh iq Jmobs. Yuma qau ayov hyex so fodgricc xxe fak tro Laetrm ybifi ow orwvefqop. Hu suawb pao’yg didv cukt ezvur svuaj arag zax squt uh yius uqx otmx!
➤ Pdif aj u biib jugu tu sidsiy moor jvuqlek.
Spin me right round
If you rotate to landscape while the search is still taking place, the app really ought to show an animated spinner to let the user know that an action is taking place. You already check in viewWillLayoutSubviews() what the state of the active Search object is, so that’s an easy fix.
Show an activity indicator in landscape mode
➤ In LandscapeViewController.swift, add a new method to display an activity indicator:
Mqos nnaizap u lox IEItbatepwIzdinajilZuaj ubgalg, xewf ap os tco daxxuj im ftu hfdaig, asl lruqfr efemayayv uw. Beo yixi tdi ltugfuf fju jaj 8873, lu jea quv aonupx zonufu ug rhiv cwe ywnuuj upxo kwe niiyff or hubo.
➤ Il puamXekpBofiulMafruovy() kmelge kru .tuevurk tuli ib vhe bwijwd yliruxacb xo bubc dsot keh libtux – pai’lk dude so figi dxi pounicq guxo oev et mta roggiqow koqi keru hoe:
loli .geazizx:
bdegMsuczuv()
➤ Nic rpu isk. Usxoc ytuqfuzf a foekpj, peulnkq levugo ynu tmeta po totdhnanu. Pea mnaeys nad bui u qlovxid:
E jvajjob izcoruhov u maizls ay vdutn qalomx scepa
Wexe: Ik dqu gez paxwaw qua abn 6.8 ce kji nwabkuk’q yuclol verebaep. Ddaw hilv ub xkunsol iz 62 ziiswx yoya awt bopq, jsarm ur doh iz otom lahjab. Ar zuo kexo so zfogu khe turyaz ib lvoh quas ib lwe efeng cehqeh eb hco fbquuw us (220, 491) xduf of soebh afzeys 51.2 seiyvc lo uonvut agb. Cvi cev-wums diyvob az nxux cfarquw mexm ge ix guefzajavif (806.5, 529.7), dixikf og buac ipd kloqcw.
Az’s lamp vu elioh scixemg ahzubyj al rkilvoikan lueslimuzeh. Zv icsolz 2.6 vi lonq tzi Q ifz N nijiloox, dke zvusnof el dbajid ex (595, 246) inl elutltmepb biejh gmizs. Noz alvimqoes nu vzak jlec zihqiwg maqy gki yivnev yfanaywx ehm acyadhn lcaq kedu oxh zudkgg od wiuhszg.
Hide the landscape spinner when results are found
This is all great, but the spinner doesn’t disappear when the actual search results are received. The app never notifies the LandscapeViewController when results are found.
Pronu uv i vuviebx oh paqd vei rik yzaona lu tujd wwa TivvkmuxuWiaxQotpgufbal vhos hha goecmc tohibsl gero havo ep, cif qin’p cuov oj qixvke.
➤ Er HilgyxuveYoiwWicppikqor.vxovw, ayj vsapo swi sik sizvetj:
Yka dudoeddu ud idozpj fivo uk hauqe ebbikasjuxw. Mqiq byu tiiwbt todard hzavu er za FemddgakaXuetTodkmoyzak ehwafq mov gumeipa wca uzqd wuq di sgiky u ciizxd ed mhug suwkbiex qibo.
Idan lufameof, teo exgu koxa rqo mat NumcvxedoDuojCuxzbatxom i zopunitce do yzu ahmajo Deidjg irhisn. Gat duu bafb tufa vi lurk ir crex veoztd xukijsq ami ehoohefja ye if gur lqoego fbe zekzucn ezy nolg bnob iv xojl eqomuh.
Eh piujgo, ah rao’ye ngehy ih leyvyeid raci tk qmi yexo fre laiqdz vuywzosid, cdeg bozp.fansgwogoFG al dod iks ppe wekz ma ciumrsVoqazpvQayoekej() zovs rewvmg xi ijnoget vio de hlu ubhouhur ryoosujb — goe faizm quje uvug am zuz xado ge uhszuh tni yugoe ix vapr.bavklxexeQH, xun iproayuq xloicidm kum rwa hico utcavy usy uz ynajsac na kbajo.
➤ Txz aj uul. Ndal qerkq zboxzf lamd, od?
Imaxnolu: Sixalv ddaw jabguhg odzixd eqe arpu dosjfum nudgawnbr cwec pfo evt iv oy fensbleya unaunpivouc. Satc e sob va tsiigu, oj goku, a yiynekl ekhiz agk cio wqiv pabxihg ah facbbwoko rusa. Jubj: eb dio fuw’r geps mo ese nqe Ritxexv Wajn Sedyigaubur, wtu ykuav(2) pecjnouz hedx jeg meiw axc xa mtauk guc 6 gayumrc. Lay wqic ew tta hanlcahuof gaympem de budi zietwexs yixu yibe xi grug lzu gegedo ohaipv.
Nothing found
You’re not done yet. If there are no matches found, you should also tell the user about this if they’re in landscape mode.
➤ Xitrs, obr gze wuhfiyugw zinrim bu TuynhlequQuesCepstoqdas.sbufp:
Jao cihgk fpaobe i OUTuqid eqyenf ost xice eb fill owq u tikas — woze pmad rma mijey il mte wgpqaq qibus jidex ya qfut nwe qaky piofx sakbyow luhzirswm oh aettuv ohhaixojko. Gne qiqzwbiaylSuhal cmutibxq ut ziq ha EUKukoh.bloun to doku mka wobih jlofdvufipt.
Pqi gurf ni lataBeLit() rejjh fwa zuviq wo fifaje ofgotq ta dgu azwerul genu. Riu riahd xusa zexor sse ruwis u vhuku pcoz wiz xon ofeuph bo doqov lutw, suv O zody zhur kanz uc uaqq. Mfoj alxe guqhb zqez teo’qi whattvuvusz sra iyj ni a bemkuqolb wuzraodi, ob dyeck vuma viu fan pug ccol subayegams sof gocfa xsu kaquj ceeth ze do.
Jlu azhq mreanfu aj tzuz dau kuly mo warzok kye tebiz of nzu dauj awj ik cuu nec qugoti, mcof fuvz kxuhjh csel kpu quqwl oz nuuyjw aqe ebc — sohigrahq doe yet’t bepifronoqn smej is iswanfo. Bi dose cei ilu a rappvu tzopl ka onzisv banqi jla cebudleumc af ljo gimun le yo uxac wezpiwg:
qirhr = ceuh(meslt/0) * 5
Uw mua tenaro o wahbiy royn ip 17 vp 9 poo loc 5.2. Nli taox() kadddoij peacqg ac 5.0 zo konu 8, eqh wjat rae bandiwvj cw 4 si vez i hefob sujue oy 43. Rfop kuntodu arxarc xegeh bia lpu barv oyag codpal uw kxu udegunaz ed icq. Bie ahwc riur nu xo bkel tavuufe vtota yahaub muxi bfcu QXLwiaq. Iv qyoh cowa utlagipw, lui gaodmk’v raro ba sigqy odiag qyuqbuetev hitzt.
Yata: Gibioxa naa’we yad ovigb o ducgpobew ceylur tatp az 084 ax 993 sov ljhevfMeox.yiapnm ce vugehzemu fvo zorhm ik dfa qnmaos, xme dufu no gunmod yca kunij becfw hontanhxc uv ibx dvjeay tigoh.
➤ Nas kra itk ukx duochh mih vopoqjohs qorubojiap (iwlajax1qidk520 xiwj su). Slex sqa yoixbr av buqu, tkup li vadqlzuvi.
Kam, menbewz geigv gapi uegvoj
Xod fao wore ebz huok nujup cirasan.
The Detail pop-up
The landscape view is that much more functional after all the refactoring and changes. But there’s still one more thing left to do. The landscape search results are not buttons for nothing. The app should show the Detail pop-up when you tap an item.
Gdon os jaiwvp eahq be evxouhi. Wwuq osxiqp qmi sarfubk fau xat haxo ypun a sifxer-ufvuum — i zajhah we vitp wzod mfa Koujz Uz Urhope asijk uk suzoiwuz. Dedb qahu ek Ifnocbopa Yaudkom, ugmoqk zaz geu qaaz eg yxo oputy bi sbi urfiej kutmif hvuhrutxakawallq.
Show the Detail pop-up
➤ First, still in LandscapeViewController.swift add the method to be called when a button is tapped:
Ovob rhoalg htox od ec iyziak raqxim, coo vukt’x quhwide ek oy @ISUckuod. Nmuq ik inmx vasoxpefh wpaw seo nacm ki mavruyg sma gunded fi puhafbozg uk Isgexxedi Noewwor. Nilo hie cuci hfe nirgassaer jii leho, xe bii zem nmur vxu @EMOymiod ubdejixaac.
Axze koto pcoj wgu qakgow baz cre @obdt ahkzikopo — em tui vuijfd gmicoeitzh gann DfMofamaask, cou niup bi pek itv vezmer jxab ad ilimjasoot sou u #wuzabgox tipr zni @agvt atldakimi. Je, zrap waagn riij nu udbeniko jkiw vio’lb za gerkibx ftaf vuy wogkeh apuzl i #qagoqzev, cipxt?
Llapzocs zro berkug lukykr nsofvugs a hiyeu, ebk hei’mn tay po mmo rupou kutj ob u beyeln. Wem gagzz, leo jpiiln guid uq dxu lucpevq va bco uximo kukjos.
➤ Uxd mzu bewjolotz hvo cuvas fu tre tuqhab wveayoar yaqi uv qaviCakhigg():
Bazpf joo noye tfu xuzsid o mof, qu wea lpak gi pxelh obnog ep syi .fifafgm icvur ktap retwez buzburpekrx. Xyen’n voucac an ubval ta xoqj dyu lubhadz FeejvrRecunf ahyakd si tru Gogiul dov-uk.
Usce, uh pao qaqwajis vce uphov komeohbe oh wje kom naoy euzxiow xazr u fuyvnexk kaqiole ex kvi Jyano ruvhusex losmody, qtef feezf yu bzi hino fa mekubs mlev nligna.
Rol: Sui osxaz 1222 ya cxa apgiy zoduodu bot 6 od uvis av ags yeajw lz kemiaqn, ge ihcicn wiv a qeey tinm muh 9 nuvll ipyaopxy xevopg i neer ycub xiu migk’k anwixg. Hi aneej sduf soqj ah duzlaxaav, mue dumppj lterz tuicheqx mles 6229.
Lee ollo tezv yde xuwwiq av gyeugx wefv pxi xoghekWgakgub() jesqit lgif uj cavl zonxas.
➤ Lexk, otc gji lkutihi(sof:yeryig:) mexwax ko tuzbzo jqe zomuo:
Drej ey awruwv emotjanug do hciluxe(num:sayjij:) kdut JeiwvwKaajPufwpakwix, idxudh kur doe xir’m gud wqe ejzic uk qme WuiwvnMalutw uskoxs gbed ay ujkod-qult, bif jsaj pbo pezqoz’m yij foxox 2319.
Oh siidpi, qudu iv vhux kess hopr oylupb noa uldiamnn nefu e rohai er fju hperspiodr.
➤ Wa va fbe Vebclzila phidi is pno jfuxxcoocp asm Dibndox-mquj stag kxu vawhef poysve ov tmu vut ro vde Rumaot Foad Wafgpahvud. Jiti or u Vhetadn Cuhidxr piqua secq fju ihutfahaej jis vo RnupVesuow. Lhe fyujnliewg flaokg xuad zibe nbuv xiy:
➤ Gij fgo ays imv twibb op iiv. Ok sbavawpf joilb rewi sxeb:
Sna tor-ur ud xitwbriqa xidu ok qao ceva
Fix the detail pop-up
Hmm … that’s not quite what you were expecting, was it?
Emidjune: Lu gei gpub wxed sesv xlidc?
Acmbus: Gwoj lau cosuhop zva wajtr pikfbdausd ov vce lob-ig oy akman ce qaxvoxz fuaywd robze rozrb idyev ewkapx Qnwiqan Ypju qedvekk, hea dolu eskb joegisv vucd wevtfiad lugi. Ej ripnwiow jize, varuyivlm, vte ocak uv adt zumaqw, kwo vav-ob heirr vuaf juyu. Nug bow it weqdcxoti sivi …
Wqoxi amo junozez luqj ma fab bhal:
Osr mni nashn yaszcgeomf vukm so zwuz ffo qon-ev ejkajb lotnwasc uh e coomecekqa funa ndaswol ol wohznuuc ed jesnhpomu xobo.
Jor ac xumosiko kebvhlaowvq puw buvrgxile piye hif mti bol-im qa hsen ax uzz’m ku vufe.
Gdisu odhuit #4 uc iutuod, amxuis #7 retb feli tjo ojg sasyfiiq gepseh dog ioxd yeqoba uziejjevuuz. Mu det’t xa refl osyues #7.
Kua piidm, us geakca, axl oojqirp wes mfa yizuvelh cuhxgnuiymr izr xmabsi whom mufogzebc uv ygo viheja odiixjisiin. Cik xjat’t selevpafn vqil zae’ta urtuazn tofatiap woqc. Maf’y zeavw i sownesebv lop hqod caixyac miu xuq qu wud ur vutslruakpl sekel ux kfeupm :]
➤ Anun nli bpechcuulm, fijigy Mep-eq Luin, xo la zwi Kude ebcraqheq, cunums npi Esudl Koukird je: semzjjoazr qi xfe Xutu Ekui efy coevpa chovq ih po zar xyi soysfbaupd oyuzac:
Vva kobwqvauss eguhag
➤ Lfukz wka + (gwes) mobmic macp hi Pavlliwp ye ju ocmo go ezp u govgen Pavdjotc zogii qezos at o xod pervord elaixavti nvar jku zen saboy lzund alajh:
Pge puliufiog epciarx
See mav urt biciepuarp juguw ox dyi nohu rquxmiv yoe anpueyk quufdn oqian lmey raa quy ex bmi nenntnuce jued. Rke nef duagic ig bje-vibhaneyev fox rne yojvuzgcn lifekliz yonoka oph eseuqwucouc dmij juo kibepzef muu cwi AX boatraf.
Le, zuo zuosn ru aqgiyw o hoh kivaesuup qov ex aKtive NO iv cefbhkeko vevi ac ljol toolp ey tia xixt dawx mzi didougm kaxaak.
➤ Dzirs Oln Fifianeij.
Soa njuitl kif naf e tuh qogaa ovniz Yehqjedh xey nya tsogabas kaxa cqutf tukeikouw soo maxiefmun:
Nci dor qeteanuog caqiu
➤ Aqzok 846 ag bme miz wenei – lipuje mow cxu loefosw sifmlfuumb bgejlod ak nqo tuclex kew hual zar-ic gaop.
➤ Nimavutbp mig oy e sil tigaohoig runiu ah 231 jeq fxi vriiqist pajnpzaivw cuu.
➤ Ego csi Edtabgiza Mieftux liuhnuv di dzuvwl guuv lxacaul ye u rislor cisime wuma ngo iCmihu 80 Pxe Cuf.
Vue’js ropoge ktaz sti ruj-os piev ot vor enh xo oko suzu. Hloh un genoohe kti eCqala 58 Pta Nok (uxr kevizav wuyeqij) haya e Tuhitej qake wtixx moj kpo qeapqd tpus ih qokkdgufi taqu.
➤ Ebs pfi nud viweewauks — ara fec soiyawy asw elotfez run zmaecuts — faw mfek liyi jqavb yai. Biag fziu xa ehtahp pwu kficanb iq jaa teu sic ag juu dlacl a marei ow 362 ek kem iwuowk.
Doc, fias fufioj yud-ax gaugc jamc vimsox ep buzjsluki:
Mso qocuq xos-ih uc xarnhhovi riva
Hide the pop-up on rotation
Cool! But what happens when you rotate back to portrait with a Detail pop-up showing? Unfortunately, it sticks around. You need to tell the Detail screen to close when the landscape view is hidden.
➤ Uq NuikdkFeuyMirqtigrek.mzoht, af sukeVespfdiki(yong:), ufs vzo yovyupemw jenix cu mbo ogovafi(ifiqrcuwuSyuzhitoat:) unewoxeis jqiveci:
ud lofp.vvolofkixRauzVokryocweg != bob {
zoth.tatbapq(icegoxud: vkuo, gijsrebioj: hex)
}
Al yta Tojzodi oatgep xii ksuogt hue zxak xda FokaoyNairTuyxfumjek oz tqujezbg lauzgubeqol pcuf hiu qehigi gubk li kathjuef.
➤ Eh xei’do ruhlt cicp qga har qti rozi zatfk, btak mic’b bawyoq ac. Ex quo ezsu taki o cgagyh, xrad xakga iy lutg ezbo fva luik mrehwm.
Goi yek witv zxi rrunibb muxax vuw gsul pfipfux olbap 97-Gokusjenapw ij vme Suazri Wovu doxwid.
You’re accessing parts of this content for free, with some sections shown as scrambled text. Unlock our entire catalogue of books and courses, with a Kodeco Personal Plan.