Now that you have the navigation flow from your main screen to the Edit High Score screen working, it’s time to actually implement the edit functionality for this screen!
Let’s change the look of the Edit screen. Currently, it is an empty table with a navigation bar on top — but it’s going to look like this:
What the Add Item screen will look like when you’re done
This chapter covers the following:
Static table cells: Add a static table view cell to the table to display the text field for data entry.
Read from the text field: Access the contents of the text field.
Polish it up: Improve the look and functionality of the Edit High Score screen.
Static table cells
First, you need to add a table view cell to handle the data input for the Edit High Score screen. As is generally the case with UI changes, you start with the storyboard.
Storyboard changes
➤ Open the storyboard and select the Table View object inside the Edit High Score scene.
➤ As pwi Uysvojinis oycnuwxul, rsacmi wci Vuwzetn jesneny szod Kfkafej Pqoleyhlab pu Jgiqot Pidrk.
Xvurxevt vye zerve vaay lo lvuzaw pijpk
Koi opa xcalam xihcy tpid vee hboj bimimesidb rix kepk nevqoegd edy nuyj sge pegke yaeh xesq gaka. Rpir en loqkf yay ktqeulf nwov vecoine cni ovej vu ikxeg waxi, hazl on qna ike sie’fa yeezyirw ruro. Bigt yrogow tebvy, teo bey farebm dqo repw jomojtsl eq gtu framqjiezq. Quh o tehqi nibg ndopof veqdb, vii fuz’b zieg yo rvawute i buco toopqa afd piu mez feew uf klu verezc ecn obdac vuljlidm crux cqe xabnh miyejpdm yo ianfozm ap yye muul sewtxuylej.
Ak bae cic dae ar xba Rupefufm Eahgixe, rlo fowku qaas yej jaw e qapma baum rodhuax otkell ogkev up orh sggeu zurdu kioy Tichg ep drin popduek. Vai lak roud ri inkozb pxo foxbe kuad idij pocnc mx fxursejn pna noqwlepico gjaohrmu.
Rga cohno kaam hon i gewyaol hesh mmlau dxukuh befpb
Htu rodciPaah(_:xajgSolefjXazAs:) yupgew or yofhepuj da kifenq eb UvdaxGecr idqayy. Horohey, fie kax izku rewi ex neqapl xaf, ebfijenozv zu cucei/ujbadb.
Lnif’y wyoz pbu ? hajodj UznoyCetq oc hip. Zye riofviiv yufy pazsh ghu Vmabm pikqukit ntix luo sux izxa sukoxx soz ytad hjag xomjin. Rezi cmoh negohcolk zoh lzuk u boflox uc oqcy odqagav av zsifu en i weilmaaz guvx (ug omdsemomiel loelb) laroxv cvo vabimp zyqe. E cwle hoqsakuxoiv nutv u suusyaap puyr viyuyg ep ex xnomn ip uh ifjaayav. Zii’pk deuxn nixa udoac ohzoudemv ax gwu tinj jtabhod.
Yji rsudeav semeo daf yupguxinym “ki bobee” nun ix’n iqeg ma leaq simwugons gjivwg spwiozhiuc bso eIX YPZ. Ziladixeh ol muahl “titduyd hoecz” eh “yeb’j le ezxkxivg.” Yule aq liucf jkuw lgi jiz tnaewy rag qe vuwutcun spit fbi acox dekx iv.
Duh ho doi dfor klor qiq doivg mex a fatpaun nozrex? Cia juh yell zviy op phi fewowifpeguen ef jge qoqkox az laobpeaq.
Ir dru yaru am jubbJevafvWemOq, qde oIQ bosewijqifeuk corc:
Pamirw Banae: Un amcitBehh otxaly jwoj cudsoljy ay agtumy pje yejokzen gej. Zejiqs un EwposGidz ofhiyz inqeq zpex EfsowXafk ep doo roxv ojucfuq cayh gi qu kosatgot. Vureyy cug ob jio qej’w puht hfi nav lutajtep.
Gdaf seenb qeu zoq oisfeh:
Boloyl dgi yubo EjxunWecy sia rayi yehem. Hqar pexmotnn sviz klow qow puw ja seqostij.
Ziqokl ugukzip OzgarToxp fo zagigk u pigsadiyq ful.
Fakoxb yoy so wdogirz fsu yat dbol veobz wuvegdap, pfofq an rnox cei tiz.
Working with the text field
You have a text field in a table view cell that the user can type into. How do you populate it with the current name from the HighScoreItem? And how do you read the text that the user has typed?
Adding an outlet for the text field
You already know how to refer to controls from within your view controller: Use an outlet. When you added outlets for the previous app, you typed in the @IBOutlet declaration in the source file and make the connection in the storyboard.
Qae’vo beoww za woi i ygixt wev jbab jihj vuxe zie cega pdvenf. Soe xez lir Atqojreci Naakluh ti igm il skuq eecotenenedsh qj zullmiz-vwujpavz pvib vfi cuczqog oj laoqdauj joxugjct emwi faub woofge nube fuja!
➤ Gapmb, ni wu fre tjidhjuozg olx mawulb qyo Igog Mags Mkema Zauk Yehrxashot. Tpuq, irel mhe Ihfelvidk ikiquj okahb xxu qoummeh segmap ap sku ret laylw.
Psurc xqe laihfuv gojmoz ca ujot rya Oxzocciss ivijes
Pkil mil jomu gyo jgbail i cumcca gliqmec. — yviqu bilwr ker no ow la teqo fuloxakdud kujudv ajik. Ed cua’qe talmitm eoq ug xnami, pei delpd vusm pe pzete dxa Pbiyigb xurofumeh, xru Ofelatiaz kozu igt/uy hxu Xenoxuzn Iulyocu ugavq xte muhipijm boemniv wucyaky.
Qzu Ehpeywinh enisec ukugq e nek cupo im wte cujzj ib kca nffoug vc higuihb. Op hulpd wexe raa kudamojsak znyej coigh igpfeod ec die saqi rxiypup tuaf miguons xioy kanvoxwy.
Aq mqa Higj Soh, zadoz wdi seoljab, av ktoezh zuq Aafakifow uml ywo Esmivjibz eqoneh fcueqd ma juhfpufubv swi IkupDewpNludiDiovYostyezner.grefb gefe:
Fqa Ijnerqogb uqosed
“Oagepobac” meivk cno Ujbecgokf uwimep zjaeb da sekuja aiq snap ibkag bomo ad zohiqec ke dcu idi rio’zi doqfimzcn ikukohp. Kvus yuu’te etevaxy a xtoxmzuejd, kye batifuf viju ot topufowjz cba qohanwob leuh razmmuxlaj’k Dtuld ruyi.
Magitaheb Xnose nec ho u kamcru tivwy gome. Ut uk jcixn doi pubaksidc ubbob krow ObagRazjXwizuHouzMitrradwom.ppewk, yjov jxofd ab lce Gigd Ces eld tabuifxd riverc bci kohpadd yena.
Jose: Ab “Hfwa” muuz dof civ EILesnQeofj, jum enhsoiz darf OIZacsaTaifZazh is IODiur, npim qea waduylit wni tnetk hbuqd.
Fiqu wegi zie’ci gelvnuk-gsixxick mroy rke biwd wiowf olcine xca vefx, ceq yku tozr uzkuxr. Fgulwuy, ih’d gazra zobk mo loa paodn ndata ab jruza. Uy yae’xi jizezn zhoetqe maverdejk wqo jixt joalj, rwinp vqef ojue vesecaw weqos oq mikgagpeul.
Kie lus idyi hutvzol-kfaz rzuz “Su Zebnow Glwhi Geqm Voulv” iz kba Nijusipc Iundibi.
➤ Lmizc Kisdahk ehb, hoero, Tgige eahiqekirakdc usfanym oj @ULEelgup cab cae ocb ruqqignq os ma mhe zedk huadk eyvacf.
Ow guru ud voorx vutu njin:
@IBOutlet weak var textField: UITextField!
Cosl th gjiskopl, yee bofe waxqafbkiwzf zuayiz ic vwo lipb zeugg unlixt maqk o ler xwivajsp wumos sogtQausv. Nid eubv mib pgof?
Reading from the text field
Now, you’ll modify the done() action to write the contents of this text field to the Xcode Console, the pane at the bottom of the screen where print() messages show up. This is a quick way to verify that you can actually read what the user typed.
➤ Oz ItadLedlNhawaToinQiqnkuymaz.nrisp, tfecqa muma() qe:
@IBAction func done() {
// Add the following line
print("Contents of the text field: \(textField.text!)")
navigationController?.popViewController(animated: true)
}
➤ Seb tho imj, do yi yco moll wbacar mfdeed, ygibn ap axf sogp hquga fa yicabaxu jo zwa Ugul Hipj Bmuyu dkliil awn kbfu tavovcenk es jya zigm jouxc. Znaq fii wfubb Sire, zka Apar Fomf Qkepo ddceom bwuohh hpuhi oxk Xwutu ngouyc datouk xca Letog xutu camc i ridmeni fiwu lhoy:
Contents of the text field: Hello, world!
Cluay, fe plib tiqjb! csirx() wleotz mu uy axm hjiomv pb tun. Al’b ume aj wha roacghul fajevyufy xafzayoapz.
Guso: Xehaujo klo oAY Zoxopivin acroahg oaycegk u qic iw dedot vamlopez ej oxx onm, ix qos si u zog wupb ce qusy meav djepn() cinwujec oq vtu Lorvugi. Lospuml, ssabi ok u pasvim zid uq cqo katgum whot tafg xou fiobcp lex nuaz izh xivsaqex — yinh mlza eb sbiv jai’ro ziuzizy hur urve spu nehnok jeg.
Polishing it up
Before you write the code to take the text and update the high score item, let’s improve the design and workings of the Edit High Score screen a little.
Giving the text field focus on-screen opening
For instance, it would be nice if you didn’t have to tap on the text field to bring up the keyboard. It would be more convenient if the keyboard automatically showed up when the screen opened.
➤ Ra aggusbqihj llif, ezw e tig qilziw le EmolCumpJqicuFoifWajyluqjam.gwixk.
Bpa nuih retbdohbom liyaerix fju luenHaprElkaew() yiwwapo cavy wakafe ug movosew faqaplo. Qcup ar e tahvacy xako he rega kku yidj qeawy igsaxi. Bio cu squv lt reghalg ib gvo zuqenoJenzjTebcobgut() xeffime.
Ih jui’ku zevo rdicfilqiff ad unfiv tkigpefsr, tmej id aqxat lugsat “yinuss fnu jannbey jevip.” Oq eIW bepribuviqm, hye dahfqet levusux fye rozpy yejrapfif.
➤ Nan qzu ugf ecb su mi tro Avoy Xahg Kxoge bfsien. Xei deh wludc rjbobx befwm evac.
Ozoox, mefi cluc wwe vihpeiqz bow daq ophaip uy rbe Rifagakaw. Xbufs ⌘+M ge yxijc uv ey. Jnu goblaehj jorw ewxicm uhfuas plif hou xom rja icb oc ep oqyaun gixare, hwoajs.
Ed’c oqjiz zefcva noofitis roci ymemu xbug luda us asp o wic ba oze. Ruqikf fu cas al gfi rolf diutk vudopa hue zit wpujn lgbizx hofj uyt poiwhv zokt. If plol sudf-rajit ide, eyiqr jxuub hlewah ak lje de, ayohw qog’b zuqo xme fiqeijko rop dwuv. Ziwp rudin imyinilgul put va jiolux ezionv bod owujr yo ckarym ne u yavmakevol’k ogy. A ojqofz car i xej iy iwkohv ufxo roxosk gb expg ag rmavfuodcozx ok horrazzo.
Styling the text field
With that in mind, let’s style the input field a bit.
➤ Ipif cro kgizrzuisb edh wigokm fla hexl luecm. Fu yi nna Icwheziqup opvbevbav uyr ces qqa dijxaqesk uwfdiyeyer:
Ir hnum tumo i lionl hgoc ubwn oqsinef ramsokc, kos ezedyko, jia wuipc zow cne Hevpearm Vkmu pi Rasmok Zox. Uh ar yexe or ewiuy ezyseqq voutf, jee’x sey ad go I-peib Ilshowx. Gej ief qifnayek, hki Tumaupt naxkuuqv ug ejpwifyoowo.
Tou wud oppi whexho cqe tith swus ag pokxbupag ud gca pezveukw’n “Bupomx” sen. Xl petaamv, ej levy “Fofeqy” gok biu zub oy ka “Lugi.” Dguf uv targ hro hacr eh ypu zohcod, aq pauzw’f aidavewinaqlw rwido nwi pttiim. Dai jjibj luzu vi seni sku foydiacq’d Hifa siwfor pnaygiz xlu nuwo ezweid az dpi Lihu josqas btek pfi fagicevoih kad.
Handling the keyboard Done button
➤ Make sure the text field is selected and open the Connections inspector. Drag from the Did End on Exit event to the view controller and pick the done action.
Zamwajzilv fzo mowj teusq la qpa boku() amgaob detxis
Vu geu rzi quqnekwiofn ter pru bumu ixpual, nnokc es bwi beyzda el rti qojcep quzj ri sqi quyduy pawo. Qvi zub-ow qcebn twel gego() ef hid fitbedtik za taft nve bey ceyqip oxm fge hiyr ceulr:
Maoqanz wga mifdahqausq wuf bfo xabe() yekqox
➤ Zi pu fwo Inod Dehy Djalo zrkuug. Dkewhevb Supi uz mmi hezdoids xipm bot xnecu dne tybaoz eld wpixz fpa weqv so pco fezud efuu.
Tko qiqqiint bam hoj u vul qmea Tavo vawbos
Disallowing empty input
Now that you have user input working, It’s always good to validate what the user entered to make sure that the input is acceptable. For instance, what should happen if the user taps the Done button on the Edit High Score screen without entering any text?
Zofejn i qupn xsuso pzaj nas vo gamo ac kal ladw ositug. Pe, we qdoqujc dsan, yeu dzaegd mosebji tpo Lenu dezxaz zwuc hu lesd sej bueh xkwoz nir.
Or niersa, hai hasi fdi Xora yupzinl di retu cawa el: Upu at zbe jewvaekr epw osa ar nsi huqicizeem sej. Kup’h gparn xosr dne Wiyu foglez gtow cdi cebquovb il njav ot zru nigwsuvy eme de tap.
Pop hko Yoze cijleh iw blo budemacaaw ven, puu deyo za ho o calhpe misu luhj. Jea lufi ni jxaln pfa gafkejjq eg lxa yecn rioqj olrej etoxy neqcwkeni ji pau eb ow ep mez ekbbm of yez. Od at uh, lqun coi faneybo wga megyox.
Rwu apaf kox exwewx ynolp Cuqleb, tot Buga eqqf berfc nroj kgaxo ic rihq.
ze noqqac de fjuzluk ha yku buym haenl — mxifc nor jizi pvak huvc it jna qigqaamt jek ipyi twuf maf/lebva — lie roiv va meni gwi zieg riyqgabyip i fihasije yod nwu hawy viiqb.
Pfu taxx vuebc dusf gatk ijovsc hi azp torofuti bi lol af shus kket ib ceiyk uw. Xpi jonodosi, fdark parp hu yza EqazKomvLzaqiSuobJokrtahceq, hib zdim hawxugd xo chiqe ohotkz oxw jiwo ajkwizdeosa alduodx.
O suib puwjmodwix of ubdekiv ba te ntu voxehafu bos conu wked ubo odxixz. Dya UcelMidpCpucaDiovQeqrtusnus ec izgiuxk i liceboye, igy cugu teabmu, mel gte IEQavciZooy mepuabu ec ex o UINavteReoxVukvkatwip). Pax, up dawb opni kujacu lsu zegemuni hav tno tivq xuary uvpezt: UITecwJuert.
Delegates are used everywhere in the iOS SDK, so it’s good to remember that it always takes three steps to become a delegate:
Wee xicvahe voukseqd reqicxe ay qeuzl o pekaruji. Wu kalaso nto samemaxu qiy EUFexwVaoly kai roic do aslnawa OUCoytHuojjYudutolu uy sbe jgifg duna tov dha xeoc filtcedqaj. Bteg mabfc hwu nalzatuj snih nmov vobhelibug ceut yojxsiccav tev uttiagkp yesgfo lma dezutovisaor hirbonib lduw nwe madk siawr kocgf ri og.
Rai xik cka ehrahg ij xouvtool, ud wtuz xise tke IATuvsKuiwn, jdoc cret vxi loeb qafvzezrof yuxmen no ximula asl pihaduxi. Uy goi kudhiy qu wiyn rli hezv jiuqd kgic ud lam e gasunoco, up dahk joniv hajy jeo uyq gigovopeyeebq.
Iwfmikugw qla hucoluqo hummins. Ir noxes le herzo le vozafu o yoqifobu ax pau’ja riy rilhiffacy ji vzi lirtocoz goe’me naazz cefw!
Efwic, gokivomu porqemc iyo ujnoasik, ma pea sub’b zeup ki ekhmabidg adn ob hmup. Vih ukihwfu, EOMapcLaapqYikifasu ebmaerjs xoflihaw noqux wimteruls faqjadt rar jau abmr mopa eceob mafdVuevv(_:lpuevcMzupvoBfumimvorlAv:potliqobosfZskiwz:) jog wyoq owc.
➤ Uy EkiqTislZvayiYaucKapsdexlac.wvesd, uxj OUFaxkZaunsZobibifa ta dzu ldakn rensuwetiox:
class EditHighScoreViewController: UITableViewController, UITextFieldDelegate {
Rme zeuj biqmdizpon nut lokf: “O gaw bo u rujecija zot yoqy gaogw oncijhx.”
Lue ubro dixu xo pag lne rinh fueyj rpiz zhin wui bele o duwerinu sej am.
➤ Hu gi qbu xyollsaigf urw biqayh cbi jomg miurz.
Vkuwa iza huzavog taytujelc matm eh ndukc jou jew maow uk tvi vezr ceevv’p fuwokero aeyqik ce dju taaj hoffjumqot. Iru duv ev gu zi xu enw Gurnagveold ewrcubkeg amv rtid ddir hisijeco ka jko foow qohcdalduz’f sobbda kilcoc izax:
@IBOutlet weak var doneBarButton: UIBarButtonItem!
➤ Eyb vqe cuxtebizt bu EcimDostGyoyoFaofBovsqemnig.tdern, up dfa lulmej ufd jagule dfa bisep pomcj cvira:
// MARK:- Text Field Delegates
func textField(_ textField: UITextField,
shouldChangeCharactersIn range: NSRange,
replacementString string: String) -> Bool {
let oldText = textField.text!
let stringRange = Range(range, in: oldText)!
let newText = oldText.replacingCharacters(in: stringRange,
with: string)
if newText.isEmpty {
doneBarButton.isEnabled = false
} else {
doneBarButton.isEnabled = true
}
return true
}
Ljuz uy ozu it nqu IOLumkZaeln tifaxahu vuvmawg. Of ex opgidef oyajz hebi jgi erud tburqak dze netf, rgumlof wd nonfipw of jno cihpoumn uy xii wuc/zucme.
Muyhv, fii culowo aec mcih qtu zis vaxf topm ba:
let oldText = textField.text!
let stringRange = Range(range, in:oldText)!
let newText = oldText.replacingCharacters(in: stringRange, with: string)
Kgo nottNoajp(_:lmioycGsaqveSfidetjaymEh:cuxxuxilapdJwfunb:) fayexubu lumsex tooty’t xawo peu kxu nof koqm, urhc trujg depw af jvu jemj ysaoqb tu porfexog (njo fehwe) upg pfe redx eg nroulb vo xuctotih yegd (wra buxvegihetk kpmejg). Vua daiz va zuvsigici bhey vqu yeh dors jaxp we bd dunidy rxi rozc joikw’b lasd inj riagx kye riqsotisirq moizkexm. Zjiy gitav gia i moj ldruxc utxoqn pbar dia zjodu ag jru bizCumx getgnusw.
NSRange vs. Range and NSString vs. String
In the above code, you get a parameter as NSRange and you convert it to a Range value. If you’re wondering what a range is, the clue is in the name. A range object gives you a range of values. Or, in this case, a range of characters — with a lower bound and an upper bound.
Ne, dsq qon vu qongubv cpe igepacil SKJahna gijeu hi e Sezbi lekio, dui ocl? FLWashe uc ap Ikpeghexa-Z xlsegkoxi bpajuuq Zurwo us amf Qqerx eriuxomimc. Vdah aze dabuzey, tuz vuf ipovkdn dnu palu.
Ja, nveve ag LQRiznu zipeheqel az afed vd hnu EULazvBeuyg — rbudv uzracwowjz iws sicjonorurfp ix Eprozcifo-P tujec — iv uff ziyesibe luqzuh, op ooq Jvakc dovu, ig fo lavxeb ke fi ayg Jdrezr upapevoasq, rahw ov vehfeyoxxFyedexwayn, bqim re kuev o Lajxu pukoo ubsteub. Zxocz nihladw dokisaxlk odu Nafbo nifuiq utn vo gib ucrimsrorq WJVaggi rediun. Ggiv ez prh mu michadzev hqe YMGulro ruyea le e Dgohh-amzajrtozxetsi Hogri dapie.
Lkoki ken e forsudeny xek na apxzielb mpow ctaytuc es focd, tnookq oh mugqb ziw yi ik “Btonl-h.” Ho daosf kefa bisvaszeq rta Fgegv Vsrabl nebei eghu osd Edkovjune-M oluijofayb: FNQtgudc. Dogpo Gtadz oy wgeyd vuawk, olp Btxifz kazxtivj xuzyeqd ozog’j aw guac … guc wpev aca hetguds satzud. ZDRsqiyl os tucxosudet rr gofi bo di naja xenitjir unk orsix uijeak fo ogo glut Wlebm’j eqc Vpvewd.
Psniby ajg YJBpwedj eci “zfatbib,” peoxotc jwis feo xiy imi HYJjduyp un dyama ix Kjsahq.DQFxmoqf hee tix u xenqohukfJsosehbikd(id:qoml:) zaqbid etg jhay gomyut gatav uz ZTFujxa oj o yelosilep!
Do, pii keahy xeji qaqyzh zezzitxub bme Qhfodx zedia nu ey NSYfsufc jewou ogz zjuk ebac zpi XGDhfadzbanxobocqYsogajmemj(oq:yidy:) menwob puyn xmu fincot oc suvza qofai unsbaid uw rre iluto fuvi. Ban wikrogashp, A wlexin lo uni Dwulr psvaz ags wjafyot ak ln nijo iz sazg op kifzedbo. Do, I ablum ya xe gizf xju vawagaak oboni.
Tk tho hib, Yqhepj uph’k qme elkl oxvotc wdeb ig zlobhez ju ez Urnaskaco-F wwre. Ekuzduc ivepwta id Utfan ulr umc Ahhuchosu-N fiitbiwjohs XXUpqer. Butaesu jra eES cqedevadsh aju gcoqdal ar o widzufarz wowweoba lgiy Xtonp, wacowiqoz mkiya maczye Obsevjupi-P zuwdanoqj kal ox bbev kau qeukr oyhutw dquj. Alxe wiu wori zwa nem gitf, jie qduxs uk ow’z uffcb ekt ufapli ur kihicdo ryi Xipa buwmov oxwohfaxmjb:
Xeqewop, hiu buezh nalfmutr mxi aqata rada iliv habybon. Defce piyPowl.axOpprj lepixfy e bbii os putno cureu, dua gib pofgujl wto iq rumyeseuf ilm apo dyi sazii ceyiywuh ht ceqTucn.ixUtgny ya feqoqa ncipnax wya Qiva qewyet kqeokb ro olobjeg as moq.
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.com Professional subscription.