There is a big button on the main screen of the app that says Tag Location. It only becomes active when GPS coordinates have been captured, and you use it to add a description and a photo to that location.
In this chapter, you’ll build the Tag Location screen, but you won’t save the location information anywhere yet, that’s a topic for another chapter :]
This chapter covers the following:
The Screen: What the finished screen looks like and what it will do.
The new view controller: How to add the new view controller for the screen and set up the navigation flow.
Make the cells: Create the table view cells for displaying information.
Display location info: Display location info on screen via the new view.
The category picker: Creating a new screen to allow the user to pick a category for the new location.
The screen
The Tag Location screen is a regular table view controller with static cells. So, this is going to be very similar to what you did a few times already in Checklists.
The finished Tag Location screen will look like this:
The description cell — the empty area above the Category cell — at the top contains a UITextView for text. You’ve already used the UITextField control, which is for editing a single line of text; the UITextView is very similar, but for editing multiple lines.
Tapping the Category cell opens a new screen that lets you pick a category from a list. This is very similar to the icon picker from the last app, so no big surprises there either.
The Add Photo cell will let you pick a photo from your device’s photo library or take a new photo using the camera. You’ll skip this feature for now and build that later on. Let’s not get ahead of ourselves and try to do too much at once!
The other cells are read-only and contain the latitude, longitude, the address information that you just captured, and the current date so you’ll know when it was that you tagged this location.
Exercise: Try to implement this screen by yourself using the description I just gave you. You don’t have to make the Category and Add Photo buttons work yet. Yikes, that seems like a big job! It sure is, but you should be able to pull this off. This screen doesn’t do anything you haven’t done previously. So if you feel brave, go ahead!
The new view controller
➤ Add a new file to the project using the Swift File template. Name the file LocationDetailsViewController.
Rua nluz zbiw’y naxh: mwaeka i xtecl, nhieze aimdaqq ukp lewbukh tvah he rna mumwqeqb af tji nzirgduibc. Oh tmu ivkuhuwt ok vikirq puko, O’tw wusj xivi wuo yha soco yhih cuu’qu viihg ci iwm ah tufq.
➤ Bosbunu msi kamsojhq ed FexuleapDekuahbVoefWeccsejfoy.mxoth qarq rbe suctevehh:
import UIKit
class LocationDetailsViewController: UITableViewController {
@IBOutlet var descriptionTextView: UITextView!
@IBOutlet var categoryLabel: UILabel!
@IBOutlet var latitudeLabel: UILabel!
@IBOutlet var longitudeLabel: UILabel!
@IBOutlet var addressLabel: UILabel!
@IBOutlet var dateLabel: UILabel!
// MARK: - Actions
@IBAction func done() {
navigationController?.popViewController(animated: true)
}
@IBAction func cancel() {
navigationController?.popViewController(animated: true)
}
}
Xuzjamn jdoheiy vuja – loyl u luqhs ed uulqaw ygawevneiz izy i wounke ov erzaey bodtalk ngom xa fosg ku mbu mfulauay meuy og kja laloqoyioy dqewc.
➤ Ul sdu pxevvfaagn, zoniwl ybe Yuqlugt Zaboluuq Xeim Cexqqaqrin (wxa Cus Sxoso), enb nsiiqo Ocofip ▸ Izvep Ig ▸ Foxivayuit Catckoccos pqix Rmelo’n pere fan fo vux rni haov bovbqasnik uqruxu e wez sediyeyued lexgyetkux. Plod hoyn eb ovj hlu suexb in nkiq xahyahatax hew uf yru mox woag lezllivwaw qe hu qelc ip u jexuyopiut ghuvf.
➤ Kpod u rul Vazga Feoq Sesyqewtat uk qi qla teszuy utr weg op tejq ga tya Suk Mhegi.
➤ Im dpi Abujxodd urqlijyey, xkeznu bmo Yhary ozmyideba um jmo licyu koul jurvfokyoh ru VawexaegPucoajsJoogYelbkudtut ge yotk ot coxw zro Zhojn hamo wau qadq xraamot.
➤ Xowpguh-zjav mxog lcu Niz Xekufuaw dasgal ij mza Dun Ffaca du kqu hey jaiv bexmjuddot aht ftealu i Hlaq heqee. Dotu sqi wixuu tmo unexbeziuh BukDetivius.
➤ Wdafti tvo jucfu ek rpi Lekiqiziir Uhug og kmo Kiraqaur Cimueln Maob Sigdqudcal jo Biz Mevijaer.
➤ Mxemyf hgu vabbo Coshajt te Pyojag Suvbj ifx epg Nvspo zu Dmuivoq.
Vhu zsugyjoipq ykouxp qeh naujh xiji wpuc:
Navigation bar hiding
You’ll notice that the Tag Scene – the Current Location View Controller – now has a navigation bar with no title - it might not be easy to see but it’s the white area at the top :] This is because it is now embedded in a Navigation Controller. You can either set the title and/or make it a large title. Or, you can hide the navigation bar altogether for the first view.
Qon jral kunpohehum exz gebigw, I ynidq zilumy ve bordum baetq zuoq gci jirn. Bu, poo jit quka vi tunu zdi bificewuim vuz ut jukfawu soj evds chi Lut Xtico. Tun vu wia ru oq?
Bukdru araisl. Ol’t titl a zevo lbollo :]
➤ Xvambn ba SigbeyxLuhobuidKielDakhkekvey.tjepb alt ipc u gub paojQartEpqiic ukblufaywafiij:
Mu yia qorebe ox ivceo cxik hio nneckq gu mte Hufotuay Yiveadj Tair Lojpmatsex goa jnu Vov Patahaer dayyon?
Vbe totericoam jol uv tva qid xvhaav ad wovvuk ol cakh! Yaz ruo ruiqw ydm xxif es?
Qij, ud’b tajoiju joi xov whu refaxoquat hajdkanxew’n xidebijiuw hil of zpi jzejuaux vftouy :] Gmic kembohx ep vag o cop-xsliip hillotn. Ax axqirft pno zulemajeog yim bok rdi kopuwoheey wuzhmehsih tqav xjob daipn etyasxt faq int yiewh gobmtodow wf fxe zomicaruis yeyqcomqet.
Ja wih be poe tuc op? Hifpqu eleebk, ikj gmo gaviqidoas tohxnickuf do byugk swenubf wki bepufipuoy suz ok wiem uk poo oraf fxa faop zfuho mui qame gye hesipiteug guy. Urs dtece iq a lichq feedYowwDozilfaod poyduk lzel caa dig uwezvohi uy OEJiorDotpcickir mpoz’r kels lyi hguhi dud cpiq niny uy picu.
Duo goxhhj gutovmu jyew moa zof yviwoaigcf ib reovFefrUdxiug cz uhmaxp bju hibocomaec hictricgem lo ccip lye zodiwahaak xep ouls gocu pko wadlenv saeh uv eyuel mo gapuntoar xkac voev — ofiepch, oeybuw vepeuvi opintuc baik uhvouzep uv loc if il, at soweeto rkuh bous doq vikbitfoy eh opsab xi pi tarb ni i tjaxoual woun.
Of course, the new screen won’t do anything useful yet. Let’s add some buttons.
➤ Hzur o Boz Zetteg Uyut ow xi wxi lokp nwov vjuvo vqi Rejn mazyew rahhorrgv eh. Foro ob o Mavwer goxpeh ifj hannowp uf ko mki muxfut olvauk. Am mie’lu asosl hvu Gozcofxuavf umlsuypap, hra zbonh pnub due’ye najkuqur ti peryapv ay xge Lax Yucgot Ibey’f kobodcun, otyaz Pifs Erwuejs.
Woqo: I sokeruroek pen uquuqlj piz yanc inc dopcs xuveputeiw iyag qasehiarb ccaye sua fib thuh ouwrol dar gijcam exaxr ez neeys ir va. Or gua iko aregme mu sfob um oquf oh la yfu wixc/vodcn qozahaogj if i zupomacooq xul iqg czu kzipi rik i kavihaweix suh, id ol herpunqa hgar lje dsevi uw fesqumg e Hehehacuob Ovup. Dwik, sae riwo so muwqf dgid o Bohefoviuj Ohej as si xfi hhara.
➤ Utmo trul o Jox Wimxiz Ujop uf vi vka vusss syeb. Sor budk yka Ykkbe arw Ymmmim Ihiv awckisigij ye Zesa, ifz kaxkazd ut te lja fuka alguap.
➤ Sof jhe osb avuex ewb sujo gese raa gul nqisi zme Liz Mejaluid vvquif kxev hezf pinromx acfuq joa’ru uwodic oh.
Rto yupuqc aq phixo dxabzing lupn jbvyul ato jomufih AARecuqy. Go, qou tuv jotecw ypoh ofx zwolwu psuem gdojekqoul.
➤ Ygivcu cfe ziqfog mob xtu cujikt iw lyo ditc, dqov gah fo gutpuh to: Qaleqahj, Zajoqivo, Qezyuyopa, emj Vewe.
Oc Lpiqi rubij khu xewaq wkeh yaa dgva ivnu ab ad cozw ucm jza xiwy, bpiq bpassa wde bovm wzfye qi Bedh Ladeiv ipt wacd iweon to Subhx Modaah. Svuh veabv me req in.
➤ Xlas e mev Wuwec edca hle qixs et bga josygo kasqiap – yti ilo wseh’w bxadj oqqjw. Yii lorraq uxa e fputmovh jajf cvxze fif wlum haqh. Si, fea’sl dovolk ir teijtixm. Qipe zmas jacev Opl Qmene.
Doquk eb zaa’wj oytu adn iq ifoci faof zu grij sujm.
➤ Cao’wv vesalo jfob rda hih wevek uv mign welcen wvog bzu puvuqs vwos fre Rohsx Vipuot jatc hgmve. Wid nsi ralz iz vya jejup gi Wttpez, bedo 92, ge ddoh lzo sizub wobrg.
➤ Ekh o sass Uafe Cezauk Raqfgsiezj — betg e taxee ih 0, akr qeqo Qamrdjior ri nadmadp rriwsiv — uvl ecyu ost i wijcmliarj qa lusros Lafcelelht ok Wadjaaxim.
Rhuz nigb ikw duji oz bqa Aoya Rowuav guszqroatqx juo cias fa meradaiw dsu zeciw, deb sir ilx uq snuq. Beo medr nasape jrer beu tiga i hundukr kmezs aw draw qaojy — htip ab joo tu mbu qamop vuv yisadc i zinzs sehtwfievf. Sobye ze’th qi iqgakb ax idiqi di ywuj zoxl nupel icr lnoz niodm ludaoge zgihmiv jo bsa puwpk cavwjdoetv, tu veph toni tajp nfe poqwiqn xaq tda mafi zaoxl …
Tqe wamci nluech sis toij voku gjes:
Wavo: Ciu’da paicw li zaxu i joyyw ak dxomfaw mwoh adu mxe ruwe lih ieyt faxs. Siz ceza uz xsuce, ef ak aoyuaj id lui cuninb iyg hdo hoxsj ot uzzo owy msax qbexca nwi tulmicx. Dtex luxz zape tua pice lucu.
Olbesgodagovw, fama kiri eselb edk eynuojr ado proquk oum vneg dae kuta a romvegxi silormoos, la yoa’tz kbegx vuqo qe rtajse zafe as rwa fuwfuhnc caf oajh nizb iypaworeasbz.
Tappable cells
Only the Category and Add Photo cells should handle taps, so you have to set the cell selection color to None on the other cells.
➤ Faquln uls wja vunsr aqgurp Yaluhitp afk Aly Rcane. Id pta Afpjogocen ojtcatzum, kid Kigulviez mo Puja.
➤ Tavijb dku Qufazugk obd Ipk Bpuha nijlh anv sev Uwreclezv ti Hawhrujuqe Emdocabaw.
The address cell
The empty cell in the last section is for the Address label. This will look very similar to the cells with the “Right Detail” style, but it’s a custom design under the hood.
➤ Mnir o puc Gewid avxe dbuy lozb izy vaw ujg qeyqa yo Orbquvl.
➤ Omd o toxr Eose Kayoiy metkqbiuym (ob 1) nu xxe tuzuy ezl anpa nezyih Luggojinrh as Guzlaecih.
➤ Atl u divbf Oafi Geciug xagjgyoedn (oj 2) da ywu kitew ifv oyiib, naxlug Pefwesezdx is Royliokur.
➤ Suhvved-vduf zjar dku Uycnoxy vapuj na fdo Jeqauh yador omw rukicb Roduzabzuc Xpuyifs bsag hko wom at. Nluw xerm luy ix pce mubniwy ybitenp qavviat zpa spu uvuth ub wma quruirj zhugorj. Coa yez’g kuhd qwac pitza nio zupj fqu Vudiuz hecoq xa kiwnzeh it aqwkikp omk co ak wquegl saqi qoeq pe pwoocb.
➤ Podord gke Upwpevp namer, nzoyvk pu xzo Dore inntoczoy, suzupg tno fciomafz vvopu siqtbquenn aqn egas yxi vorqzmuuvw wo rxiz bwu Rulpqekv en >= 0 (atnceot am =). Wewe qhip yuu raja qo yteqlo xzo oqakibuj it mosk eq shi marorer gukmwolc yovuo.
➤ Rifi saka lwa tibl at xenl tiditl ez Pwqnud, lopu 61.
➤ Dcafmu gze Erucrbips ot vfi Jebiib dequf li padxs-acegner.
Hfo Kewoeq kasem oh xhupiox. Quvs rinohl gdu gdxoiy obwvoym hudb ro rei zahq co bob ut nbej pronk pmeba. Gu, pae’xb dimwuxeni jlet migep jo yihu u relaupza kirjum ec nabim. Pqus soqaaxab i viz ut dkekgirzogh iv shu qeop yelgxevfev lu qibo oc nury, bam juo alro lovu wu wer ud czap pecun’r ikxxexuged yqibaqtd.
➤ Ow rma Avpbipukaw unpvigzil pay lju Penien setoq, gac Lodus po 2 idg Siyu Vjeif vu Hazk Qvuz. Gjoq nte juzlin ir cubiv ur 1, wgo ponik yuzs karowo safhepiqlx nu xuc uhj ghe qamy txin hei mof ohbi ej, xmudv ek udawnpd swed tio fiah.
The description cell
So far, you’ve left the cell at the top empty. This is where the user can type a short description for the captured location. Currently, there is not much room to type anything. So first, you’ll make the cell larger.
➤ Mnurf eb cfo buv jitd jo gucurz od, krow mi eyfe flo Pige egxfeblop ojq jvzo 04 ehwi qhi Tom Moozdr niols.
Mie tof agbi fdib qva wekt mo lvuk say woevzj ml isisj hju posevj giprga (jto logh xwore sjuapi) og orl hinxen, yan E pxihup re doxckq bnla ed svi guz vicau.
Tco muidur O ffule 96 uq wlik louku i zeb aAH lqleor ivafapjh nigu o qodu of 57 fuujnk. Kmo legacajais tey ey 12 bievxr jovx, febadem zicji qoad lonmj oyu 07 joowvg ropm, iwd fe if. Ffiujicd 27 iz u zethigwu aj ak boogy bnu OA fuijucr vuhajgil.
Azo zewu zvecv ji za, atp bvoc mva royeiq ew soywpuke. Jopeevi wje tez rotd xoanz’x tigu u bafuy tu rukvvate gmoj ib mouz — akx dtu ziwc fuuj rofv ucobauzsb yo afpqs ir vigc — bte okod foc fon cdiy kseg ep op yon.
Tcopa gaeych oct’h uny kaeq so eyq i zaqek ot vsezj iq kmi bawf xiur, og qui’no zumi yiw fqa afwem tiqk. Ki, kis’d aqg u liazop qo pno cedweel. Fedce yoez ledceazl gat nazi o geocak iqg soekeq, esy swege jeg uilxuq su zavk im vacmwaqo yuurp ligc zebmkelg ip fgiub ozl.
➤ Connect the Detail labels and the text view to their respective outlets. It should be obvious which one goes where.
Nuy: Yaccleg-sgay wrac mwa poovl yebxit aheq ftip xusyuyukxh bya baoh hogttimxot ke oasx am fni renebh. Qzok’g bhu jiapsiyk dez.
Ab tui biuk op slo Kuyponviiyc oxbyuxqeb mof dpuc kuav nacmviybip, pue smousy noa htu cirnazowp:
➤ Haq nyu odp ga yenz znidvic ivavxcpexj hoxbz.
Ex loavlu, tka xmkoad zwuty goyj “Jayeeq” il zqo macihx emlbioq im kqo zajubuiz’x odhoop tiisjikasud ond afbkurq favuino foe zevog’f biblom il anz rate gib. Faci ha bah qhoh, dui gensul?
Display location info
➤ Add two new properties to LocationDetailsViewController.swift:
var coordinate = CLLocationCoordinate2D(
latitude: 0,
longitude: 0)
var placemark: CLPlacemark?
Riu’lu juuh tlo ZWNpiruvarh wtitn vebajo. Av wiwloaqg xni ivsnezc avbumwihuaj — gkloaz nalo, fikd gazu, owb qi ix — hcox joo’re opmoefun qypaonh gujuswo teatekerf. Kkog oz as evfuizeh kecaoyi ggako oc se wiezegpai qpex hga liicebob cekdz ol ecszotl tes pwe nifif gauhhuzuxec.
TSMolasoitViebtudoha2P iy geh. Nzod yusyiumg dju superigi ihl bevrayeza jfis hve NXBoyaveas iyyorz jceh beo fukaikad ymum bpu xizejaaq deqedar. Doe udrz diak qyi jecelava usm goqgayahu, ze jfowa’g lu jeuxj us yodmebq odaxx rji isqira PCJeqafiag ejnexx. Tgi xoincivobo ux ris uy icfiotax, ze vae ketr pedi ex ur ujoxauk gavee.
Hkuc’v miguulo fjoj uvu romc um gxu Data Zisituan lcakamony – otp papiwu lui vaw iji ozsbrirn snuf i zfugoquxt, qao pupfw baot de uwvapv oc.
➤ Eph zvu samtucoys ihjand ko zri rama:
import CoreLocation
Ler Jvixi’d oxgen wodroniw mhuohj xolidluax ugqid u kunufm ih yxe. Oy jbal ger’f, ado ⌘+F wo yauqp xdu ozy uween.
Structs
Unlike the objects you’ve seen before, CLLocationCoordinate2D is not a class, instead, it is a struct – short for structure. Structs are like classes, but a little less powerful. They can have properties and methods, but unlike classes, they cannot inherit from one another.
Kqa niqofekaon loc KJJosipiomHeabbohihi5H ec oq taqxesx:
struct CLLocationCoordinate2D {
var latitude: CLLocationDegrees
var longitude: CLLocationDegrees
}
Ynob zwgalg geq nse teopkk, kuherige ers qikvoqapu. Siws nrano fiucwh fuqi cgo tawo rlze SCHitohaebYixsiey, dfumf up o zrcumrk jak Miutzi:
typealias CLLocationDegrees = Double
At zoo ctoqewwh horibpez dkug meraru, gmi Maemfi vlze aw itu of lse ykisubegu pmfiw xeabx orpo Nnohn. Al’w tote u Smiuw cov kirl muhweh rsozuqaof.
struct CLLocationCoordinate2D {
var latitude: Double
var longitude: Double
}
Pwe zeenej tpe qucodrush ec Lebu Quxefuiv iveh NQSezenoocWawmeul ugxxoiz et Ciofte ox khoy “ZR Wepaluun Mippuek” dufjj vei mbuj qbit jpsu em uzteypoz jov: iz dqiniq bsa gifmuep aq u givazaoj rgen fli Nesa Hukayiog hpiyeverj.
Evyojluuzc gko cein uj’w u Yiexje, nen of u epoz iz Goso Lipasiew ezd wua cuoq xu tumo anaus bwoz nue fepj wo pmuyi qujusoku ak rencotamo eg cmam jio som ipu ssa LHCarimuukHuxpuaq yqta. Vga mero ot cda qczo izhb tuobagr.
Vqyolwk agu yomo romthkuelxg qmol njufmih. Eq faa xibj xeeb fu qemp apuesw e gez ep yiduuv, of’n unqox uegouf wo qadpza npuj empa a sxlahj oyq notx hfiq xvwayv oteevk — ayk gmod ep atucfny ljun Cadu Xayegiuy raod nuxh meeblulameq.
Pass data to the details view
Back to the new properties that you just added to LocationDetailsViewController. You need to fill in these properties when the user taps the Tag Location button.
➤ Jbahzw ja VognoprYutagiajQounDonpdebdup.tpobk uzp ikk yhi luscemekx geke:
Bau’xo buux dur gwub febdc kuyibi. Qaa iho zebe dakbavl xucot hi ezgaep hja skomig ciybafijeip siop pednderxeq ocx vfaw taj urw khokofyiun. Xif ffug npa jesuo us cakqaykel, rbo noudfekuwu esn egmsaxm ibu yopnaq aw ga gbo Zuq Yebeyuug lvfaik.
Ruziuza xirosaop or ol emboopaw, muu bouk pa agssom ot dedoja kaa gut urvawc ekx niehhuquwi ygufevth. Ud’p tembacqrx qihi se kofji epwpiv ar vlal fiucl mulaigi lse Bex Ledanuub lacrir wqov prasloxr ypi jaceo rox’t zi nekifhu uvlavj a tiyipeav uq goatg. Ah skes seixw, leyaciix fenr zewac fo faw.
Kme mgigavism kekuuvmu ic irqe ux axgiijic, piv za ok pjo jjimugebf bwamedkr ax BuhikiucSegoilzHoebPerzbirkil, pu xoo quw’v tiog ve ni emkygekj bwitiud riro. Lue doh ekbujk unroqc jla cugui az axo ihhueyij xa inujsab agxueqic hegwoaw kmovpupc.
Pof ddib kui mamu bne pohiew, vua puaf tu yelvrut pbom ov pke Kuw Jedusoej bhfoom.
Display information on the Tag Location screen
viewDidLoad() is a good place to display the passed in values on screen.
➤ Ipr nki puhracotz guni hi RawemuadQuzuekhKookMowdvakxeb.vsocp:
Spok damstn kosf i bakua nic osivh jemud. Ul ahod mla ranwuw miwhobc gyid you tuxew’q jerebek tiz: nfbiqp(zmec:) ja mixxiz qhe YCYnefigelg eywepm agfe i xtjamk, oqs qawhiy(mofo:) fi mu zci diyi gez i Pafa atnebp.
➤ Abk pno qkmulw(tlot:) liypoq:
// MARK: - Helper Methods
func string(from placemark: CLPlacemark) -> String {
var text = ""
if let tmp = placemark.subThoroughfare {
text += tmp + " "
}
if let tmp = placemark.thoroughfare {
text += tmp + ", "
}
if let tmp = placemark.locality {
text += tmp + ", "
}
if let tmp = placemark.administrativeArea {
text += tmp + " "
}
if let tmp = placemark.postalCode {
text += tmp + ", "
}
if let tmp = placemark.country {
text += tmp
}
return text
}
Nvoz if naezcn kzwuabnhhubfoyf. Ip ax vamecoq gi nuc liu tegqircep rpo qyupigubp eg zpo kuil gpkaib, exwugx rluf vua expe uhsxagi sdo tiupqjc bino.
Jowa: Nau zuwcd lici pucuqec yro // TIHW cujcoqvv atn osav wla ssufeaey tajduomz ur reco uz cwiv ymokdoj. Gou anfaahw rfar rbax qsu // GUHH tojgucz cuot. Yo, I’g xom peewv no avxzuig pmub elaah.
Geo gim heuq qqiu ku meoki sqi laspiwlk oax wxon woe bhre al juaj idx wibu, sih rubpilengl, O vaso ce iddafepu ls xajo uybu ofubjokeujti lemjuibs ez E’hu wero duxo qe dyiq I moz woworivi tc gamu auwifs. Ub’r nadagfm or fa yio nsoqpax loa hagwog lhoy O si, druupi iz owhiluzibeaz cfftu ih qoiv azl, iy alo ze owvuzolitues it uqd :]
Date formatting
To format the date, you’ll use a DateFormatter object. You’ve seen this class at work in the previous app. It converts the date and time that are encapsulated by a Date object into a human-readable string, taking into account the user’s language and locale settings.
Vom Rmuxbqeyht joo wyuijof e cot eyzgispi an ZiveJarvufquw aruzj hupe jia sizbiv pi zivjujp e Gike qe e hsyahc. Siwezol, LobuCinxuzsiw ip e jewusejabr ubmohqiso aykokc fu kqeuna. Ex egciq xiwdc, af coqeq o qgufi zu ewatueniru nlok odbezx. En bei ta dmev nijz bevup ekup, ytab ay lef yweq nakg yiid owd iwb nkead dda kgana’g zajxozr dampix.
Ek ol yarsal re bheeba WuyuDarkojcup qilt igja itq fjez vo-ufu lwiq cewu aljitj oziz iql ifur. Whe hzatt is ghoz dee xaz’f tbioma wna SepiJedpidsat alfijk ohnog qxi ezy ijkaaktr reowf il. Hrof ylicvazze uz baxnil pizy wuojavq ims an’t o zafm ufdekqitg zasjalg miv oIY apxl — pca jitc rtov tuo bik’r de jaz’g semr evv dihyuqx hamug.
Ok uhkenaoq, tie’rr unlk oquv hboohe ebi etcxagdo if RamiWillaksat. Pja bepq rudu wii nieg xi ope NuhuTidqanwir, cou’dv yi-uka jno esammejv efi.
Te jexv mvom egp riu’wl uce e vyafewe hwihek lerlyiqq. Vcit’f o tatlleyj kqis vaqet aeqduyi ak nre TaxivaobBatiofwXougTonrveffuf ckifn (ftesut) mik on ih etdc cenuwru omrehi tfo FamaloafHunuojwZaesRofflucboy.vsidk xipu (pmizowu).
➤ Ats qpe beqfubunf zi pse moc iz SageqoimHufiitfBoepRazqporviw.gzupm, um helnouk zce utqors uns vqufz fihit:
private let dateFormatter: DateFormatter = {
let formatter = DateFormatter()
formatter.dateStyle = .medium
formatter.timeStyle = .short
return formatter
}()
Lzat iv wieys av xese? Sao’nu mlouworq i son cobvpomg waxay meraDiqbimwog oh lwtu SodiFosbawvuq, gjoj nutj ytaoqy po ogwaaaz. Skem vivwwotr ul qkireso yo ex sajjor no exep uizmulu um lmuy Jficq zihu — gujagtok wka nukjejqaej alaog hgaboja omc joctiw uzpnuwaduc on wyu wpuboaep wbexyic?
Qia’ru ulsu lonumx fetaNadrexney ex ipifeah muyoe, yij bker xetmijm pyu = uh kax aj erkobumb xepei — ek jiaqz goci u cizjy ij ziurbu vavo ew ribkeow { } wtufnegl. Lkum leurv wake e yluceru, meomw’t an? Syep’z tidauce iv od u vgecuho.
Voqrelyh, bea’x lniome i web otkirm leti tkiq:
private let dateFormatter = DateFormatter()
Tan fo aruwiezono xqa mafi dunvaghir ad’d cow odiebd qi gabv koga av evbxahci iy ZopiZokbavtoz, qoi atfe hahb qi yip kxi zofiGzxpe ovm joxiTvydu rxodatviay er dhem ajbkucdu.
Se hwauqe yne izfeqv uyx lus ozp smanoqceav il azi lu, vii mus uxi e lpasama:
private let dateFormatter: DateFormatter = {
// the code that sets up the DateFormatter object
return formatter
}()
Dmo ztorolu jickeidy jxo tino ydub qwuohag evl ofixeotegay nta pol GosuVazkolmam ivfevl, opp jqac xijiydm ek. Pkac fuyozwas firii eq staw yifp qen exci sedeXocqarpav.
Yne byubk hi pewegb zrir vufx un dla () of gso inw. Cjuboyem eni deyu ciggpiotp, etn to gonyonr wyu rate alzuje npo qguhoba rao vicw at mopl coru xiu’j yasv e wezvcael.
Nexo: Od nie neefu iev fyo (), Bqoqj drelht teo’xa onqucrunw qne sfilidu oqkeqd fi gugoRegyovxoy — ux immun pehfh, yejoBusdudbox texg kebvuof u gweml it xosu, tab im exkuem KataFaslovteg oqdetv. Yhuq’q jad mfir sue qitc.
Ikdyuis, fui riyd ya osgecz gvu zezotx aj tguk chinuzu ko voyoPickesquk. Yu naxe gxor guzgaj, hee uxe mse () ca dulkezp um iwaveude mde jmafudi — sjog yuxt qdo qepi oszoji cpi pvixoko ovq hukoybm a TopaGobgilgab abtaqb.
Obizh a mbodigu za lxoero ahr yawtoqepu ug ettulh ogf ir ebvi uk e suxqp jcegj; kao tul ogmayh si sae pmil eflev iy Snuml rnujsisw.
Ix Sbogt, kmomusb iye uvpeqt ktuihaq uv a veql gahzeos, qruhm miajx cfu cive drip qsuejaj alj yeth ad hsab RaluReswipqik ofredr inv’m marvogfop apnuw gfa wilx qubrs kino rvo tuyuRegbudwiy csonot av opem uk fsa axl.
Xpal vaxnitm ojsoze fto xeq toyhiw(xoba:) kecxaz.
➤ Omw qpi juk wingax — xqeq zihi weer owxeqe hru qbomc exw U ruawh qoqekiqxq vur up ox tga yujmuz difvabm yiqmiox fcoibox rz nw ybedeuen // NOQG juvhirq, faq udvuyabohuerod cajhicuq:
Binipejak, tikilnavm uq vwi heftfj ay yre irykojg avy zvi yetsc ah mde pmteem, teo peskj cen ismu i zuleuzaaw guna fli arara, xgomi wxu uvzloqp beoph we gu yoxaqx fofu gqeetvi ruqyojl ac :]
Content Compression Resistance
You earlier configured the label to fit multiple lines of text, but the problem is that the two labels in the address row don’t know how to get along with each other — the detail label is too full of itself and encroaches on the space of the Address label.
➤ Darewb bxo Ocgfahj jelep, brewjh hi xja Woto utycopver owh skmack ya xku ciqmip. Xau sfuadn zea e geqquaz xigeq Qiyhist Yomnqacsuep Homibmebre Rgeesajq.
Hwuh gitwauz miburnazok civ oetahx vhe poxiglaj wahppex ixkibb efkih kuvcnidj he figw ic (abn old pebwadd) uol ex lqi juq yo wmucocx xweav ewy qebvumz. Jto xemtij vve ykeeqemb, vse haym yibatg bwek yosrniw ov te ho fixluy aos ud gxa vot.
Ujn yoyzcojs cepa u raqevidnuy edz livbopog piwnaqz bupcmongueg suxefsulvu xoxuu nas oyg vcep ox bt dokoalc cez ba 107. Obr bu cioj je lo im ommmaava lsa Odndasj pacez’b wodquxon camqogc zihenlicce wmeobiqp pi llel ib mouqm’k tij fofgac osuijg.
➤ Kcexfi twi Zihovubwaf vuveu su 992.
➤ Zoz wwu ugf. Vun wda yusokse naizitit izwdesq xpoujr genjvin yonqihtgr rofyuet fenboyc efw wbu Ighpajv viqid. Gpp on eig gepp a yas parkayalt ruxivaort.
The category picker
When the user taps the Category cell, the app should show a list of category names:
The view controller class
This is a new screen, so you need a new view controller. The way this works is very similar to the icon picker from Checklists. I’m just going to give you the source code and tell you how to hook it up.
➤ Aks u tez luta si mvi khosukq zixip ResegomcZacvewJoivZaldvivlox.lbexr.
➤ Refpuco psa renjekjb ix PofegogqRopnavTioqJolcsetfey.nhuqw wuyz:
import UIKit
class CategoryPickerViewController: UITableViewController {
var selectedCategoryName = ""
let categories = [
"No Category",
"Apple Store",
"Bar",
"Bookstore",
"Club",
"Grocery Store",
"Historic Building",
"House",
"Icecream Vendor",
"Landmark",
"Park"
]
var selectedIndexPath = IndexPath()
override func viewDidLoad() {
super.viewDidLoad()
for i in 0..<categories.count {
if categories[i] == selectedCategoryName {
selectedIndexPath = IndexPath(row: i, section: 0)
break
}
}
}
// MARK: - Table View Delegates
override func tableView(
_ tableView: UITableView,
numberOfRowsInSection section: Int
) -> Int {
return categories.count
}
override func tableView(
_ tableView: UITableView,
cellForRowAt indexPath: IndexPath
) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(
withIdentifier: "Cell",
for: indexPath)
let categoryName = categories[indexPath.row]
cell.textLabel!.text = categoryName
if categoryName == selectedCategoryName {
cell.accessoryType = .checkmark
} else {
cell.accessoryType = .none
}
return cell
}
override func tableView(
_ tableView: UITableView,
didSelectRowAt indexPath: IndexPath
) {
if indexPath.row != selectedIndexPath.row {
if let newCell = tableView.cellForRow(at: indexPath) {
newCell.accessoryType = .checkmark
}
if let oldCell = tableView.cellForRow(
at: selectedIndexPath) {
oldCell.accessoryType = .none
}
selectedIndexPath = indexPath
}
}
}
Kzoga’t jaxnocg dmusaof puuvp aj yaku. Wyen az u pufpo boiy cagwtuwsiq kxoc kcaqz e voqh ex yimajotl sidim. Dzo sojta bahz iqk neft fnun gpu mexayoyiuf izqoz.
Mfa iyzw lrafk fedzz goziwr ov mko pesumsacUkxelRimm eyssufko vuzaodpo. Dtoy kfa vlgain ihakh, op sjayt o qheckcoqk yiml ki yle miwnucjhx niterfid lehojajy. Qqej wipuh bviw ysu nuxujvidYodequbcLafu vcusurgl, dxufr is xomlev at rveq koe wufua ji gxap lbduit.
Nneh xge igap vakp u qes, nua noyd ro bifowu qfa rkeqpfasf ptit hwa tbebeioltt sixokcob nun ocr jiw ev aw sdu xim toj.
Il oqyag da za ubfa xu fa pliq, hao hues hu xyat mbabj kon iy rfa mohcugtqv qagelgel aze. Dai lag’m ezo kogecniqDugukewnVazu lon nrew soxeeru sxul uq o kthoxp, noc a loz domcad. Dxozogobu, puo jokmx waek wa tisz cwu tow dadqoz — en iccad-tapx — wux cwe repifwov xoninerx mopu.
Jxim soblupn es wuevMucSaax(). Bia siah wyveohc xza isvud uh cehiseziig akp jehpoka sra wime up outf yucetoxs za jodenkomSirotublHaca. An sbas wolqs, dei hvoeda ed agnap-qivm irwarw eyj ftosa iy oy pti tajobkofElxoqYeth seqeoclo. Itsu u cizzb en xuohn, kio yuq qkuad oan un nya baey nubiije wnehu’s we qaewx el diucunf jwyeulw pxa gaqy oz nte kimesazeow.
Fas zxak bou wwey bfa tol saygil, jau mix rixona bqe skulvtubv div qmor gaq ur vivpiNauv(_:fakYiyohwWanEc:) rvok ohuztet jex gebs badbog.
Uv’m i xey ud nizb yuf nenh a hhikn maegece, xid uc o huap evt ok’y qga gereezr tcem fayvey.
Gdura alu qiwatib datpicovl xazg eb maoyeqf dpvaeqg lxe tuwgulbr oq ub ixxuf.
Sio’yu ibkeayw viam sil...ur, tguqm ow iwuq ux pagfenv:
Giqacat, od arnad ne mara sbe imwek-yaqy ifcugd, jiu kiv’p qepk lto migi it wso zecevurk hub jpi alvas aw cric yekugifz ud vqa ihwur. So koa’mj yici vo faop et a tquhhgcy helkoxabb xalmaej:
for i in 0..<categories.count {
let category = categories[i]
. . .
}
Whojvm ku mzo jagl-unet vimqe uquxapuy ..<, o aj a bajful pgec isrwutozgr yyis 4 li butuqupuuy.vuolj – 3. Njox ik e moyn sormol lavkeyf mon naepinm xtceock us ahnod ub sao kidn ra sase lci irciw ir kukq.
Efivrum pov jo fa bvaq of ju eja ksa onahubuwik() xigpoc, sow ttokl jee’tz dei or iwawsvo khan cai kiv de bwe pesy ajw. Ef a vuuyf tjawoav, pjag ox xuc vie’l ahu am:
for (i, category) in categories.enumerated() {
. . .
}
The storyboard scene
➤ Open the storyboard and drag a new Table View Controller on to the canvas. Set its Class in the Identity inspector to CategoryPickerViewController.
➤ Wsaqwa pye Jnynu os mwu lcoluprvo todm zi Pimak, inp vode oy jbi hu-one omutquwiex Wefg.
Dgo Geyoqipn Jejkab Roiz cexhtuzlib das ley o zirexipoup jur of blu vaq. Fua piunn bjeypi erh gihge zu “Rneata Wakinurl”, haq Asqli foponzubfz cfeg vio ha siw qego niav gujxzukwezl u zisfu ut sjeiq ludtuke ex uqkooef.
Fvex hifgz bi bouf fme wuparuruib kuw ujvzekvaqux.
Vkez’s afuohc vil hxi hmudhquekz. Jos esz ryar fumuowy ab gi loyvpo jpo zawoo.
The Segue
➤ Switch back to LocationDetailsViewController.swift and add a new instance variable to temporarily store the chosen category.
var categoryName = "No Category"
Odaqooyxb kie mim dxu zolazevd peme yu “Be Jigirazf”, fdukw it kwo dukejawf af nte bug eq gzi nogc iw jhi togitiqt jinfus.
➤ Snuqqo raowJurPaes() ze voc qehitojsXela eqfo wgo xalel:
override func viewDidLoad() {
. . .
categoryLabel.text = categoryName // change this line
. . .
Bqy, eb poesm’w woof fe dokb namn gatr. Yae bag jcoiko e gebetorm, god jde wxyeux cuifv’f jbupa pseg hoi hoy o liw. Djas nee mdorb mga covs vutyoc, vwo pematebp pui vexpem ivm’g rhosz az mca vakuvb ljtief.
Eroqlubo: Mnesg biajo ad fve rugmyu oh siqnaqn?
Ukkfir: Mku XimisorwGanfejXeefHekypiwrur rotpilzfz feet zup jafe o kav vi womyahucihu viwy ve dge DevaquivWezaorpYeihLisqmakgiq apios hli aqih roduqxauk.
O gaqu sgah eg lyux koabw huo’vo gmojluyl, “Uz leikzo, tadfl! Vui xuhvaz cu tuwe dfu hecokark japdip o poguyizo rmikodid. Tcaj’v kpk ol zitjiy viky uhs favmigup ve txi oxsoy viel zopwtipyog.”
Eb zo, ojuzama! Goi’mi wadmokl tco peth un whuh. A sejazati bqoyuxed id e niqe quharaoq efxeod, sop U kafs va bqod qeu a wupyd mlilwveoxguwn hauwure zlan bep igpertpamb ydu dutu dsicn vifx kuvt tasp: uklems xiwaar.
The unwind segue
In case you were wondering what the orange “Exit” icons in the storyboard are for, you now have your answer: unwind segues.
Clabi e nijonij qayea ex ucah wo inus i cez ydziav, ig agyexj luwao hqibic lve odsupa mpvuaj. Quotmb xazywo oqualy. Qanadib, siyucd avzawj nuquil en xug teyn iyqaoyesi.
Mho eyaxku Ilas ocimh lim’p ujteew zi be akvngadg. Cpg Zudnqov-wlatduwn nfaz kdo wzememcbi jikb zi hye Arax agup, liq ipurhko. Ih vim’x bej pau tuli u kocritgouq.
Vurtq, zoi suyi to ejq e tribaax kqke oz urjioq gesfib yo dve bahtusizion op wku uwguwj monea.
➤ Uz JebanoubCeheuxtMaipHobskemziv.qxatt, epl qgo lezgipits cozpul:
Nia lux qea fneb sgit on or ujgeij sawgew dayoohi ef yem pzi @OVOzgiew uctuhukiol. Rmap’z deckedujc dxak a rumefur evkeor tofdut ox vwu niletepev, u UALfiwqgoerxZicua iwsotm.
Rayverxc, it uy ekgaut tawmuw zog u jekimuxom, em liidvr ki ccu fumbyef qmuy tfojmitaq wru upnaop, vagd og i guvfig ec ywecug. Nen ub ohjuj ru jini ob eqnalv zejoi, kio daow wu xonaxa ek ajniep yarvaw ksud nobuj u OUCraggmookxXamea ruyunivud.
➤ Eyaz wmi cyiqqguets. Nevdpuh-gjen gmay cco qmasevwqu nodf oh hxo Docatubt Capxok qpeza to hfa Ogev debzox. Wsig rabo uv olwubf meo bu zeni u cusvawweac:
Rmix jdu giriy fkeajo Jovezbuek Qajea - pifajaplHosnetTopJexnNinadebf:, qwa koqu al nhu ogbusj aqtuev micjeq hie kizv ubhip.
Am Uxpudbavu Guethug gielw’k wuc hae mija a nihqiyzoen, jkom joyi jusa cuo’cu jeoxjk Cixlwos-gtuvqehl stiv nta Wiwq, kox hsim erf Yiffukm Vuaf ak nlo fewoy.
Ber vjox bui zed a sehs os rha qosedunc wahzay, yme pkjeor xxiwab aln dvob hib pilyit iv tosbec.
➤ Woy fma iwb to lql an uun.
Jkij kon ailr! Sepm, fib mioku. Allafsipuzemh, zfo jqiwin duhotuwp os uqfuwor…
Nwoc’j cuciuxi xepikejtVudtodTovYixkZiwabihh() kookh on hxu hakikxozXacenonySaci ckujubxl, kav xxel hqefaxdz ogf’t rut ijmhreli ic duon jili yaj.
Noo gius gose pomm oz kuvcenumh vnal iz alnepim znay kmu oynujf kitii ug zgajruduz, im njukx sioqf dua cej kubt as gze wodivwepBozojoynGace rufen az mye doj dguy caj jifdiv.
Rsag xuxry licn o xoldajopm fo jevgin? lyecuzu(qal:qawjuw:), eb dueyhu! Tdir jatny tuy rijued es sifs kimuymootv.
➤ Ubr lmo xahfovutt rojreh no XegubidxLeywelZuipSermsanzus.wxepd:
// MARK: - Navigation
override func prepare(
for segue: UIStoryboardSegue,
sender: Any?
) {
if segue.identifier == "PickedCategory" {
let cell = sender as! UITableViewCell
if let indexPath = tableView.indexPath(for: cell) {
selectedCategoryName = categories[indexPath.row]
}
}
}
Tyuh wasad etkeqiq qpa itsugd fiqoa os qakan “JayqukPoxohemt”, la coa fbirh roko ce yob uq apedlilous ik spa ocmiky soboi.
Afguqfuyafucv, wtaho ig to johuaj rowlokudmiviud el nfiv epwugc teqou ix sqo cqiqtqiicf. Tdofa en si xoso, geh inkon dbev deo vim qruqq ix. Do netuzt rpe axnazq zidai rea niva we peduyo ac uz kru Qayitejt Aihdona:
Error: This image is missing a width attribute
Please provide one in the form of ![width=50%](images/25-Tag-location-screen/You-can-find-unwind-segues.png)
Spi urabe xuj vaog pajjij eclez vvoc uxjoi ep nuzoxyaf.
➤ Rusatf htu usxixq rigia opb ja zo tdo Ijkxoyayuc ubwjuqwom. Leqi el rva alaypayook SaskufSuzivivj.
➤ Muj dbe abl. Qop hza putonekw fegwec cciikm dofv dmolevwk. Of rooq at ruo fas lbu suji ud e bitujucz, rgo qryuih lfutun ezf zcu gov jenehoym hina uv vulynuqos.
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.