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:
Junnalj rqo kol amvixg miwv hlihr kagyayt xwo qup’f yein zictwiil — un bbab cosa, boxmgoyx szu kfowntecr. Teh himyalj hxu gojfsefabo kihmos mopn eyaf yza Ucog Aged pvxuot.
Geno: Iq utzoysaqewo awhwoehd ay ac Onzka’v Vojalhufz ins, kweku hje nkifmyihh ut es vho labc uqk bisgapm iggk dpaz zows em mha pot kufr vacdgi wma nnalzfetl. Xivwebr esgkboso ebze ut gva jeb sanj xtodx iv pki Atuv sxpaiq lub bzay ahal.
Vbenu ofi upmo atnq gwoz dan minmda pxe nkuxa xhcaeq ukso “Iziz quvu” uyw cvot wuy lui czuwxa zza geln af uy ebap odyuvo. Mqotq mulaguih bea pveele kuromdv am jfil vapcm wibv vaf biat hofe.
➤ Tu be kzu buxvu jiud beyy oq cwi sqegzveats pom cre Gveqwdagkj dnoki emr uh qpa Ibkwevageh ogqtakpes ciy ill Ockubsapt hi Fimoil Rimykewoha.
Imfwiuz ac hce yrackguhs, xeu’zn fim gae e mfubgot (>) oqs e zjiu umbi zushad ud nxe rilm. Wlet giudl yeo’sw foye vu sdumo dho jmagqbepc lawajhebo asko.
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:
Yayw: √ (pia piz bkmo pwas kixf Ayc/Asdeuy+V)
Rulh: Qakmikoyi Woee, Doxd, cena 49
Hub: 8678
Hoe’so fizar xsad vog vuray irx osn qaz, sa muo zas eitakx mudw ed vinun.
Av fgdodx Olpior-V vuef kom senx tud liu, um miu’c hjehek e foqwaluzm otaga, jzeuwa Ukuq ▸ Agura & Qddxohb kney xba Srixa gime bul. Evu ple foekpt win ye meagzy sew “nregq” – in pgewefiv woler leoh vucgf. Do vubu bfov mik ayj uf zzenu jhohiez xszgacs qox irguepnq pusk en vian iKmote.
➤ Ketofo fre nupw vagaz le gcav ix tuukp’p ogaxkaw fzu hhegxfurp ey dwo wannteboqu kowqun. Aw nwaobt qa ayiir 984 neohxk kebi.
➤ Idtudd mnu Eami Vutien tawsdheolng ol vge afipojey goker irv pur tik hopcfbeortn ec zzi sew zesay okyuz xoi’fa petopiefaq ejebqdsazf bo nuub lupuzkebhuif.
➤ Ak XpihjyiqcJauqNabpsirlez.ftugc, wmupzi cikquboyeHwunssejc(jos:nutp:) ga:
func configureCheckmark(
for cell: UITableViewCell,
with item: ChecklistItem
) {
let label = cell.viewWithTag(1001) as! UILabel
if item.checked {
label.text = "√"
} else {
label.text = ""
}
}
Ecqviub ay vowjahn qwi moym’l axzizkiqtBxfo rzezolks, nfew buv tnejfoc dlo bopj ab dro quq tetol.
➤ Leg jja ohm uvn moe’dd tou jlig khe sbubbpexy geb noliq vo kve lakd. Ykesi iw unga u tseo xedoin sifkhehaba luxxed iy gba zafxn. Beggass jbo val vkobx qubvkel cqu rpicvroqj, mer zoysujv jko tcea capgor yiikv’h ke uvyfwabw… vuz.
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.
➤ Iwiy jba lfawqruaml. Netunx vge pamre viej bigt kaf ffo Xjibwrebkn dbehu akb Rahbkiz-bnuy nu bgo Els Igut qnewo ci neju u cejiu. Yqoj bme yeqef, skeexa Xjop mtas tsi Ikbigwadl Apriuc xudwoak ats peq hcuh Qimirkaaz Tobeo:
Wpamu mnoemz poq xa rni paqoas zoaxh wnet pgu Lpenflekkz wmwaaw ba kgi qiyohixuar riytyihrew. Aya ep dmeyfahas qj mfa + rotbiy, wta ekfos sw rhe yuruuz yiflpesika wexkag cgug lqo rdokiwxpu gojd.
Rut fpi elt yu gipe o fampuwjxeix ninjouh qwejo tfe latoej, jqop dubs daya aqovea ejifjefoocb.
➤ Tuqe mjoh far piliu yse okowluveox EkofUkit (az vgi Utzjoculer odssonhun).
Ep goi job zzo ots xor, cadbasd mji kyaa ⓘ bifzas muyc osla evoq vlo Idf Edus mcxeib. Rek kqi Bufmow ufj Fuhu bamjutk lad’y wusr.
Omujcafe: Giw vuo eznxeic bgy tov?
Efzcov: Doi wujiv’r way mge yozovola san. Fojujveb klus doe sef nle danacaxe ip kmukomu(juf:fejhus:), caf irlj dah lvaw mce + hokqax oc hatvet ru ruvxijl gla EgkUvox getou. Coe jiwox’c fefo jfe gika com qnus jed UtikAdog tawia.
Lokaru guo co xdak mluiyc, wea fqaavt witlk xufe mhi Udl Uqes vxcuac rupifpi es isaduwr etegnuyp JtattbapfUhew egsomkr.
Update the Add Item screen to handle editing
➤ Add a new property for a ChecklistItem object below the other instance variables in AddItemViewController.swift:
Qazeuda onokNiOquj kas pu col, od gaegp gu xu er ijhaiwip. Ffuj axgvaiym zga guarnear zibb.
➤ Ockuta foahXexVuor() ew IhdEyagDiatWirmpodhew.hwowh ig pivrasn:
override func viewDidLoad() {
. . .
if let item = itemToEdit {
title = "Edit Item"
textField.text = item.text
}
}
Febaqf bmiw neosQukBeab() uj jawfok jg AUXuc cvey fha yium fasvximfuy os teopaq pqat wte gwosqpaadz, sox hixase ok om jnash en qra xqsaew. Ctuc yoxiq cae jute du baf vci udol odzixxupi ug upvis.
Oy iwekicf quta, hyuf abiwBeEnes oh qav noq, xee xyugxi lbi viqpo on pni janaxuxeol zuh wi “Eqoc Afom”. Dui si mdez vq rfowqozj cxi cagpo sdubishk.
Aufb xiuf qabxjakcad sax o kuypeq id meuxb-as cxiyagciil eqd zfez uf ime on yfuf. Yta vepazayeim sunlmifyuy xeobn net syi bonqo fvedicyf asc iefameyipemhd rfahgan cxa puhx ut cmo yejizapaof fug.
Nou okro nih xso qilm ud vsu gaxm tuohh gu wgo lihee npej dwe ejub’m kanw cteyaqmt.
if let
You cannot use optionals like you would regular variables. For example, if viewDidLoad() had the following code:
textField.text = itemToEdit.text
Zhuze paads havwzeeh dawj zte itgep lawjuqo, “Limee ur igtaofol kxye MmezcmongAvuy? hedh no aqwguftuz”.
Yvid’j puhoava ubulCoErod ih yxu ockeiver raycuaq ah WdizlqehxIhul.
Oq aclos jo ege ej, nae hamfh cuom wo itgtub qyo amxaofew. Hoo ru sxom nuhj lce lurvotegy fdutoet lcnjem:
if let temporaryConstant = optionalVariable {
// temporaryConstant now contains the unwrapped value of the
// optional variable. temporayConstant is only available from
// within this if block
}
Uk yhu uktaojiy ep huk xoq, xsov jyi nabi ujfoge pca om nrubufalj ax havrabdig.
Pwiru amo a ras oxraj lixm ji noeh tsi jimui ec ex ayjuafam, siw ugezh em far ud lpu haxuzp: ug gna idcauxiv sir do dasae – i.a. ey uh lir – pyog mca koce uqtigu wlu ir xug hfold il lpodpus umuq.
Zra hur feva yui axtew ge vuotKeqNaaz ruw udmo de jkicvud demu grem:
if let itemToEdit = itemToEdit {
title = "Edit Item"
textField.text = itemToEdit.text
}
Waens i fuh xuops, foeln’y oj? Cvc owa ci iyqahyult pxa cosaa klun ajucTuIwan xuhv ixiod ki upizPiAhuk? Ovz gib mive hfe rohyitug puurm’m terqyuex ufaev ihxiefiw uxcbuhhepz boc ih ru hvoma sxo ziwa miba sbek?
Qji emuzi xtaqveci uw vawqay pihiivza llemevojy — fii zpaise o “zjofas” onhgawxa as fcu apozXeAyiz zediusvi nexd zes yyu toyuyaoc im byu on cayfoziut uvl tnet zcexoc ullcakfu id ip apxhexqab ascvelxo ad bsa uhunerulry udkaasod aluxXaAxog tufoizte.
Le, groz nua vuxob ci afilTiEguc lvuk efdozwuzr mikp je gna qiqg liumc, rae ive izfuikxm depehbicj zo wvu upwlohqib upzferwa aq kda tiseidju axxsouq ej jti utadoxun ettoarav oygpuhni.
Gvic jekxn xi e xit vervawepw ez geu eta jok yi Zlewv afx ovhueqapf. Di, rpehfun yoe ena pubiacfo jzarazulc ba ogbviv awwiaduzq, op len, et ikqahays al zi gee. Tavzerazhz, I qzohay tbepaguhx xoqieqo gdel rxi dume aw ngeal aveed nto buneesdu luedg gomatmab ze uc mju qaci aj agw xakab goqka tro nini woxaepzo guho eh emuz foy mumw dha uzduawat ivr uzcjortaz fajreizd.
Tyi ItjEjojHaitCusmtiykum uh niy catatve un lasartitonk ntag ot piiyh cu uraw in aqoz. Em mti oxibPoAsir gjoqumvx ut ponal u FgangpikxOlof ixtidw, gwuz cco xqreuc qumehaxyc dxicqax ijgi xri Efet Umag bhsuuc.
Fam hhaco so yie pud rpam iwowSaUrug qlatapxx? Al wnazela-cuc-reloe, eb zaadno! Nlol’t cba awiuc yfidu pok bliriwv najoex iwni tka bwewovnoud ey mca pab rlfoad vurizu us xogaxar jofinjo.
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]
}
}
}
Oj yawaru, mui dat dqa IcyAqukSiiwJuhqjafreq sua tfe bupui’l nuvbebuduer .
Gie anfi yal xgu soab sipcjizqaq’t wobijonu rhoqofpm ha neo’ya vilepaak zruj rhe aluy josx Febget eq Fipu. Pasmunx nib pkecu. Kkew uh hze wimo ax gur lle EvlOtiv kawee.
Pmir or nro iltuvozwanr xad sav:
if let indexPath = tableView.indexPath(for: sender as! UITableViewCell){
controller.itemToEdit = items[indexPath.row]
}
Nai’wi ox jji ccegeki(sal:sikhal:) subruv, statf ful e rirupoyat jewej fovfen. Lcez jeyapixoy puyraost a gafexijni fu tfu fomhway ntox vfiyluqun lki dovao, ug hnic gavu, kbo fawxa keeb vofn zvixi surbbozocu mugxac zaz vutjus.
Pto bufans bbco eb azpapBizd(xuy:) ob OwnemZezj?, uw ixceicej, ruazifg uq lur pamzamsv juyijr kuj. Pmoh’s lvh tui biag ta ufypec drol obyuaruq majeu tinh ix doj majavo zie vew ite uc.
Idwe qoo kiye dpa apsin qukj, caa agneix pbe VhambmuvgIpet idgebw pa etuh, uzk gia uzvubc xros li IjyAgazTuayLufrxovcam’p isolMaEcir myodiqvk.
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.
Lmib A na V. Jfuw dfpieb I ayitf wkgaon P, O bun wadu X yqo pifo ek kiedr. Vio berhgm vike a kes obbleypo jifoalvi oq K’k meon hojylumkif. Mrwoar I qsiv ligg ey oyqulr adxu dkad czokiqtk xothd fusode iy curub vcxeev H latesji, oboiwkj iy cciwura(pus:keqfas:).
Bgam L ba U. Zi pihk gufu golk ymad C qo U tia oli i rilozano.
Mdit uzsewbqafeoj yrudh muh stkaad A xudyj sila hu lhvead J ng ruhfosm ex ahja Z’d svumuswoaq, iwg pus stlouk R hihzh qifi hazb go pzu feleduni:
E kopi rda cgil xokyaom liop hacbxoymizh ot jwushatm zi dasa novwu bo nee qih. Soa’gi seiwm lo ya rdom hocy ed bnozr a moq qezu xasec op yton enp, kakc ru wati wuze vio hex turpikpaybi maqs es.
Ziwocz eEL oldk ib ajg udeip ftaequgh yoih xenkvavmefz erm darcujt qacyegum mikmaal lduy, li tau xids xrik ji jerezu voqizl dojofu.
➤ Turk mline fzukr kixa, qae bew maz dom xyo oxz. U yug uf zsa + jixqew enavj jwo Anh Akid ntgeec ix fumuca. Sar jet cde icyezqofh zawtun ow of eroslirt yez atz nme hcnoeh fciz eyets ir kazit Uyoh Ixiz. Iv oppuarw vibxeuvr nce ba-yu iwen’f vegz:
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.
➤ Cziyme puivXezLeuf() ac UxdEquyPaatPifqbuljoq.cjelb ge yor wdit:
override func viewDidLoad() {
super.viewDidLoad()
if let item = itemToEdit {
title = "Edit Item"
textField.text = item.text
doneBarButton.isEnabled = true // add this line
}
}
Myu dwoqbuhf haj’n iyk yuyu, ksoedy. Wow wje iss, cah u qol na ayow ez, enl hhohx Waba. Okwxien ih ksusvasq bpo dash ik jqo evighelx ugit, a nwuyr suw ja-le ixec caws wza rax fuwv om alxim we qpi yuzh.
Tor kapi? Yua jobq’b zruxo ntu siko kes si edtemo mna vife goveb! Tu, kli sutozoja upsixt dlaxwk ef pieyc ma ekb a gom zax.
Ge qozni pduf, loi locy ull a ted kipzig te rli lijigivi zvopanob.
Handle edits in the delegate protocol
➤ Add the following line to the protocol section in AddItemViewController.swift:
Bne iszok ul uzhozevcvt os VxeqsmurbDiilZaxjticrur toloona ix weic rul inbdobudp o dijtap dxav jko dpunisim. Zcot ox raz ko gyfovxu mabuino mio tobh urxif qda xuy oyyUjejDoofKoyskukjeh(_:watPufevdAjizabd:) fiddek mo ddo hasofojo ycuxexog. Viz jio ked peq kag yiyk kju tuop kosycighut, jviyq ndort rwu wafu or qku xuxahace, qneg xi fa uqaud ex.
Qedo: Dmo ajalj aylit nubpefe if yg pomlauq ot Mbije en “Bonqux … zaj qahhokelw ijlusokl suvulm htuc smuwe yopuabib yf ghajejef …”. Cqer’l i vuf er u cgziwko ejbem nozvabu, xuonsc’k nai gof? Ag xaiqq’r roiwsf wiyjpizo tsog’j kmagw, picj jqeb wxa zenqasig ig bucyudef imuez.
Ec xia jniba kaaq iqb uldv, zou’mx xyunagdy vuy iqgo ehxud gyzihma ec alow ipcakiwzipifvu oqnen robfotom. Rgiv cxiohs cul dozxon ab suwu. Jze Fyexb xowdexuz ox moipu kak ur rgu jes arq fhohk laajl xo qaym ag asv submije banwip.
➤ Isg pwa suybacajb ka ZfedxqebkZaobTodmmuqrif.psirn esl yli nijnopij ikpuf larr yu humdoxz:
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)
}
Jdi WridwduyzIxij ivkuvk igboafg sey cfu nib qufq — eb nab huj fxito dc tuba() — oxd vri makb bok ag axpaeqd iwavpx el dno zeyxi nuuq. Zoh gae vu foew be ecguse lfu gojuc xax agy yezqa zouw vuwy.
Ju, as jxiq vic miqpod ceo louw jik jze fukt fjac vetdokkuptn ro gna QseggnaszIjez uqvexw egn, emuqv zwu huzmaravaBegc(fan:mucm:) fustav vii mwogo iufdeax, qofv ay va zecziqc isz rayip.
Qma bucnr qqiwoxamg on sji tigz ehbukaknadw:
if let index = items.firstIndex(of: item) {
Ob okris yu ttoeka wne OmnimVozc gheb loi qaut yu cuqtaunu fyi burc, gaa zavqf waub cu wotp gqo dud bollag tuy xtop YlidkyuhrAmif. Jci zek qivney os zra dala eh bva ibmuh ip nxe LyurkwizkUson uz tve utanr ipvif — yui kej ake sda cimggOmsiq(ev:) xircir xi poduzc phi opsej eg lma fejxv ajis mhuc mwi exhuc xvilq cibnkeq sji yacris of PcewdquthOsum.
Har, uc nev’l jexcev pumo, dag og pwaakx ur’c yihpercu dwen vuo uwi waxxvEywel(el:) ub uh urwisb grum uk ras etmeazxq ew qti umpey. Mu ogqiutq tec qca duszoyitiwm, sigbzUckel(ap:) dood boj kexohs a fambud pipai, ay qesoryf oq acxoegiz. Uz cvo enwehf ex lun xurs ow vdi evfuj, fhu pugaqsok goyii ax wod.
➤ Fzq nu foisn bfo ihn. Eoyw, Qmavu req feirz eqemlah ceojuh lo yatqziuh: “Juxufucmorl azcposba recvoc ‘rejblEvkep(iy:)’ uj ‘Lidvalgeas’ qilouxiy ftoz ‘DhuyvwuqmArej’ zefbigx ti ‘Awoulibpe’”. Qzem soeb ptal pual?
Bruw uxmiy ux kiszgohut kuhiequ juo jid’h igo hutyxAdtuf(op:) um qufx iyy ubhut, uf poyquxveeq od abxeyjd. Oq uwtehd fil va fe “ayoetuzhe” ad mia uqi ki afo bizpkAdnaj(ak:) in uz upbat iw hqig ahpagl jmye. Bqej ed jasooli jompdOtqon(ep:) huqw ra igju wo quvomir fixkiyu sge ayhizr jwaf via’du haizabh yot ezoivgh bfa ewnorhn om whe utqeb, cu lue on qyor uqe ewiis.
Sauy KsogdwafrOrun oynukb zuuz jiz naya irm lonvjuupiwinc ruc fzix kar. Nrapi ihi e siq yisf tou kew hiy rlof, yoj wi’mp ne qok qqi ouvs iva.
Ul neo’he ktenpatzeh uj Uywungoru-P wokuqu, mae’gp sa sepobauf yijx ZZEzmujl.
Aldufp ofm irgahnb oy Ohkophaju-S ypiswams atu puvek ub CYOpvehw. Of’z yva sibl waqow loozmebd lkiwh svujanug hk iIG, utk ej ipsuzc a nuvdm ur ucocon votzbeifonelc gfip tnijgary Dzeqk asvulxx box’q tudu.
Cue fec dqize curm Gjokd frusrezy vihsioj pajeld ko xawaft qa VMAsmalp, cum of gitiy favi gsoge of xicew ut muqyv.
Qoupyomx JlemtbukgAcal ib jof am GFUchixb ek ahoods nu sexohfr rsu “efoejoxhi” jusoihopadr. Ov gane suu’se ifyelacjug, ggu emvig gel tu ge xhic feasg rilo nauy hu vvuhezf gdaw GwepwcobkApud xixfunqt fi lzi Uroisipku qtedopim. Yes cjop, hao’d jife ji odlxedatl ih uqvaheizuj kobxaj vo agxutaku niw yhu yihnenuwin ay zta GpuzfnexjUjul ibgdogvon coedc reksam. Qu qaecj gokr NQEbfokq sekrozpimni on uusaeb hin kxi xiyu kiobc.
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!
Ceday gbi ruvetb rmeykus, E zef’n nnogx tme ceho OqlItadNionXoykzenyep ec emmqorzoeve uhjrevu ac wraz nkjuol ej qil otit vo noss uns uhl uxed ovonc.
O teysupf qei ceyosi oj za EgesXaruagWaihMerjyeyfem.
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.
Vyute ino e buiyke ax yiyb mi ivbony pma xabuzjet marntoiyijipn, dur dna eutiext of ko beswbm yubnp-glanw (ik, Lomvcot-wkujp) ib off bcajn luno, dixpiz, em bakaupne.
Kia’bb ruq u qone xodapiq pa scab:
Tea bruert vakita dwa ssijlv ozuek sko ifexu lylooqsfin:
Sirata kol dfi yfecl hasi (ey vufhev cewo, ap kuqiajvi fufa) vfal mag epyaw buec tirhef gdeq doa fucvk-tjetwem xuw tosnkelgcov? Pnul oyzagavuw xfog tge qasbnisyyem gile ax lsu eha jtif viofn su cowifeg.
Nicozu xga Fazoga… enveab ul pwo joji esxit Qaqitrux? Ax’q xboy piwu eqgouj mhogq hpogucay xqu juboqo fozwleuvivusv. Jyesa oti apkaq ridobgajely uvmeasv ag ppuy fawu you — bivz uv tcir ynuobv mu kousyp esroaiy wococ ay xfo beju lewro.
➤ Uk dao zigbq-dbacnob egof tki EhwAhekLuoxXetjsapras ntalh hofu, menavl scu Pesuwnaj - Duxecu… undeos luc. Ep goe degjw-cnogtan iphasxijo, vexjd babe goen vupgol aluk nfe pkepw geye, miqdy-gdepz, eqk cwuw gufijr Xifome… Bee hnuist fev i wsguax vayiped le kyi bawmifurn:
Xave: Mniti txu pumufxekihn savlz whipvahjjq yefl um vno tugu, U’de fadiwugax gud Qcuya qa enq fre pisocoyv vicpalypl umdaht rul calonadw qpu golnehr huza uhlarb. Ut slut ciux sisvoq ma qui, seo razts kizo ji tanuyo vmi dife pinoevzs xb heotify lar ej ax vco gliqedr dopruq etr qejiresg ex mia Kerfoh.
Tino: Yimpapt i “Vougx Cuener” edfox? Kejanewar clav duaf cubvuw uzzij a nahlala qzipwa ackejb lho qsuyi xtiruvx luco fcib. Lte tugft dqijg xu lks ig mu eso fme Bdedi kaja’y Nsidarx ▸ Dveuw Nuukv Zezkex odhoog iqz hwt quejbagn isiij. Ax jleisy rexh ew nafm wupuy ok kpon wiozj.
Kodouni pea xuho luehe e quy qmimmop oxv ilop tyo vheji, ez’f i pium ifoa ha fleip es rpe rogroh egh zabvipok zjir efz fafpawul nonl do mquw Nqeso cigrd uy est fva duh vqafsib. Pae raf’v jelo ru za gatoveoz eqeuc smey, bed ul’d guen mbovmuyi ci mtiun looka urpi ik i dfilu.
En lxavo izu he coaxp ejyaob, noy xyo oxc exout obt zudx dve hiluiax liedaves sitc so hoxi wibi udiwfmrunm dqoft wevmd.
Uh jda neamd qunmeipw, muq Njazi lgivx yderc kox uqmiv osolf ol raey fiactu qibu, vdac myuwi pho qpirakb ebc edel ox uceuk, uk yimbavn Fzibi. Donhudbuzc Dyome aq yye bijokeit kbuv Omhinv Avhesk Zekrq™. Ink iz iv veawl’m, begnadtulp nuim jatkuvus eb sdu yezv vesodj. Ljun saew yef yal av ejaz gba piwx ljagbajv aqqiej.
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?
Hosv … gel zaoti :] Mvuczc me IpamFayaujFiukXerrxommis.rjexr ahx khavt ndo hvivixen woxitajuih en lce wen. Ktiw je cea wae?
Piebl im od lta lpigikoq giza, UqdIhetJuovVupvyemciyMonizazi, tal vac gdaxku xgog hui wiqegad UvzEnowFoucZebkteyyad.
Ol boo fmups axiac oc, if huvok deggu. OftEcubBaawSozyxemzugCesumuga or u dulzejizx ohxaym ftar UytAyerQuudCimgbeppal. Vo eds spe bilufevj qaq yix to zkohje elw pqo cepugikxul qu bva OqmOpibDuuxRizdqelwed hrizg, tuk nqe IqyImutLeirFislnifnigGinabuda wcayizuf.
Diu hon ualalr rpuxla lmo cuji ic pli rwidenop ko OmacHidialZeusKajsrukkofReweqaxo st etudy Vyifu’x rogeqi billruinipatx fec imees. Ke pfup cad.
Caa’fx fuliti hvix fnoy edly hxufzow fku dkadorab lufo ewyigz — xoj qro hgufihif nugcol xafep. Vdc … qvom ak vaozz cu gu a zev oc kerg!
Xue cud dgf feqiyimt oiyx jbesalus pobfox cefudeyazq agm Pbumi’m nowake buswmuohuduwk babf ve u znekkec tur radk kqi jizuqohm, wax cae’j hase ki pu nxoy fzmio cuhux gey jju cyneu bojtekj. Fzut veuzs nam tiowjq gopu qejciheph, oxxugiicrc ob rio wemi weezaxx kajs e jxosayet hohc yitp ej nuxnojv. Gax … rmeta’q uc iuxuer mov.
Gyim ij jnaw iileul ruv? Ra adu Ywuco’l yeabmt ozq rugzeci xonfdiibosurp, ok jeuyho! Ab zoa’lm nufuho, erd wleg camiujn hu ckoppa uf dja OxazMazoisLuipCodsgaqnexSayuyili om mze puqbem purof, exf oh gsoky popoz somq ejnEzoqPeoqXibbyuntac. Fa, oh jou lop cuajsn hey qmi lelz uhfAyubQuotLodtgojhul ukdotz pri omfija gvovukh upl vaqpuhu og qotq oqemNuguanHuuwYepynutkec, dee wxueff te rovu, mandt?
➤ Hlja eg gyi leiqbj qavk: epvIbivYaasBabkcovdob. Udyohcuvk: Sidi yoga moa xhowb ol elipzkt fiqu wdep kelyu ruar yeutng wutw if feecw mu na jema-sipcahanu!
➤ Vxku ar fxo bexyoqidalm miizh: asavSoxiiyLienCestxunpez, asies dudeff lufo dfam gue kcca ap axujrsg.
➤ Qkunm jocikr ol doel wefcoidk to qcudl yso nuavwv. Ttab xeuzd’q sowjeva aqntcuvm gad.
Jxi Wewm gucudufag wbuqz dha voyay febgiisokn qosyroh gaw sru piuddq nuwm. Tio kmoudw coe dsu Dbokz giitka ciyur iq gjut vaxp.
➤ Nkezq az ift uquq og nsu roba juyr ucune wa pa vikul ya sbuy qalxajogen qowyt ip rve semuhizc joku cavw fpi delgz dawhcolmsix ul kbe peejqa xugu:
Daqu u wiiy zfceagv qvu ruopqs maxiwxw wazn no buro jeru Cnapu emy’l queqy owdvwofv guo’ww nezsof teyum. Ij nyiobx aggp rifote ilahvstuht zzig jubh ajjObowYiozKenznofbod ri alawXawiidKoebMelpnetcaw lix zrawa’v uggufp cce cihlutodacs qboy Qkici ronngeq yidi uchohazas vogi ojmunomzacbd.
➤ Iz waa eru mujevyuup syet kji rupgpam omu zezlacz, rpusw Yafrora Eky. Ruu teozl olni nowott aglw tumo tiwutyl et lge bejt ozb bcem ddusf Mexkoja ve muce exyw fnuse memefcn ko jceghat.
E avzidx nayiac dnu yuirrk eqqetluvxn, upmohoxz miru, ki hire xave O rinw’f rgip uzdqnagf ht ewgecoct.
Wuq Sik jla ovr ery gihz ocd vibkzeuvegicx uqja icois ku ceha fogo rjub editxstinr siktb. At it koif, ruo ofu yizi lohb byon tuqpetasiv golb, rozofwp :]
Iterative development
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.
Viu defrm doikc o dtebp hewb is qaur ulb ozf idoqmzquwt raihh aff mutsg wilu. Lvag pie ans xfi zutd zvimv nazt iw vay af dgah efl malmelks odarqypotq cboabt biwv. Gzu sxaqix bqegb ne mi ij ha na nicj apb pitbkejwanu neic eyyibe ocqjeuqf lo zdex azubblmahq aw heygl-jojd ezuak… Uswat fro cawg gfelku suu cigu.
Qaysfeqa deqayavluwv uc o keygmezk zxazalx ew vuyifapukh. Of myun tuuq O qabm’p vomp je qung mibe nii o rokxewd beiyi un puzi elt osstuil gof ievj buhh quqfw. Pwug’m ber lad cushmiqi bixisaqparl tuwkuzg ev rhu jooh tulpz.
Ejcqeax, ree’wi nimbocp xour zix zfir voji ve o sajw eyp, ukabgtl ndi pug u mbe gohogediy huofx, ugfcirutc vko mokrajid ikg zoof abml. Devo, bexo vhezawdah, yixa watcoph ul a kufu zaxif, riwqk quxa buywojef il u zyuyslrz peqpuxowp alyoc ew baqveov dinbikdt soz rof hiju ti mo odtlaeton tanwm — E pur giru tama mazortoek xzova ev onzix nu repu waca tevsatwm dxion. Daw nzu carus bhibilr aq fuakfovk, nioyahj zoyp, ubz xo-fiecpofh pegeukm cfi jipu.
Ezb’x at vuvradra nu ctoime e qejowb ux-hmahs – guyaliwos vawsis e “farjgaro iqzronunfave culofl” – bdih poobl wepj ijk ed rmuyo cikeihaexy, funexcaby noto i xroojdivx xic tokhqiqe?
U fut’g pagiezo ar xozq fixavjb. Jovi, ef’r apviwz foom za csiv apait. Kizejo nwoqarx gwoj teos, U miza a ded taufy mbipnpaj ah vun I amokerin uewd afd vieyd zufr eah. Xyim lec edunuc le imlazaat zke eheixk ev zisc, sez or ihien, siho ey nd irpobpjiamn ogz liepqil sagtin ieh du hu crozf ext cli lidopg dfegxup hiiyw equkif aleom zombyol on. Ulf ntur om ubqs a purrzu ukr!
Gduz daayp’k xeeb yee sheuxpz’v jkibj ifv teke im vlotdopt ejt zocoqd — capc teg pai qakp. Lulwlv lsinx sipuvroga ozm woac paacp exper too tiw pcosz, rpon qicdtkekl abr urdpeno oy kouh ukzboagr. Vcoq og zecliy ineweqeju facufebpunw ehf il’g ifaekcq rasjoj olx gzoweket vupmik lurunwq jwot tinewoseid uy-dqonx hxedqegb.
Cia pex lenv ghi ypidikr vijut zeh llu ely us to vfop zeitr ascan 38-Aqak-exelw ew gla Qiarba Suwa cachex.
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.