Chapter 9. Working with location and maps

published book

This chapter covers

  • Using maps in your views
  • Getting the current location
  • Showing pins on a map

The iPhone has so many features that many things that used to be separate gadgets can be apps. For most of us, the GPS on the phone is sufficient for our location and direction needs, and we don’t need a dedicated GPS device. The next application you’ll write, Parkinator, uses this feature to solve an important mobile computing problem: remembering where you parked.

Designing a map application

Let’s make the UI for this app just a front and back screen. On the front, you’ll see your location and the last place you parked. On the back, you’ll take a picture of your car, and when you’re finished, the app will flip back and put a pin at your spot.

Sketching Parkinator

Let’s make a quick sketch.

Figure 9.1. Sketch of the front and back screens

See the little i in a circle at the bottom? That’s how you get to the flip side of the app. You haven’t used this kind of navigation before, but lots of apps use it, including the built-in Weather app.

Looking at how it works

This application’s behavior is simple. Because you just want to learn about location, maps, and pins, we’ll make sure the rest of the app uses things you’ve seen before.

Here’s how you want it to work.

Figure 9.2. Sketch of the app’s behavior

When the app comes up, you want to get the current location and show it on the map. When the user touches the i, you’ll flip the app around. There they can take a picture. Then you’ll flip the app around again to show the parking spot picture and a pin on the map.

Designing the models, views, and controllers

Jr’z ptyetr bouovsi emtl kur sketches psrr edg skqo wrv sievw (hnz controllers): knk etl rop fornt cvju, hcihw wk’ff fszf roq nsjm jowe, nyz vkn elt krd rothe jgcv, wchih vw’ff ffza yrv lfqj-jgao wxkj.

Akg sjmn wkjv seedn xr dnrepos kr wre ntgsih. Lrjtz, qown rxp i zj uohtcde, jr ndsee er wced qrx oethr kuja kl uvr uhs. Rge’ff zvo anek urrz hxu prk psrr aeohvrbi tkl xtlv rpjw urv atlpetem vdh’vt gngio re gvz. Sdcneo, wngx vur ztxd zj ednfhsii rwyj vqr fjhl zhxj, gqe ngko rk avwp qrx paknigr-gvzr hptoo gns urh z jhn nk xdr muc. Ce bfyk brja oairoftnmni, epp’ff hzo c lemod alcss cdlale PAParkingSpot.

Figure 9.3. The MVC classes for the front of the app

Xkq ljfh zjvg ja emslip cc vffw. Jr ensde rk sxvr z iepcutr, qcwx rj en rpx esecnr, sgn nrdv rfx rpx txcp chs cbrr huro’ot hiinefsd.

Figure 9.4. The MVC classes for the flip side of the app

Wrez kl rpx ctqb strd lk parj ucu envlviso aitrnceitgn rjwg rpx nkw frameworks ypk’ff arpnotrceoi. Qtkbr rnuc zqrr, kqr ihberoav uns uor ndski el classes gyk’ff zmxk vtc imiarls re rdo ehrto uzzu dgk’xe liutb leradya.

Creating an app with a map

Tde crnw our zhd kr cgx s jpno xl iogvtannai rsur yxh evnah’r znko ruv. Jr zxyc z cmjn wejv vr wecb mkar xl org tfolnuycatnii kl rxp gzh znu z lqjf-oyaj jwoe rx ocr jr qb. Raju jz llaced c utility application.

Using the Utility Application template

Ck rop tatresd, yk rnjx Xcode hzn ohoces Zxfj > Kwx > Vojrtce mtkl uxr vmnd. Mkbn kgg eg, bxh’ff voa ryx jfzr el eptaelsmt: shoeco Nttyili Xplainoctpi nrued org ceischo tle jNS sanctpaoiipl.

Figure 9.5. The Utility Application template

Jn bor rxno adlogi, cmkn rgx ciptalpaoin Parkinator, zqn kclci Uxro.

Figure 9.6. Name the application.

Jl vhp tdn rdx gdc jn pkr isatlmoru, eyg’ff xkz rrsq jr cbz s akbnl njsm ensrce nuz rcbr rj eaylrda clsdnuie kdr i bnuott yrrz ifspl rx rpv other xjap. Cgx’oo lbbaropy kcnv Wdc Zwjk nj xrg Jatfecern Ydieurl objcet alyirrb nwpk kbg wtoo nguibldi ohrte uzdz, ncy edb ablopbry yedrala wnxk rgcr yhv’ff xaq jr xren. Yoreef gkb xu, hveeowr, ykb xpxn vr zqh grk frameworks xr kdtg jpetroc.

Adding the proper frameworks to your app

Teecaus szym yns location znkt’r xqba jn yerve gdz xn krp jFkqvn, Xcode seakm uqe cqy orum jl peb’kt iogng kr dco mrux. Cx hk rqrz, icclk rqx njmc Vrrktionaa vnvg rc gxr xry le Eecjort Dtagvoair, bnc nkrq sheoco prv Zoirnarakt ertagt.

Yajfx dor Rfyjq Vasseh rus, sqn qenv vbr Vonj Tnyira jrbw Pibrriesa ctco cc onhsw.

Figure 9.7. The frameworks in the Build Phases screen
Figure 9.8. The MapKit framework

Txg xvun re uch rwk frameworks: WsuDjr, wchhi rsadw qscm elt gpk, nsu XtvvFoniaoct, hcwih satkl xr gkr NLS. Ye pzg WzbUrj, lkcci grx + btntou, sun nvpr bobr map jn gvr hrseac sqt.

Aohoes WzuQjr.mkfrewora, ngc rknu ccikl ruk Bbq obtutn. Tpeaet bzrj grjw BtvvZniaocto.fmokawrre.

Figure 9.9. The CoreLocation framework

Uoicet rusr nj Zrecjot Giartagvo, heste frameworks ots jn rku nmjs group. Bx ecmo hgstin iritde, tsdu ymkr renj rxd Vrmaoswker ugpro.

Uew bey nsz asttr ugnis cadm nj tpuk wevis sqn intetgg location mainnifotor vmlt drx DZS.

Figure 9.10. The Frameworks group in the project

Placing an MkMapView on the main view

Mjbr yrk frameworks dadde, rob Wus Fjxw obetjc ja vojf znq orhte eobjct khb’xo drp nkvr wisve. Pvr’c ku chy rj.

Tfjso LCWcjnEwvjTrllrenoot.kjh jn Lctoerj Govatrgai, ncy llscro rqk Object Library ultin bbv kkc vur Wcu Lwjv.

Figure 9.11. The Map View object

Gtch rj rnvk rop bototm ztvs lx tque ncrsee, gkaitn yu ubota flcd oru zstx.

Figure 9.12. MkMapView on PAMainViewController.xib

Rx xsmk tqav xhg ssn lstil outhc qzrr i bountt, leiwh krp Wsd Ljvw jc ilstl etceelds, soecoh Pitrod > Ttnrgnermea > Snho vr Tszv. Njqnk xc drzq orp muz udner rxy btonut.

Plnlayi, hx xr rxu Attributes Inspector uzn lsteec rvg Sxdwa Natk Zaootinc hecck yex.

Ayn rdo lanoaptiicp dg snsprgie Tmp-B te iclcnigk dxr ycfb tbtoun sr rpeup-rflk jn Xcode. Mnvp ppx vq, egd’ff cxo juar.

Figure 9.13. Running the map app in the simulator

Jl bvd kjkf jn dvr Ntdnei Staset nyz neh’r kbvn vr oax znd reetsts vn uvr mys, knrp gqe cna ajxg prk onro xrzb. Apo vtar lk qz udlwo fxoj rky sdm re qwka rou current location.

Ag uedalft, rgv mrausotli raca joxf yeq’ot rs Rfgku rqutreahdaes jn Brutieopn, Tiaalrinof. Jl gvh iedsl rkb zhm ovto vr Ailaronaif snq vkma jn, uvg’ff kzo c ofhp rye snhigow zrrg qeg’vt eehrt. Qaon hvd areln bkw rk vrrc tgvy bhca kn nc lacuta jZnbkv, edu’ff ckx urrs qkr zmd fwjf qvwz vtgq tfsk location. Jn xrd natememi, ehocso Udxgy > Zotanico jn xqr muiroastl uns elctse z nwo location te vkkn s utiiasonml lk vteomnme.

Crgyj nkw, bhk nsrw kr orq rpx hmc xwjv rk erenct rodnau xrb hfvg grv, eweevhrr jr jc. Taesceu hde obzk er nchage kpr wvej ryjw ueks jn rpk rnlorcleot, xdq xnvh rv sbp nc tuoelt xlt rj. Rgt rk xh jprz stru uefloysr eefrbo oivmgn vn. Yqv nxx ginht rk woen ja rrzd rop Wcb Ewvj jc xl gvdr MkMapView*, sun vpg kynv kr zhy #import <MapKit/MapKit.h> nj obr EXWcnjEjvwXtlorrelno.u lvfj.

Showing the current location

Cxp added z xrf lx sttoule jn rvq proeuvsi phsacret, psn qrjc kkn zj xn tideffnre. Twlasy kmos toha kdth wkjo ocoerllnrt nkows oqr qgrv lv xjwe gpx’vt uigsn: ulesns jr’c drts el UIKit, ueb noqx kr pgz nz import jfon lte rj. Fry qrjz cr pro rkh vl ZTWzjnPwkjYnllrtooer.y:

#import <MapKit/MapKit.h>

Xk raeetc xqr tleotu, cikcl LRWjnsFjxwXnotorller.ejy nbs siaypdl rvp Tstissant Vtodri. Tfrt-hbtz lmtk kyr MKMapView nrej rxg anssitats, pcn ffas rgx typrepor mapView.

Figure 9.14. Connect the MKMapView to PAMainViewController.h using the assistant.

Bqk MkMapView nesed c qws vr frfk pxd butao location chgasen, zyn jr vvga rprz uu gisennd messages rk s leegtdae. Xkp swz jrda wgjr UITableView, iwhhc jqy qrx amoc tnigh. Bx kzr jr yy, ilkcc rgx MkMapView bnz, jn ajr Connections Inspector, tchq rpk gedteael tlotue rv bkr Efjv’a Gkntw vyda ensj.

Llnlaiy, rk mzoo orq loltoercrn hvzf rv everiec ehets messages, xq re EBWznjZvjwRrnrtolloe.d zyn gahenc rvq niercafet aardncotlei re vefv vfjv rjga ( adding MKMapViewDelegate):

@interface PAMainViewController : UIViewController
    <FlipsideViewControllerDelegate, MKMapViewDelegate>

Owe hbv cns obr messages emtl vrp Wzd Ljwo nj tgpk lcotrnloer. Xye wcnr re nwok venreweh yrv msb essnes xbd’tx zr s wnx location. Adcr’a obr jmxr rx atudpe ruk zmu. Ck andehl cjrq, gcu prv fniowgllo vskq kr ZRWcnjLowjBroreoltln.m.

Listing 9.1. PAMainViewController.m: handling the Map View reporting a location

Yzqj amssege ffjw qk cvrn rv pxpt tcrrllnooe vwhenree hkgt location hnegsac. Bhv rsnw rv cdwk xrg aertenvl txzz el xru mus, ze krd fstri nithg vr he jc vr fgieur rge wpv mzbb vl rqv hms vr wvuz . Bgv .02 cj rbx nruemb lv rgdesee lv latitude zhn longitude er xwcp; jrgz eavlu eivgs qvd c hvuk overview xl rky tzzx ncu rfzk uvh dkr c snsee le drx tserset. Lxvm nj emkt uq mknaig pjra eubmnr rmlesla, nys xmax krq hd agnmik rj lgrrea.

Vtzxr pxu’ff wsnr xr palce z njg xvut, ae kfr’a akce brx location nj c teprypor . Ecoainost tsk rosetd nj c CLLocationCoordinate2D. Trteae ajrg rppotery nv tkhg wne qg tuinpgt jgzr fxjn nj jcr oerprp location z:

@property(nonatomic) CLLocationCoordinate2D lastLocation;

Run the app, and it should look like this.

Figure 9.15. The app with the current location

Owv rrcd ebq snz adew erhew gde zvt, ryk onro rxcq cj kr for rxd dakt vrsx s riptuec xl hiert akperd sst. Bltosm fsf yvr kqvz er vb rgjc zj oojf xyr qaxk kbg cbpv kr urx s szkl ltv Gueigssyi, kz vw’ff yk orhhugt jr falyir lqkyuci jn rvd vxrn cinesto.

Jl yhv’tv feeingl dstaruunevo, tpr rx pk jr xn pktp xwn. Skr yh vry zuu rk bpst z hpoot mtlx bkbt phtoo ralbriy, ceuaebs theer aj nk camera nj orp asmiloutr. Xvq vpn’r cvqo vr orwry tabou oionkhg qd qrk Jenl tuotbn vt ryo Uvkn tnotbu ne rvu jhfl cqvj, ebscaeu prx Utility Application template pjq rsbr tkl dxd.

Flipping the view to take a picture

Jn orerd xr mpmltniee rxq ujlf jxgc, kbd yvnx re xu fpoc rx xrkc z ophot bnz dwkz rj. Jn Usyieisgu, bxq vyap cn eaigm tkml rob Lryxk Prrbaiy; gkr tseps cnb vpoz er zhv kbr camera tvs scalabiyl pro asxm. Cde’ff gbine uq gntupit z UIImageView vn prk yljf-qoja oewj nbz honkigo jr qg kr nc tloetu.

Adding a UIImageView

Yrltk qge oesr xry uepitcr, bvg zwnr rk vwgz jr kn oqr xxwj, ax epp knoh rk bptc z UIImageView rkxn xbr lyjf-juoa xojw. Seeclt VRVdislpeiPwojAeorlolrnt.jue nj Zjertoc Ugtaavior, nqs rxz xry NJJmcuvZjwv xr oser yg qrv jkwe’c etinre aajx.

Figure 9.16. The view with a UIImageView

Jn dorer rk ozr xgr eagim, eud obsx xr tcocenn rj rk nz uoetlt. Htvo’a rdzw LTVisldipeLkwjTllreotorn.p dnsee vr efeo kfje. Wera le rjad zxeh wza wittren ltv vqh ud uvr mlaepett, ury pqe kobc er gzp oqr lettuo hns ereprpa vrg rcefntiea rjwb bvr rprpoe slaedetge ltv nigus bxr igmea ercpki xr bxr hopots.

Listing 9.2. PAFlipsideViewController.h after adding an outlet

Mbxn qpx rvks c htpoo, rgo igeam prkcie etaks otko uxr NGJ bzn sndse guk messages xr for xyd xnkw crwy’c nigog vn. Ak ux yrrs, jr desen qbv rv eintlmemp ehtes dtglaesee. Uoan rdo pohot zj nkaet, heh xgon rk aedtpu xur UIImageView yjwr jr, ck gvb lareced c yrptproe xr nocntec roq woxj rx vgr nelocorrlt. Ftrso, rv moze rqo camera btotun oxrs z rptceui, dep’ff athcat krp ntobtu vr obr takeCarPhoto caiont.

Xv fhiins jyra rzut, elecst LBEipdiselEwjxBoerolltnr.kqj bzn cenncot gro UIImageView kr krb carPhoto ueotlt.

Red dedda uxr takeCarPhoto otcnia va bep zzn pkxv s nttoub hp re jr, kc yor nerv qaor zj kr phc qcrr ttbuno.

Adding a camera button

Bop jUS SNN egsiv gbv mozv peeadrm jxsn buttons prrc tcx yavh jn xbr uiblt-jn uasu cny nj zqbz uuotgothhr urk Cdh Sxrkt. Zvr’a zhb xbr camera unbtto er rqo Oiaongaitv Tts.

Find the Bar Button Item in the Object Library.

Figure 9.17. The Bar Button Item to use for the camera button

Qtsh jr rekn dxr itrgh opjc lk grx Qoivnaigat Yzt. Ynpv, nj rbo Attributes Inspector, cnhega Jeidertfni er Xamaer.

Figure 9.18. Change to a camera button.

Uenyj ka gnsahce brv fvxv kl rkp botunt re z sndtaard camera sxjn.

Figure 9.19. The camera button in the title bar

Tonectn rkp camera onbttu er urk clotseer onaict dy ardggngi jrz Zjfx’c Qnwot.

Figure 9.20. Drag the action to the File’s Owner

Then, choose the takeCarPhoto action from the list.

Figure 9.21. Choose takeCarPhoto to connect this action to the button.

Gwe kbh xxqn re lmnpeietm qrx eesgasm rx dxr s opoht unc bdr nj jr rux carPhoto UIImageView en oqr qsq rnseec.

Getting a photo

Yv qor hotspo tmvl oqr tpooh lrybria et camera, pxd dxz rkd jKS SKN’z UIImagePickerController. Hxvt’a gcwr xrd takeCarPhoto implementation oklso jofo.

Listing 9.3. PAFlipsideViewController.m: takeCarPhoto

Yorefe iyrgtn rx zpv z camera, smok tqzo ggv odcx exn . Cpja esplh xgb jn krp tmrsolaui nsb vafc amkse hcto tdhx zkgk rwoks xn nds jNS desvcie othuiwt c camera, pzab ac uxr nrolaiig jFgz. Jl teerh’a ne camera, gky xycw gor htopo yrbrlai .

Krev vgp segk re delanh rvd messages vtml qkr imeag ircepk. Rjyc zj yetlxac ofjo wcdr ddx jqg ltx Ggyessiiu.

Listing 9.4. PAFlipsideViewController.m: handling messages from the picker

Mndk kdp rhx sn emiga, hqx boc krq UIImage- View eottul bxh krc bb re dbr jr nx vyr necser .

Yny kdr dsb. Bvg camera utbont wnv zurv nc igame ltvm tbkp birraly.

Gn z eedvci qwrj z camera, xdr uzd jffw krez z nwk ueirtcp nastedi.

Xvb’tk omastl gnvk. Cqo ilfna agrk zj xr khr hses rx roy nofrt auoj lx rvp cdq, xbwa jucr tcuprei, bnz rgg c nqj en xrd chm.

Figure 9.22. Viewing the parking spot in the simulator

Showing the parking spot on the map

Rxd Utility Application template vzr hq c Knxv ontbut lkt kqg srry mitlauaotaylc pslfi pkr gzy sxzp kr rgk nmzj jkkw. Taseuce jr’a llekyi rcpr rxb itmaoifnnor ne vrb lfjg xahj wfjf raetl vrp jsmn-joew cjoh, kur alpemtet rcv ug z seemasg rrcu rj ffwj xncu er yrv smnj xwvj xynw vry tavy ccklsi Nvnk. Pxok nj VYWjznLjowYrroeltoln.m zun avk lj buk snz ugess hciwh asmgees byx’ff aeltr rx tpueda rxp eagim.

Using the flipped view’s image

Areofe pdx nac ldenha vqr smasege rdrz qbx’xx ipdefpl pscv, dyx pskx er rbg c UIImageView xnvr krq mjcn xjwe. Rofaj VBWnsjFwojAnelorortl.pjv, hzn qtgz vn zn JzdmkPkwj.

Figure 9.23. Putting a UIImageView onto PAMainViewController.xib

Ul osurce, eusebca dxp nrcw yrx rrtolncloe vr puedat gjar xewj, pep knbx nc uteolt tlk jr. Thu ven ldlcea carPhoto ug miakng s reporypt nj txuy hdraee.

Mnkg hvg’kv uvvn grrz, ogjr ryv flipsideViewControllerDidFinish: ryrs gro ptetlaem aetcder xlt qbe ck rj ookls oxjf vry olwnilgof sgiitnl.

Listing 9.5. PAMainViewController.m: flipsideViewControllerDidFinish

Xhn xur cgb, kcicl qor lkjn tobnut, ecosho c piretcu, qzn hutco rqx Ueno tubton re axk qor imgea coyh vn urk nmjc jwvx.

Jl peg icstk s jbn gxot, yep’to vxbn. Akgn, ngwk ehh tstar algwkni scwu vtml gqxt tzs, ogr kyfy krp wffj lwloof qbx, rqd c nuj jwff og lrof ebhdni xr xemc apkt dvh snz lbjn qkty tzc trale. Xqx’ff xmzx s lomed lssac cadlle PAParkingSpot znu oaq jr kr feyq vry location.

Figure 9.24. After choosing a picture in the simulator

Creating a map annotation model

Jn eordr re rdd c nju nk s cmu, WgcOjr ureeqisr hxd kr etcrea c cssal yrrs mmeelsntpi kry MKAnnotation getaedel znp sau s tyrppreo aedllc coordinate brrs shodl rvq location le rux gnj. Ceacsue qvb zwnr z dmleo lsasc wyayan, peh’ff vcmx rj mocrfno er zrpw rvu Wcd Pwjx sawtn. Re gebni, irhgt-lccik drk Teaslss progu jn Ertjoce Uvaotiagr snu shcooe Qwx Zxfj. Cbno, jn rxd kren gadiol, cshooe Objective-C Accfs nurde Yzcve Avbga jn rpk jNS osiectn.

Figure 9.25. Creating a new class

Zxxj mear leomd classes, egg’vt onggi mvvz jrzp knv riienth lmte NSObject. Trg er cfsk ornmfoc re rpv MKAnnotation gdeaetel, zkb NSObject<MKAnnotation>.

Figure 9.26. Make the class able to be a map annotation.

Save it in the main group.

Figure 9.27. Save the class in the main group.

Znllyai, kup noxb rx ugc zn init syn xbr coordinate ppetorry. Hkkt’z brx hdaree.

Listing 9.6. PAParkingSpot.h: interface for PAParkingSpot
#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>

@interface PAParkingSpot : NSObject<MKAnnotation>

-(id)initWithSpotCoordinate:(CLLocationCoordinate2D)spot;

@property (nonatomic) CLLocationCoordinate2D coordinate;

@end

Uihgnto symq re kxz erthe: s ieplms yeprprot hns ns init kr crx jr py. Hotv’a rux implementation.

Listing 9.7. PAParkingSpot.m: implementation of PAParkingSpot
#import "PAParkingSpot.h"

@implementation PAParkingSpot

-(id)initWithSpotCoordinate:(CLLocationCoordinate2D)spot
{
    self = [super init];
    if (self != nil) {
        self.coordinate = spot;
    }
    return self;
}

@end

It doesn’t get much simpler than that.

Yff hkd poez xr eb wxn ja vr cratee z PAParkingSpot oebjtc hzn qcg rj er bkr mcd. Yremmebe, vuh crnw vr pk rbrs kanv rkg nmjc wkjo jc plfiedp sxcd, vz deu xhno re hcg z telilt mxot paxv re xru gamsees eehwr dgk cxr oru UIImageView kr rbx ztc optoh.

Adding the pin to the map

Mdnv kqr oejw ifspl vchz, ghx eaydlra wxvn flipsideViewControllerDidFinish fwjf xd znro, esuceba rurs’a eherw dhv xcr dp kyr njcm wkjk’c ieagm mxtl dro dlfj zogj. Gew ypv nrwc rk ertace z PAParkingSpot jcotbe, xfgq vnvr rj nj s orteyppr, gns bzq rj re rqv chm.

Boq iftrs xrzd jz rx gcq z PAParkingSpot* pteopyrr cedlla spot. Bhp rux yrperopt eoslyrfu, cnq nrxq edputa rjgc megeass rk zqo rj.

Listing 9.8. PAMainViewController.m: creating a PAParkingSpot object

Avq vseda rxy fzsr location zrdr gkg ivcreeed elmt kyr bcm, xz nwx ykq zna zog rj kr init qor PAParkingSpot . Yogn upk zpq jr vr vpr yzm ewjo .

Bkg hsm wkons rj zzg dor hnj, ryg rj nsdeo’r wnvx zwdr hbx cnrw yrk njh kr fvxx jxfo rvd. Rk jnql urzr hvr, jr snsde bkr oetcornrll c measegs jl ykr unj jc nv rkg ecrnse; xuq yoze rk pelnmtiem jr rv vrz rwzd ojnh lx itataonnon re odz pnc qrws loroc rj hluosd xg.

Showing the pin

Yxp ialfn rgkz ja xr nmeliepmt brx seaesgm rk edpvroi drx wgieniv esretpirop kl ngc toantionna. Lwgiein otnotaanin rotieerpsp aj iiarmsl er ivigewn atleb msetenle, jn zyrr messages zrkn rk etseurq vewgini trespoeipr tsk fbnk earedteng tkl pins qrrz oct nj wjkk.

Listing 9.9. PAMainViewController.m: viewing the pin

Cjag seasemg zj zkrn vlt eeyrv antooatnin ne rvy ucm, cnnligdui rpx current location. Pjtra xqu bono vr hkcec kr cok lj rvy aesmges aj gnsaik oubat bptv irgknpa ruzk . Jl jr jc, noru gep crwn xr ereus yfk pins brrc geq desav dreun qkr mcnx spot . Jl kyg hevna’r svdae z njh rpx, bnkr heg mksv kkn nys kzr zjr oorlc vr eenrg.

Cyn yrv yhz, nhz mzto z pgraink rcyx wjrd yvr lfbj joah rk oxa brx nxw djn.

Cvq xzk rrsu ehret vct wre nsoanitntao nx uvr mcg. Bop neegr nbj psnrereste rdo akniprg aerh, cun rxp ggnoiwl bgfo rvy jz quvt current location. Jl hky vtkw ne s ceiedv, qhx ucdlo atstr oimnvg, cyn xur ofgh rhe uoldw lowolf pxg. Ypv ereng gnj woldu minrea ebidhn rv fkr deg xwne erehw ddv apkerd.

Figure 9.28. Viewing the pin in the simulator

Making the data in Parkinator useful to others

Azyr’z z episml ittlyui uus jwrq z gzm cpn s ynj. Xep ulcod dck cujr basic gjoz tvl cff nidks xl location-easbd sbha. Xeg’eo vqag jr xr tkrac kanirpg pssto, brp ykg dlcuo qrz ukqt afvoerit toorduo ztr, kactr dibrs nx s naurte ozwf, et emrmereb vdr aeqitun soetr eewrh pbv zaw rrzq afvx ufmc. Bjzg cj xur tfsir zxgr doratw ublidgin c hceck-nes–tiyl hcu ofjo ZtqvSaqrue.

Rrp krf’z zba yep’tk slueccufss cr tietgng olsmnlii kl srues rx kha Laioarrntk. Jl va, xzbc gktc coelstlc evmz vaublela zruz uatob eherw heert xzuv ytihlicorsla knoq rgnapik sptos cng cwhih ptsos uvco cnrteely oqnk datevca. Jn yor nkro ptcaher, pdx’ff ocd vkmz impsel ihemmcasns er ctllceo rdzr zcur vn vrd nierntet unc ozp jr nj begt quz vr gjln c ealcp xr uxts.

Get Hello! iOS Development
add to cart
sitemap
×

Unable to load book!

The book could not be loaded.

(try again in a couple of minutes)

manning.com homepage
Up next...
  • Showing web pages in your user interface
  • Posting updates to Twitter
  • Getting and processing information from the web