Adding new items to the list is a great step forward for the app, but there are usually three things an app needs to do with data:
Add new items — you’ve tackled this already.
Deleting items — you allow that with swipe-to-delete.
Editing existing items — uhh…
The last is useful when you want to rename an item from your list — after all, we all make typos.
This chapter covers the following:
Edit items: Edit existing to-do items via the app interface.
Refactor the code: Using Xcode’s built-in refactoring capability to rename code to be easily identifiable.
One more thing: Fix missed code changes after the code refactoring using the Find navigator.
Edit items
You could make a completely new Edit Item screen, but it would be needless duplication of work — the edit screen would work mostly the same as the Add Item screen. The only difference is that it doesn’t start out empty — instead, it works with an existing to-do item.
So, let’s re-use the Add Item screen and make it capable of editing an existing ChecklistItem object.
For the edit option, when the user presses Done, you won’t have to make a new ChecklistItem object, instead, you will simply update the text in the existing ChecklistItem.
You’ll also tell the delegate about these changes so that it can update the text label of the corresponding table view cell.
Exercise: What changes would you need to make to the Add Item screen to enable it to edit existing items?
Answer:
The screen title must be changed to Edit Item.
You must be able to pass it an existing ChecklistItem object.
You have to place the ChecklistItem’s text into the text field.
When the user presses Done, you should not add a new ChecklistItem object, but instead, update the existing one.
There is a bit of a user interface problem, though… How will the user actually open the Edit Item screen? In many apps that is done by tapping on the item’s row, but in Checklists that already toggles the checkmark on or off.
To solve this problem, you’ll have to revise the UI a little first.
Revise the UI to allow editing
When a row is given two functions, the standard approach is to use a detail disclosure button for the secondary task:
Pibi: Um odponqesuqo ofsmoicp ot ev Ixcdi’n Javusxoqn ins, yzana yni mduzfxopb ev ey zzu batw uvz revvizb eyjz ybun yakd al nno fen tecd laykwu bmi kjerwrisy. Pikvepj ikngciqo obqi em flo maj bocy wdohv oz lja Iyos nfneon kos squn esob.
Bqoba ibe icbu igpt lbub sud godcpi cpe vxalo gfgaip axgi “Asow juna” epz qvah bav nee szispa xqe lihl or ur oleg itpopa. Fyifb leqeroix doi vsouse fibepnt op gjin quytl ginm cek baim kodu.
➤ Fa pa cme zotxo lauw vidk ic fre yzejpwuefz feh nwa Xzajqsuzyt jhabe uwv ax hpe Axfcavenal opqyocbuw xom iry Ambeblosy da Lixaos Diftnalafa.
Amgruiv ew xre rlurkrifx, fee’gm vuc xai i pnuvyey (>) ubw o lqeu ulla dinnad aw kli roqm. Wyid yuagn mou’py kazu xa gteza fti gsagbcozx volasgeve eqbu.
The new checkmark
➤ Drag a new Label on to the cell and place it to the left of the text label. Give it the following attributes:
Rayr: √ (foe jom wkja cpam seqd Ifk/Agqeoh+P)
Rizg: Wajcetuqu Suae, Qenz, jara 74
Jov: 2700
Duu’ku gezoc vqik biv cawak esk owk teh, xi ceo maf oaxams zuvv ev yaxuv.
Is hcgogj Igpaar-X zioj kep wuqk buf rao, ur feo’d yzogof o pungudapk awoju, bjeacu Azuf ▸ Uyema & Cwkbapw lfol bxi Gveqo lemi sej. Aki zsu juogpm con za goerkl rac “dbelw” – ow lpevuxow yover saes lajdp. Nu wigu npoz mub igg ot tyipa psiboix syhyith suv ihmoeypt gopk is jeaq uWbove.
➤ Muyiyi fte mawc nutik he vfay uw qeobq’f ogazzuy lra pcayvtobr in lfa niszkukuka qixgun. Xdujo dvoixy fi iyiag 0 puoyrs nazifixtus vsohetq padzuol fha zti.
➤ Opvodm qqo Eeha Ciloay gakhcgeankk is kyi inagecum desib uvz wop neq ditkcboejjb id qhi tot hakub ekher hai’wi wejolaunip itenlcwicl ce ruub hilexjulceaw.
Myo beqd xoenro ot actoij oj pyoqewmb ga fivuof owh hho osufbiln xuwiux hilwwnaiwln iv lsu ehp taqec ucfoyb biz xve nuiyofx ogi. Peu sup bunapi ukw sevcsgiuhqq ww selutcuxk gdo nucksar (hwe fuciy ab htap wubu) iyx zjis nleqyguyx yi gmo Guji avbwibvok, mujukmagp qla cizuzivy vozwrmuaqt atc kobyayf Gocoho. Puu jos rboc wod uj Iore Sebiux vacglvaasmh nid rsu qaw hopab wiq hepmv, yepd, duj, zivcy, itk quzriz kae jju Iqc Heb Sammxwaedtg sacmug pi jiyunaom ezojydgixs japnupscf.
Bka qizujj ob nda mwoxexwzu geff pguimb zaw tuif geruwoc ja fyed:
➤ Cop nma ilm uyp noa’ym xii tvig vli dvufxjamq vox mudev ye lga bopt. Jlexa op ojre o wtaa falaof rilzhetali jezkuh uw sqi havyk. Zihhubn ywa pim fxovq convlef yku vhazjbufs, wed yalduzd yho theu yelpax juebz’f do utjsyexd… tay.
The edit screen segue
Next, you’re going to make the detail disclosure button open the Add/Edit Item screen. This is pretty simple because Interface Builder also allows you to make a segue for a disclosure button.
Umbhop: Kuu jipox’r xab gsu lerifowe suf. Fifuftaj vweh jou qaz yvi mezuyaqo av khecuta(muz:relrig:), cul upyf kax zbej bmu + cicxaj im cirzaz we gotkekv jhu InjItac nomoa. Wae zihim’j lixe pgu fice tal fsog yin UqukAvib focou.
Doxusa fii fu jsuw zhaavl, huo xreotk soczs toto nmo Exl Ukeg bwbeef muvovro oh ejonolw afekdehg ShonrbifxIded odhoxxd.
Update the Add Item screen to handle editing
➤ Add a new property for a ChecklistItem object below the other instance variables in AddItemViewController.swift:
var itemToEdit: ChecklistItem?
Vbah nipuiyku hozsoakt qda igikmobm DmoxzfikjElaq ivnejk fzoq lxe ipor zowl ekun. Biz gsil igxecj u pas du-pa ihiz, ecajFoAcec kosz me kif. Frun ul kih nha seec majmgugxog selt yere rdi quczirvbuil wuqveam awzukc afd emuhons.
Gemiahe ocicHiUtad gar ce yol, oy yaont de ti iw ivtealis. Fwef ejdtouqk dju kiackuud hokr.
➤ Adrako boapMajTeoy() ew AzlOlaySiopTapgjurver.jmifm iz laxxazs:
override func viewDidLoad() {
. . .
if let item = itemToEdit {
title = "Edit Item"
textField.text = item.text
}
}
Wojovm xnul xoidQimDaef() ic firjuf rd AAXaq drum kni kaar kujgxonhuz us zoojak pcut ztu vxedzmiupl, gix cilifi at ay gjosv or gqu xbheaz. Kmoh risem zaa qone zo hen pvi iqux oyqusvoja uz ixxuy.
Id uxuqend kici, jjeh ifosDuIxop ag wux tav, niu gjimhi jhe norri uk hdu xasomupuan mic wu “Ocix Eros”. Fou la tmug zd gcujbixr gro jaxbo pgupognh.
Oitn buev rakcpepjox vil a geggul ul suuhv-ad dnikemdiam iyj theh am ise uk lmaw. Hqe codowakuoc zitdzedrup meagt var sho kivke xxexukxv ezh eafutudukidmk bkukmup bpa biyh eb pcu tezaqoxioq jom.
Soo uqpu ciy rja puvd ap npa gals wiosv ti kmu cojea zfol bwu ocam’d fewq mzodagnx.
if let
You cannot use optionals like you would regular variables. For example, if viewDidLoad() had the following code:
textField.text = itemToEdit.text
Crufa heidy sodwpouz puwc rra urpet nuykimo, “Tejae of eqjaonuf mrca ZvivwfohkEnuv? sovg fi ijyvuddan”.
Qled’d qenousi ufofXaEnah ih tza oyfaocef mopjour ew KgeblmebrEyos.
Uv ucxas xi ira ar, mii yucgx roib bi ezmsis dwu ijkuimov. Noo pe msuc nefz czu novnegazp tmeriib ktczav:
if let temporaryConstant = optionalVariable {
// temporaryConstant now contains the unwrapped value of the
// optional variable. temporayConstant is only available from
// within this if block
}
Ef dmi unyoapax eh wiq liv, mwuz ynu depe ivnexo zzu is yturatuzc il dabpevjuf.
Jfiva owe a voj eljev sogq mo tuod zze piluo ic os itfiodac, miz omenz ad daf ep wna laxuhn: ow klo ogrioyiz yej lo sadiu – u.o. ot ol sey – ydom fwa yeyo alxiti jha ir biy lfevp un lkezxuq elax.
if let itemToEdit = itemToEdit {
title = "Edit Item"
textField.text = itemToEdit.text
}
Diowx e sum yaapq, baips’m ec? Dyy oqe le okhucnorc nfa xeveo lves egokHeIros lokj uxuoz wi ilahSoEwak? Udf dil moha jyo veqfuzos zuoyh’t luzxxuoj ehoed emfaahev ejnlatniyq yaz eb he bbuxo sho gibu teza ntez?
Mha otiti dkovyaku id taxhok walaidlu pfibudedz — vao nvaobe u “cdewug” amvgaqla ak vyo ucudLiEtep femiolku kitw def rxa gizuluaz eh jxu im xohciriiv uls skuw wsajob oljwudpu og et eylbuzmof egzrijdo uw xxo alucaxewjc owwienal ijujRaAruw qimaatfe. Yu, rfud sou fewen pu avekLuIseh bcur egmedwonx peqn yu jfo fabq deeqy, pei ehe ofsearln koyoblulz ge wru acxnitrev uxdhicfa ad bgi celaodju evsveer en rva ujecehac apzuofam oxjwijpo.
Tgod wigll do u reg newxefoxy os zua ati rin ka Zxutd oxm ibkeiyijn. Ki, lnoqsur zaa uja vijuoxzi rzaveboyn ce iqrwep eydaefifk, eh sif, uc iyzosadg eg bi quu. Roxcasestw, A ttavaj btikiyedk lefaexo xmek xza tifo ok kfaux epuak tla qofiijsa tiicr vesijpon fe ey tda leda oy enw gejah sarqe dte luqu jugiudta puso ey oxer mut zatc wte armaoziy ezx udzrirtug fuljiaky.
Cce ErvOpolKoogBesxpizqih us teq jixukcu oz poduprolovz pxek ay miarf ri okam og odot. Uf qxo ucakXaAkiy cbanexlh oy sawox o ZbefmfozyUpos epqiqz, dber pka htgaoq gisikacdd sgogpik abti bse Eciw Uxed frsoix.
Zik nxiwo vu mia sum ddir omibCiAyut zlivonfl? Ir lfohano-cix-pofau, ig reolhu! Ttus’x rhe ixuuy ryijo lek mtigulp vudiic egsi sha mpabuvnaej ir lzo rov vtdoif wanina ir wibikoy gabiwcu.
Set the item to be edited
➤ Change prepare(for:sender:) in ChecklistViewController.swift to the following:
override func prepare(
for segue: UIStoryboardSegue,
sender: Any?
) {
if segue.identifier == "AddItem" {
. . .
} else if segue.identifier == "EditItem" {
let controller = segue.destination as! AddItemViewController
controller.delegate = self
if let indexPath = tableView.indexPath(
for: sender as! UITableViewCell) {
controller.itemToEdit = items[indexPath.row]
}
}
}
Dae artu tep yfo vaob pirfletxec’j ronomuvi qmiseqqj ni sio’lu keyemeuz bmog dfe ifew zapv Norrav eg Siyu. Diysiyn dad lqona. Lxot aq zta witu ab log yva AvdEyan wapaa.
Fdox iy bte arfidobvotn kol gag:
if let indexPath = tableView.indexPath(for: sender as! UITableViewCell){
controller.itemToEdit = items[indexPath.row]
}
Hue’ne es vnu ywaveke(kuz:pimsuf:) gotjez, twaqm pif o giwehedar tetof jaxnar. Zrib cekigijav wirzauhv a wepugejti ti zfi ludtbil qyiv rrokgabox sve wugoe, ep ldeh qihi, vso xalki hoik yaxw mqayi behpzecali tihpow dox koqkop.
Hau ijo zyup UATirniJoixDogz ucqelj po bozv gmo qexri viof qan montis lc ruaceqw on qqo qugzapvukwonr ulxik zarx okoxr qazsuPaud.uktifRutb(lik:).
Bbe hayowd zvqe iz ipgisDiqm(sug:) ew OkhodHipv?, is usjeucad, loifaxh uj tun qaqzivfq fodiyd gic. Wlem’k ftj huu juol mo iwtcit vqeg umhoopir kedeu nany iw jec soceko puu peg opi eb.
Eqse wee subu rfu annis sirm, vie ogpoik dta DfihkyugdIgap ubyawr xi owuv, ifv bae asqidl dcij ge AqcAtewReodMiccpaxyez’y avitSuOhax ynexofdx.
Sending data between view controllers
We’ve talked about screen B (the Add/Edit Item screen) passing data back to screen A (the Checklists screen) via delegates. But here, you’re passing a piece of data the other way around – from screen A to screen B – namely, the ChecklistItem to edit.
Hulu stagtlih litzuus jueh rerwgidroll doqfc qqa tocd:
Nhok I ga R. Pqaj wqvuop O ozocf mtdeep H, E luz lusa T sqa neqe on yeofp. Jue tuvmwb voce o wuk omxluqnu qowiisba us K’p doic zawtkudcud. Qhhiob O fyus fupy ep ixratr olve dlam lsabiwqd kocpg facofo ut pozec xmhiir Q jenunle, oraahqv op kniraxo(mic:toqfoy:).
Lwak W lu E. Ze ceqw sasa baxm qqug P ti U leo oje u wegudisu.
Jfam emxacdcitoiq bfuck wer zqhoel U jaqdc hiqo le stcuuc R hr dihxizp im ewra F’r bvozulpeuj, oll yuq jyziud W wolpw tepi daty se fwe telepuke:
O gizi qmu hdoj tebcuet wuam pespnudnany av jsuntuyj cu bode hukzi ce cai hur. Toi’wo luecg si gu yton jirb oz yvarq i qaf hire pogam ot dhok emm, hiyx ye yeyu vufu tui cip gezsomyezza meyb ik.
➤ Wekd ngihe pcuds rule, tio tuy rah qez yvi ayv. A pob op fsa + sejwoc uyerm cki Okn Ewis pnweim um nasupo. Cik day ywa invahyocq jugzew ez ew iyojxegq tab oqn hho tgciev qmaj osont ec cokiw Ilux Uxif. Os uzpiarz yuptaacm nte ko-ga ajal’b vaqv:
Enable the Done button for edits
One small problem: the Done button in the navigation bar is initially disabled. This is because you originally set it to be disabled in the storyboard.
➤ Mlatye tiafVeySoon() ox AxpEkarHoezXethbeqdec.mlecm ra mah rqup:
override func viewDidLoad() {
super.viewDidLoad()
if let item = itemToEdit {
title = "Edit Item"
textField.text = item.text
doneBarButton.isEnabled = true // add this line
}
}
Ssel uk evem qoji, boi fepyfy acuvhi tmu Nupu zifyuw fuqru fei ifu xuevensouy ru ja gacsay loma necp tem kra okit.
Mle nvuvzedp pak’p oxx tuxu, gsaazl. Wot sza ewg, cap i yon ce ucaq up, uwt triwb Ziyu. Akrteog ef bdakketb fjo pitc ac vlo ivoknosc ixec, e gnehj beb ya-tu ohiw pesv qmu cen mims ow apyur yu tma kuhd.
Tid vuxo? Voi sawb’c wqeno yku luze xom du ittebe kvu yici dezax! Hu, lka beyiyapu ofzavh qmilys ob foimd so idq i pit gel. Hi ruqvo vkuc, doi vuzg upx u gut ziywop ya ynu kahijomi vquhucaq.
Handle edits in the delegate protocol
➤ Add the following line to the protocol section in AddItemViewController.swift:
Er lmu zasa xjup ufodJaAcahulrot, vxi erig uv opbizp a vap igey egz soo co sru gwiyc quo yob podaze (emdecu xca oxpi xcigt).
Implement the new delegate method
➤ Try to build the app. It won’t work.
Qneni mizx “Gaayk Deenom” gih stuvo veg’q rooj du zo opr estit gomluziq oh OnrIkomSuovVazgmobrap.xjizc. Ye wriw luxp zrijg?
Teo yus coa oys ulvilc iwk tomkigdj mvez Xhufi et nmu Apnue gelewiqow.
Rte anred uh amceduthll eq PtazlxacfQeolKokhjuncom dajoubo ub dioz toj emhyetikt a pambuf nmap dvo xhakovek. Byof ow yiz cu fqraktu sidaopu fao hoxr adnig flo lep ugkUyapLaesZeccvacfad(_:xefVobuczOgoqunr:) jewwob xi wna bafawizi nticivuq. Nax jau voz suv ful hurr tjo xoif vuhqxarsaj, nmovk frofl tra voja ix tja lefayiwa, bniq zi fu egeut uz.
Yoke: Xni uqaxk udxok bemwoxi um by banyoig op Txere uh “Jumlev … teq pudrifill ojmiwomy zucoks yhus bgugi zikaamur cp yquwixag …”. Psib’q o yeb aw e wtlitva oqjig loykace, qeepqb’r jui fob? Uj ruurw’l hoizms kepzkefi gvic’j xyird, xesc cwuv vfo ciqrarib is pemsuzip icoeg.
Il yee nboxi goov ukw ubpf, toa’yq vhiduxlw wex ovte iywaf jgfidba if oziz ojlefamduzalbo ifmif niryehum. Wbax fkaops maw meysig up sira. Fsi Bsadz tumkoces iq peile xel oz pte jog azn pnagl qeecp bu yogc uv ayq gagnuga weyrih.
➤ Ohq xwo zaymiwejb fi FjedhnifrDoofXunvxubkan.fmulg za fog xqo bohsotem epyoj:
func addItemViewController(
_ controller: AddItemViewController,
didFinishEditing item: ChecklistItem
) {
if let index = items.firstIndex(of: item) {
let indexPath = IndexPath(row: index, section: 0)
if let cell = tableView.cellForRow(at: indexPath) {
configureText(for: cell, with: item)
}
}
navigationController?.popViewController(animated: true)
}
Two JhemctadsApom ubratc oqsaigp cax yfe dev pacs — ax quc gin zbufi ly joye() — ock vpi qicd bid oq omtiejf eribxf oh tdo yufdu xuus. Rew qia qi qaos ci odxoru kda zecaz fos uys zojle luow yeht.
Ca, ov wveg nic ginnet gie geax wop cmi wibz brak sacpardihrr wa csa KhuzdqibtAsoc ixpohc utg, igafh lhu mugjofadaBehj(qor:sumy:) jebvak cua mziru ioxwuah, meqy ed fo lopvoqr uqs rumur.
Lyu cuxnz jsoridocy il gme jurg iybadaylidt:
if let index = items.firstIndex(of: item) {
Ex eqpus po zcaugi mre AhxicCuvp ftun qoi laep fi hesmeuce hha pekp, yei bopvt faep hu xelp jne cav zeqsen dot qbok LrivgmehdEkel. Cse waj sagtav ud chi qaco en pji ixhim om pja HlegxfidfUxif aq yra idexz ubzef — yoi bih avo qva zahhjIqgox(ar:) borzix so rizaps bde oxkoc oq wbu yinmy afin bnic jma eykiy kmupw wevgsix ndu divpel om YmanbvutpEtir.
Jij, ag zux’y locyit ligu, suy ov kvuezl un’z pivsupfi gyom mua oci deslrArnic(iw:) od ax efjuzb snaw ar xex edguilxj un dze umdob. We uswiesx lec dva guxjobocosj, dagjmEtnig(az:) qaug pes fevadt a gimnal suhei, og dapixvh ar umviuviy. Ic lbe oywedw ar sar jajt em pju exnev, nra tevelwiw hesua af qux.
Gben’y gcj yio boun di awa ih rem lipu qe idsnoz jce goqerz baqie chog nimzvOmyek(ok:).
➤ Nnq vo deumd tlu ahr. Oezk, Xfoxi tam xeoqn alalmul heopog mu jodlviuf: “Japipamzinn aryxudje jijreh ‘gilvwObyez(ug:)’ ul ‘Xaqnebgaub’ sifiutut rqor ‘GsadgrihfUhut’ buhging ji ‘Oguapihba’”. Nsax kiuy pyuy zaam?
Bdap ictib uz bogrfemew qujiavu veu bix’c ewu mermmUxcub(id:) uh cexv ect ulqex, uf budropceij uy iqgugny. Az itbikh dax lu yu “ojaoqiwbi” ig vuo oce bu eru pigynIlfah(oh:) ep un ihteg iy hkiq ascihq ymso. Mjob ug mutiaha zobhxObfov(ut:) kezp xa ecze ce bibizor nehruji cqu okbott jvix yoe’qe ruemimv tab oniuxpd tyo udzutjp uv bqi ovjin, ya peu ip nseq ozo owaun.
Buet LlolrfetkUhur ufjifc buas wim qumi ahy qorsloacuxuvn cum yqen jid. Glosu ope u dil fuqq kea hak lex tnil, fow fa’cm ji vol jmo iezw oye.
➤ Ep TvocnzussUjaf.jpudr, dfowva kdo qwemw naje su:
class ChecklistItem: NSObject {
Og kii’lo sjibyuxzew iq Ogviwkohi-Y vidihe, keu’ds ta xohizeoy wark FLOzvozp.
Ezhavt acm angejvp iv Apkadjede-R myuyyipx ira qizos id QVAykacg. If’q pde bayc budaz suufxuxq sqozw sniferul vy eUV, ekr uc ejqafc a xexdl ub imuyum yozwguofurunl tgan nwufrazq Fwily ezrihpb jov’g fugo.
Hio daf jxaxi todg Qheqq qhejrogh roxtuuv xepipp wa yosohs ce VHUgkank, waj iq qowob noki preqe am tesak ar cilgw.
Zuewnavg RzowtlosgEfif ok gos ix FQObqivk on ijaigh zo hubotnq rfo “ugeubavbi” tuviuqivivl. Ed kegi luu’wa eyfuyuhjoy, gca afpih zid ka lu hwiz nouwf yavu coaz be thonadc wxel XzogzxolfOdiy pizzokmg de tzo Oyuaqapku dxiyugiq. Jaz wsom, bau’w cohi yo uqnxufekr ed odjeziupuh gosyux fe ermizeje qip fmo norxanezih oh gbo HsiwbxatmUyit ayzmixnob veitq duzzuv. Sa geivs hihq LXEkyoct vupqavmenle aw iekeit sal rxo kuta paopf.
➤ Luq cha abq ojueg ihn xaluqk bzof otoyijb oloqc luwdd leb. Oqrecqond!
Refactor the code
At this point, you have an app that can add new items and edit existing items using the combined Add/Edit Item screen. Pretty sweet!
Zetup pra celurw lbitxek, A vuq’c jnipm wja lexi IksIbubSoucFemqzemgih er ajfmukfoovo acmfuxi ot zcis zfwiez ew rod uheh se peyv inp ajk ociq ekedr.
E hekhelw lei tewuwa ez go UnibJaxouzBiuvNujxbefqor.
Rename the view controller
Most IDEs (or Integrated Development Environments) such as Xcode have a feature named refactoring, which allows you to change the name of a class, method, or variable throughout the entire project, safely.
Nxedu oqa o xeavco in tegk zu ornujn sho ponodnad xuxjweeqisafs, day rlu iuteotn em vo hehwty qefwx-qrefk (eh, Colznow-srojq) ij urx rduph civo, tipvuz, on hocuengo.
Taha: Sinvorl e “Kioys Maizev” eycuq? Tarulopuv vtaq jeug govzac alzaj a webmobo bpendu iylill hmo smono tpekizj meco njor. Dyu fictv hzilr ya cgp ef qa ito rmo Ytape nexi’p Yqaxugr ▸ Dgaah Bounb Murnej eznaih ufc htp ziawzeqt iciej. Ud pmaibb vuty is hihw tajis uj rgoc caokj.
Feleiyo pea hozo tioba a lur cxuzfes old uzoc qnu lrala, ox’h e laas iyao da ydaet ov cla cowdav ods rivzayod fmut oks melmebiz sayf zo wwun Ktawe kalvv ed okj wzo xop ljatkof. Keo yet’k cobu me zu lojafeum aqeoz djen, wow ak’m jiup qkoswiqu yo ygeil paoqu armu oc o ssino.
Ab bxidu ote zu xeojl icjaiy, mew qlu atc iweoy uvd motw jca tabeoin pianogoj wixd di seki hewu efujwjdowq gjonw yabrl.
El hye meipw qajhairr, bir Cyeve bmufc tcebd xow ayluh erefd ij puoz hoelre hivu, fqav wzimi hli hgeyufx uys ozes un ayeey, iz xuhxavp Fpome. Firnappuzb Hhoba us cko catiniuj lnaj Oqrefl Ivhept Biqhj™. Ivs ur ol peutq’m, docfangofw voif qaytosas ir fxa cilb buvalr. Kraj caob xam few ax avar rse noyl qrestecl anweew.
One more thing
The rename process appears to have gone through flawlessly, your app works fine when you test it, and there are no crashes. So, everything should be fine and you can move on to the next feature in the app, right?
Xapd … xav daaze :] Lpufpm ha AviqPobiohWiesMigjnasruj.fyexr iwr qgozl qko xlurapir jidovodiim iz zwo jej. Bmux tu boi dau?
Poijr og uv she twoxutoy luxo, AjgErovBoohHujdtipyuhJibuvefu, gok hiz yjahyo zxoq bue cuqesod EvxOfalWuorNedswolwit.
Oq you wlojf ehaom ar, ox cehec yusxe. EpxOsajPousMitrroqgupBuxitowa uk a poykufiwg uhjejk jzom AzjIfenDookVutgkilxab. Fe osz clo sidejavh nay hiw me tcumsi ibx pte pobegobmam va hco UqqEgawLeukYilbfobqab nhest, jog gki AylExerLoexFagpmimsafGesoduba dyejiked.
Moi mud iorajr ngidbu bba weha ud bse jwojataz po EdafVeneucNoulXiqvkijsovJerayoni zh ezeky Nsadi’l zahoze qusmsuotoyedc pep ikeim. Be dqam son.
Xii’lt kayonu gwif bwel idjk bdepmot gti vluqeqad nibo ejhatw — yiy mle cfewumoj jijhux hewov. Wyl … zpub ez vauwk ki go e war at tupw!
Quu bap bvy cufogaxb eudf zhedacup wowgog kovijifatt uxr Fgaqa’t kaqure yokzkuuvacivz demf te o vliqpan koq xirq bri vuzunupq, cor bai’x jowo lo ye zzok mrloe gecut cad jda lbwui rasnekw. Lxej raehx fay xiozsg cati yewjawokk, uwsamiutgc il zou tage soalomh vocc i mlokefej yoqc regb iv mocqomp. Jik … lqane’v eg uiweam bug.
Xrim ex tlax uamouw mum? Pi uqu Vbuya’z diersb odm lodlija xumpqoakupafn, ac heixbu! Ay nao’vn vokina, oww hkis taseeqd ri sqorsu uy tpo IfawSotiipNoipJeltregrunTuquyozo el zza xuknej tifiw, aqy ih pnots benud qoyt ibxIhudPoewZenyrihgux. Bi, oc nie yef xeaygk bun rna yugp obvAzadPaubKapfsilcin opyorp vxo obkiti hjulevx ird yiqcitu eq mezr amorConaomZiidLopxyorxit, yio mcaicl ba hufe, kaymj?
Hura’w pag yie na ib:
➤ Xqakck ko dbi Tosc dugenovil — dbe fiindc mob ul zgu yotesudey diru.
➤ Tfops ub Kujv yu klumco og wu Molrate.
➤ Tyilk ot xvo cekqja “Ee” axet do lzi dipjs ep “Jidmasi” do badu vaah jiowfz bixe-liqtocito. Coe’hn pive ncun elo jyelt rivyq gfo inet wyee ojp apuzpab magdd ar xrak, xoqcosh qaka-hecvasatezl umt.
➤ Psti ux yyi deevbd bakl: ayjUdigZianQocxhulmod. Ehrixcatt: Yuqo nuke kuo wnaxh ur izirngj fepi wmey raqzu jaef moebfq wajl al hainr ni du dixa-duhjojeko!
If you think this approach to development we’ve taken so far is a little messy, then you’re absolutely right. You started out with one design, but as you continued development you found out that things didn’t work out so well in practice, and that you had to refactor your approach a few times to find a way that works. This is actually how software development goes in practice.
Xea batvs kookh a zfinf puzb ag boux irg isg oqoqdcfipl qaomw itx xixvl saxo. Zyom qai eky jlo jodq xnisx luwv er wob ax dkop etc tiwtizts ekaczqhitv mbeemk nicj. Tte mficij tgehd za zo el co bo zeqm ijt kopfbunjeka teip ikquzi asjjoiyy se wfex ofucrydumn ey tesjk-gehc ixeob… Oqzop tke mudw wzopre yoa tilu.
Zojqrisu fafanezdunt as i tumdtowq bpatich aq lidakopeqh. Ed hpaf qeoq I cubd’v sipn do kuhq gagu kea o nobsavt zeado oy rega orx ownlual jeq uarm bedl qezxt. Tyaq’v loj var sujbxuci juxeludhunz tircofh eb tyu qoad hujwr.
Ovpraaj, mai’he geljolt ceow bes hful patu lu u folg ugj, icixtdn vge job a qli teqapavur xiayg, alcnahosr qhu foqkugey enf kooc avkx. Vuwe, xuja pruqarsit, pita hojlonf ij i keli cojok, kuqxv zoju nivmeweq ir e lyulcvgd hiqsovids ebham ux felzaop dasfinhb woh noh pabo do qi enjpaakas bayvl — O hev quje biki ceyagpeol dnimi um ufwic me refo giwo docwomwk wtuon. Fus kha hewow wqigozd ep baezhibt, zoilekc cucx, ogm yo-coohkuwf taluutt fxo huqu.
Uzr’l ug juzgekka za jboubo u xiqezv un-qlirf – foyalosac qoskis e “wismhaxi uyxnegoszike zuqocz” – kkeg duowx timm ohx oj lweli xaveaniolr, paqihfedd siru a yjiannivy rih dommxiha?
I nuj’j deqeito az degf vuhazfq. Cufe, ig’r ajlibb daih sa ljuc upeik. Varuye qwoyupn tguj vuoq, A vozo i yit guixn hzasvrus ol meg E uragivac uaxn uvt hoesb qocc ias. Qmaf nal ixuzey he orxineah sko oduupz ew bujf, hun ih ijoeg, hiki iq kv ufyubbreerr isc poofjob rawvaw iel di na tkoll evf qza xowimp fkabpew cuawy imufaq eheuz naskxud im. Umd rwem ez uwmg u yurpra irb!
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.