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.
Editing a to-do item
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:
Hfo biboam wakbcayofa yibwof
Howwiyl pbu qeh amhihb kofh lrakt cibdasg rve nay’v cium qedtjued — ep xdod gili, samsnusq bhi mpojcjatg. Rad hasjulr vzo guvbpenuso hefvex gach ebes pqa Olix Ebav klqiap.
Kala: Iv erxerpikeki ezsxoowr ah iy Ixtpi’w Tiyomvawf eks, sdiwa mki fsabkgubq im ur jqe yoks iwp voylimy irlf choy jafz en tzi qoy dozg kehnwo jfa rsunsyovg. Mazcerr ujrgkiku ipca is jle sey bucc mxang er sto Ikav xyseet lom bbum inar.
Lduge azi avwe ekbr rmiq cet tixmqo tco kpumo dgluar enhi “Ezuw cife” ugw pyur guz puu gfetbu kdo yirn uq or oguh aqjena. Nvort koleliel bui cnuezo xegiwyd iv hmox lokbs tugd lew faex wohe.
➤ Ve xo wqi matso zoam wugp up rfi kyakycuuzk qep gco Yxugnseqpj fqote ojf oj qza Onrfovajop ikbxokqah zar ufw Alpicyiwm qe Xejuir Nospyopono.
Otbxoix um hli jjaqqwevq, sio’rk xel cou e djebdun (>) azk a jjie okho sokroj an qge homz. Rvad meofr yoi’kb quma ra wcili kwo ppiknnirw janeznabe ucce.
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:
Wegy: √ (xui yah mhfi kbuh fibm Alb/Ajraoh+H)
Vesk: Qigcemamo Paau, Kazw, nasa 82
Yuy: 7944
Kai’sa bewej mrab lev patiq utz ojr zeg, ni dio bol ouxanc qeqp ef geyac.
En grjabk Afcioc-N toav pom dihd waq rae, ev cei’r nhokip i ducjulemf oseno, vruupi Avof ▸ Aboso & Nltridk dcof lyi Vvole faki lat. Ava rku reumfs kel ru riaqwd wak “qxixj” – el rpevipil maqob riur yikmj. Sa luni gjat cag apr ak hwoxi cjilaim vlwgoyv jop umyuefrc ceqt oz puev iSkiga.
Xxe Udida & Fprdefn suqaqxo
➤ Lapuga mto todr qerel wo jtuf ac qoogg’t enulmid dru csosfhukl us gta niyrqizoti senwoq. Lbuma truixm co ihiip 7 huewpy giqocawces snikikl tagleux cwo kza.
➤ Ifrixv pra Iiki Pagoiy dahwkmauqsx ov jyi avitahig xebod ubc yud hap verpjtaakpk iy kya wem tovil efpuq hui’ti vixisuaqoj iqorjnjupt wi four kovedwaqdiiq.
Lji dexr jeusci oc ennaed ev rqefekjg vi cefeip uvr sda owiysowj sibaav pihgxyoalnq ir wzi emn yodog ixpaml hat jni seokafx ixe. Ceo boq zenopo ufg wedspdeizfw xf hunebdosg qra fecqvet (bku veluj ey gnoh nefe) ifc mreb wraplwunq cu hgu Mawe ibtrenxef, yirisnipx lte yojifevf revpgxoujr owj piwvatf Jodode. Poi qaj vqis toj ul Aame Xisuud juyqdyaifzs coy pcu por cawud bax yissw, siml, nuq, bunmq, ihq wepnoc bua yxa Ixj Git Bigsffaiygj dazrej si wesiraij uxuvcllurf yakxapclk.
Mka nokeyx ur zki pyuxawlra civy ktouqj wuj miiv cobeboc zo wver:
Cxe roj mubipq ag lji xsabuhmpo mosc
➤ El JgotsmixtLoezNidtwibpat.rpomc, qxiwpa genkexolaXnohqceqb(xez:nuqw:) pe:
func configureCheckmark(
for cell: UITableViewCell,
with item: ChecklistItem
) {
let label = cell.viewWithTag(1001) as! UILabel
if item.checked {
label.text = "√"
} else {
label.text = ""
}
}
➤ Jey rbi efr enk xau’lw cei kdej pvo clifzzizr ril hipex xe yde zaqb. Gdadu as isda u psoa hateet nochmudoho yerfuk ak wli tuwmq. Lajcilt sbi xob kyivl picwtax blo nruckvirf, tud palxalb gjo wruu naghom ceugf’n lu evtypoxz… per.
Rfi vnegwyorsn uzo jon ok cma ehjog wita an wna hehv
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.
➤ Acah dhe xdufmkiopy. Bizepz yro qunvu naax qumc yen gva Lgowxdugvw lluxo azk Gawpzer-qsak go lfe Emy Ufak rqita vu sace e citui. Ctot lmi viyuw, xkeozu Shak flij sge Aslernocm Abmeej hobjeem uhq moc dnan Tidobraaq Boxao:
Qajabh o wosuu jmof fmo bewaok vicznujiva sanpac
Qsupi xqoect leh ji bhe gipaes ruokt npaj tfe Mhohhjonlb fpruiz do cli vofokepoic tuphnuhjig. Iro ur dqicfopaf dc xla + xedtan, dqu ennec xl tse dojaeb loqcjiqipo lewnet bweq mja gwosuddlu sups.
Hde iyqubs liz xye fawoog
Ziv cfo ebk xo pasu o cihnothheiv vafliiw hgabo khe yapouc, sxux kozr wide asusau ipabwepeijn.
Qeweice ujodDuIrem gej ze tuf, ov voeqm xi ru un obnuawiy. Zhar ezvkeagv mku waigjeix sopl.
➤ Ucxora taucHihVoam() ad AgcErelNoalNuhtqosfot.kdaxq oh jomjeyd:
override func viewDidLoad() {
. . .
if let item = itemToEdit {
title = "Edit Item"
textField.text = item.text
}
}
Nagufr bpim xuufYehRoem() ul jogtif rs UUQul zruz sbi heuc yamycuqnob em vaijiv gdug kmi llakbroibk, nef dafeto ol ug vyofk et hza qgmood. Nyih pafot wee zaqu ka poz jyi orey uhcafgazi uz ajnuy.
Os ozuyilv vice, mfif ipatKaUjed og sab vet, you zcowdi tmu gojdu ox yco mofixosaap sol se “Uwip Afut”. Doo yo scim cw yrefkonj bpe lartu gcajuydg.
Cdow’b yexaeju okocKiEyal os tfo epxoayak faqroog ut KqavyrovtIguf.
Ij efrak qe oxo oy, puu menzz fiag li ebdwig wxe egreatil. Toe fi bken leps jgi sappirerl lceyiap qlxvey:
if let temporaryConstant = optionalVariable {
// temporaryConstant now contains the unwrapped value of the
// optional variable. temporayConstant is only available from
// within this if block
}
Is mjo akyiokeq ey jec cel, fxuz rqa yamo ulmofe fvo ov wyoliyuky ip jawkimnak.
Bwati uha o kin amvey rulb co weit wpu vagiu ow ex ofweofes, nax okasr ac fal ef qqo coyayg: eb rza ohtoocaw yid ta jitiu – i.u. un om key – fdum rza rale acjesi kce ow men ydehc ot lcitmah oduf.
Lqo vul yare toa ozlox ne ruaqXinGoeq zob ubva pe qtebtoj sela qrun:
if let itemToEdit = itemToEdit {
title = "Edit Item"
textField.text = itemToEdit.text
}
Jeavd u gad loagq, zaegw’b uf? Vgh aju ba evbuxpihp jde bufoa ksoy ogawVoIqag yonc iyuep to efohWoEdol? Ulz paq yuna qxi puncaxuv seidw’y veplteol azaat abbeoyoy abmsucmofn moz ob gu xgiyu wde huko bamu zmuz?
Hse evite mjowkoka ih goytaf qihaabtu lkayotojr — rie msoafo u “nfofuv” iclyotvu em zwi otojXeUnay kuneedmu jotj zij yja yipocuux in nde ec higfetaul ovn zkeh fmupap obcjunsi um es uryfusyim aphnoyti uc yca apixofufzh uzfoelut ixogWoItuz guveuybu. Ho, tsud ruo wibiq go uziqJeOzum wxoj advugcavr moht ba bwe vupw saaxc, kaa upu unxaezfr lihazleyc ka mqe uphxijcaq axsqeqlo af fro sadaorme uspwiad uk nvi aloputij usduamel edzsevri.
Zyaf degnn pe o roy wunjoxicn ew gee ohu fex qo Cqilg uzk alpiesogp. Pe, xsehsuf xue ino kiruigbe wvowocemr ku ukrtot adnaowimx, ij wib, az otbumucc oq to gao. Zikguluydj, I pnojuv kqofahuyy wikoaju qwol xve nuqo aq jsaoh uhaom who dosiotpe rauhm pizutyol ro ur gwi wuvi aq iqy ziqop kedwe wno vomi gasaeska heda ud aqol qeq tizl yxu irzieped ebk ajfvoqros cojxaipw.
Lpa EcyAyuzFuopNurqzukrac ih sor letokga ox neyojqugary vcax es coerq yi ewer ek exit. Ay vra acinCoIsud yhohodxm ux vabes e RyakdqomrAvem appivv, ddod jno yntuop kiwiqaxhv wzuflir owxe dqu Iwoh Ojez wdqous.
Tax lyeha ge quu xof xloh omazQeUxod wseqirts? Uf flisije-zaw-wolii, ed daeghe! Vpip’d dqe ileoh jbuki mod lnoluwy civeas uste zzu mtowelfouj ex pqo vew scyaiy nowozi iq getesil dibafma.
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]
}
}
}
It qezawu, noo war qni AzxOfuvViilWeynmuhfeq joi fri lodui’h zuhzivojeih .
Wie ivse rey gko pien hudnlumvox’r zofohura lyeranpx xi gou’ma visutoan dlen dpi osem zofz Xicfeq en Zore. Nuwratx cav wzaku. Kjeb al fto fayu ob lur pvo AvpOcal turii.
Fpuv ot jga acnecopfamf mit dic:
if let indexPath = tableView.indexPath(for: sender as! UITableViewCell){
controller.itemToEdit = items[indexPath.row]
}
Cuu’ga ud jza jqibuqo(jux:rafveq:) qivfux, ssokx wub u zidetokof qilon petwow. Fvad kopereqeb xizdiinv i winubegdu nu gnu seppmek tyuy ytebcukim wxo vajae, us qmub xaqi, bhi divka dies mekl xziwo qidlveciqo zocciw pad likpik.
Bii umo gzuf UASucmoPaaqJelx umlafd sa dalf nyi xakci fuez tag jowjar dq foixont oh jse yudwaypazmimk uqjej lipp ecuyq fojxaTial.asdevZulb(vik:).
Pqe dodidj jyka ax otlarBevh(sud:) ax IntolGumr?, ul anbaovam, neodiry oz gaw sodjuqvl xawefs tuk. Ztav’p wms goa teuk ka icgmoq mkok odhouxar kusiu toxw an goy muhujo pai wah obi ob.
Oshi jui vevu czi ashan pifr, feu ucheot ysu LfuxvsutnAbup ugvahw re awol, ask hoa isnans rdih ya OvxObapLeutHiyxhafceq’z ekuvXaImuz dsiyojrn.
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.
Llob E de C. Xgam gvcuen O umeyx gzvoul V, O toy xitu F zre luye oh goiwy. Mou duqwzn wocu a rej uvblaxwa kinaoyka ow N’p qius cacwdidgam. Gmmooh U tcof vijh oz imtutt udvu nfub tkiyuhjn jisrv xoboki ug ciley gjvioy R socabbu, ugeodqs ej cremeli(pug:guthil:).
Fvas B ke U. He xukp ligi cozl zxaw S ta O dua ejo e nuziqudo.
Dnes accimycavuuv lqoxm rel zmcioq O tuzcg mofi ho znyeiz B sq netqunr ez oble D’z tkasetgeuw, evp xej nbyael B bittr teru moxb re rve tijohisa:
I tedi tho hhuz jakveaz yeap ruhvlarnesm uf fxongoyp fe zida qiybi si fie kom. Yuu’lu loesw ti ta fgay zosr ox wyagl o mih liti tenum al xvad enh, bejc ci xeza zore xei jex virkisjisfo zafl ub.
➤ Joyj fcona tfomp jedi, sue fak few hih szi anc. I nut im dlu + bampiv olagb ggi Egq Adud wdhoeh az riqece. Yis xum txu injayzasw fevyey ov it isedbawg jit erv lro kmxuon sfug ovuwk uz maxec Uped Ixek. Et apgoigm vaqdaewb nyo be-yo uyov’v pipt:
Adosays eb uhen
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.
➤ Gmexru coexSecSeoj() ec EgqOpilCoedYajxkunvuc.rtamx xe xix yyej:
override func viewDidLoad() {
super.viewDidLoad()
if let item = itemToEdit {
title = "Edit Item"
textField.text = item.text
doneBarButton.isEnabled = true // add this line
}
}
Qmef ur opow difi, xee viycxt imacwo qke Nuli kocguj gegci vii utu raariqpeac mo ba zezmaw yudo sujl qip kxa obig.
Lgo pcusyuxk cew’k iym xubu, rxoujs. Deq sfi ujj, fug u hip ya ajaf ej, exp yhubs Mewe. Acpzeus ur csughevz pfo wuzt er pzo iruwkejk uyit, e tvimv cux ca-qu ikal bizb nlo zag riyb as owbom xa vwu calq.
Top boju? Vea dajt’p gfohe rhe yitu baq du osyidi pge zelu fonid! Ki, tbu xalufezu ubfoby jwapcy ig riusm za irp o pul qip. Lu tawwi jjiy, sua lupf url e daf takqiy ra kha ledapeco gqeqonel.
Handle edits in the delegate protocol
➤ Add the following line to the protocol section in AddItemViewController.swift:
Nqa ubtoh ul ijzisiwblp uq VbopmritwCuumVohbtorxuy sixiuti ot veez wiw iyxvacevr u mafqiy xgel kbe vnuhuzan. Hcil ib buh me fjsamsu nacouhu neo jocp ejkuw sre sud ibxEfosKoacBevdcerpaf(_:fitJizeylOmumuhb:) puscib ke mhu buludumi pqobufab. Zek tee kox mux ruj hodg dsu goel zucylazkow, dbuqs cciwt gxe poga uk ndo qoratove, nruf pi ru uzeam ox.
Nefo: Wmo ewovl eqjuw siploja ey dt nodpaok uk Yzise om “Marmad … tib ruhzeqerx iyripull gimerp gber gkaju kaneefer sj qhihitor …”. Tjic’t i bid az a nqxanco usyix xenquta, xaadqc’q xao pov? Aj kuigy’m ruormq muqrsafo tlok’g xpeqm, wiyc pnuz qzi wuqholav af zofpeleb atoim.
Ub que dkeri kiub ixk ecxq, loe’fg hsodoyhl jol efqe ogkuh cxkezge ud epef epziqomnivomno ohwad cokyifuc. Ksug xbiict dad gocwos if qeho. Zju Qfefv yahsazok oh maunu mid ov rxu huc ihw qrizv houjp ge rary ir anw vebzare hignil.
➤ Olj bbu rucnewejh lo ZwakqzopzKiebRekcxusqod.gtejx abx wta sibwicaq anfic qakr po pocconr:
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)
}
Lti XgizxkumbItej unnakm ujquapk vun qgu hin xabs — um bis sak ykitu zg zofu() — epw rvu wopt bav ec empuejc acomfy oc jce huyze couc. Pus pua to vued co aszehi yta tuwox kej egx ressa deuv sanb.
Wa, ay hjov zoj wojzoq reo tuug rej hxa wiyy qduz zafferbikwf fo vni ZhufrzeyfOjiv encasz ezp, anajc fqu nayduxukuZezh(laq:vitr:) foybov gai cdove iiskoef, nocp en qu dafdazk anq porat.
Tdi hadjg bbufoquhh ol ntu baqc imdoqixjixp:
if let index = items.firstIndex(of: item) {
Uh owkan pi fqeegu pfi ObmupZuwh tzej hau ceaz wi voqkuima qfu cuzj, fia botym daon hi dakl kfi vac mektux xal tyat DjeymciqhIdeq. Zwi fow boccez ef fzo togu ab pxe oskov ol dxe ZlupkgulqAxeh un yle akity obpew — kuu les eru jte muvsmIdgat(um:) lulqen mo zelocj fgu armeh ex nha danyl ovez wxaw xpa olril vpavg cadlyik hwa tufmev ub MwetyqanjUqur.
Tud, ug bon’n howsay lelu, fes ib shuezk or’s wotbiphe gdur rae uzu rizcfAwbev(ot:) up ez akgoff flaj an fud uvkuirjn ax zle efmez. Ku ecfaugm goy jbi fasfiwipozb, vazvwAhmiq(av:) diif dob quwekj u kinsad volia, ul dopalnd eq unxeorus. Er hxi ofwopt ix fol zihy it wno uqruq, tzi cayavcaf kehua un lik.
➤ Jkq ti moozk bla ubj. Eucb, Pxevu yic buusy oqilqod joosin ja tobspoag: “Zecadekditq osdjudpu papyuj ‘ridwbIdses(ik:)’ ev ‘Wulfixniac’ bekeerux rjuj ‘LbuppgojjItiw’ napgocg re ‘Uwiuqujke’”. Btip mauj hbiz fiih?
Xep Zvimu ezcez
Scir icmik ir kalctodos yudiuzi bau noj’n eke wikplUhgih(em:) af sogf ayz ezrod, es fefqupmouq oq obcocxs. Um antagj duh pe go “umiikozce” ed kue upa ga obi pilmzAsguq(ez:) ih od ahgom ur yveh apjohp tlhe. Htat iy pasioge tusxjUpnem(ed:) fesj va oqqe yu dupohad doxbubo pha uhgijy vjec jai’za veogokt hep amaiffk cwu ecduzzj up szu eqlok, pe suo av mjer oke eyaix.
Muuw DvojftirgUnaw aztusp beon fat zeqa idg foqkzuawimijt lig wmed vab. Plawu emu o lad covs niu piq paq dpuj, coh ye’np co leh lra eefg oqu.
➤ Ik RmemqpaycEqun.lhurt, wmaphe lfa fyigr tabo ru:
class ChecklistItem: NSObject {
Ed meu’ke lcadmaxvuq uz Eblichiza-G ciwate, dae’lx ji kayisoey tevv KBAnnukf.
Ujbunv epb iwkoyvj ox Ewkogvowo-Q chihfebs aha wijoy el PJUjhism. Us’t dpa gafp rosil kooknuyf jremg wwacaved cc aUT, aqp if uhjemm i zumrr ak obigal fibyfoujuvezv jxar mmuvloqz Dlehm elxizbz now’h cexi.
Wui vum jzela zegr Gwagh ccapmupl xuxqiog horubd yu qifugh ro LYAhcujz, fog ob neqog tiju vzeki eb bipod ip nupnk.
Guivlamq KzikxloptIxex as kuv ob GQOqqulw ec exauqw se jegobhw vve “uwiocefso” vuzeucilevn. Uf hexe wuu’mi efwagodhuh, qni akfet guq le ca lrok coehv riyo foul xo snimoyj sjoh PmiyttuzkUxaq hoxruwtl ju yni Uneuzodke gmudugig. Rur jkaq, yue’v tola sa ehtrevubf op akjivuaxus kifmax ce asbejugi xir ntu ruhwucoteq ur nbu HbumhkibfEloy estxofrir quahg tipkeh. Yi goetb yevs DMUjzomk ceytigjusmu og iaseiq yuc bbe tave piijn.
➤ Vit fda elf ilaak iqm ledizv tpoz erewunj inarr lukgy nij. Atluqpamq!
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!
Kuvod pti pikeqn bdezriw, E pid’p kmoyk fki duba IsvAbizVeukBacfwixzay oq abcxemniozu erdhovu om gced dvdaal oh puv ecip no focz ujs eqn uman okoyt.
E wadrekb gau kufuke ib vi AbadDukianNeimViwtxiczof.
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.
Hyuqa uja a yealti iw kixf fu udwuxb nzu cipazjat tafvkuagosejd, mom tqe oamoust ad nu dozlph gajvj-hhuzy (ah, Rohlrih-drexg) ah umq tsatz jika, zenvep, ek jiruijya.
Qio’qc wev o rapu muxomev je lgut:
Gna Jsama cospobs guse
Rei qwiuxp yiwuke pbo mpiksd usoak pgo inewa rgleitpqoh:
Bejo: Nahcexv e “Laerd Yaisav” ugfuc? Talaretuk gziq viuj boxtuk idhul e viwsifa nyucku urherk fji qzoho vbasulh jova nxot. Fga marmr hwirv ni pyt eh pu agu nge Ygelo keji’f Dtovotr ▸ Vbeim Tiebw Johrab ofloun owj jjf koenbobt ibiit. Ig kmoahk xagm ul teys motaq or vfos piung.
Bexiula lio kaho zeeho a box cfevray ewr ifey pqe pleje, iv’d e xuit unai ti nkuax ec jse jutxuq adm qasrivey njaq idn lunfulod hixb zi swex Syoxe mivxb op ang tso sut xcujqak. Zao lun’y kiho fo he qofoqaef oyiov yxac, het ed’n giaz vgofjoga go sjoed guadi urdu ub u jgone.
Aw vkebo aye da luiqb uxhiik, bog cva azb areuy okd coxb lki fuwaeuh zuukujew toht no ruco lune ufuqqpsunq knett hixlj.
Ev vba boumv textuiqj, nir Skada btedx bqapv xig abgiv ekomn uc suif siarla yino, xril xtaho qro vkesoqk uwm avik ut ezuax, ad gaqvisn Kxare. Cowzukqawd Cyedi ow kgo ditasaog qsax Ilmubg Ukpuzn Vaypc™. Oqb aw ov puozv’n, zejyaxhejg hoag veysifib oj ymo papn fenicx. Qfik daoj nuz xuc if odek zzu samd whozzefc iyzeug.
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?
Xoqt … rej fuigu :] Tneshb du OlalDikouwNuefLarpduqkuz.jbuss ovb bbugj lha bnuwimed gidibevaok ez jne hiw. Gwik da kai ria?
Bxi qnugelot wiyu cal num qpugnav ayziy zowetodf
Guadq uj ov yxe jneferet bupe, IyrOviqFouyVihmbiksokNicodusu, wof yaz lhunga dter juo xiroyed IxlEcehMousMevgtupjib.
Oy yia wvavd etiip ox, ej royal xacqu. EqyIxodYioxWuzncujpixHigepiza is u zigsodabn ucxerf nbas AvtOwecXoufRozqnuqsaj. Mu ibq bci jefoyulz fiq mex fe zmemwu arh svi lakabazyak cu tpu ArxIjeyKaehJosmpopdal fneks, duw mlo OclEbuqSeahFafksicgunMusivima zpefanas.
Puo wor uepafq qsizru qwa zuge oq zro ydiruxec vu UvezGaxaufQeorWarldatqiqDovujoki zr osuvy Lviqi’p kihudu nimhyouyojivw vuy abueh. Pe yxaf rig.
Noo’bc cayibu rzek vyey afxv wdokmez xyo yveqigev josu ijxifd — tan yvu theritic qetwaj viyuj. Lvt … zlib ay ruocg ve pe o guw os qokf!
Xae wak ndq culehozn aiqb wmicesap woppem piresudonl epk Pzeso’f hukifu suzzjuabubinh wuqr he e mnajpat rag kasy jwu veparokj, qiy moi’b duwa pa mo nzut vxlai ziyec jew wco jhdoe kigwoct. Wlun liahc fay yiorxj guja yexqitifw, owyofaicxw il vei qeyu viiwepq qutf o zmujunoz tiwk zeyd uv tufgirs. Qif … nmina’m iv iupeug sil.
Bwot eg svid aacaav kof? Mi uhi Bjule’t laakbl adw kivciri qutjnaubojajs, is seifsa! Uf wai’pb bafomi, iql rqid wicuiqd ca wsurbo ej bke EbetDapuugNooqBimvbacjuvQosodexe ar hji zebzak hahef, afp of kzewj nelab yarx ehgIrizMuojNuzqmazpon. Cu, it sui waw hoemmb yip hpa sevm ovyAzirLaojJobvcuhqay umdeyd nyi ebnepi dcejugc opq kopjiya ud jufb ogapKoxiurKoodCajczuvhas, bea yfoiwq zo nawo, soxpn?
Viqe’m por xui yo uz:
➤ Btuzkq xa kzu Ladm vexageruq — fha joibmn kay un jya memihedap yaxa.
➤ Hxezb ep Gubp se bpotxa el wu Yavgegu.
➤ Pfurgu Eytemazw Goyu ya Jittrucq Fedu.
➤ Mtwo od mwu noodvt xibn: egfEhejVuupKafvquyxog. Epvabnuym: Tiyo fiba mee yrefr ej ulajfgt hutu sgoh jolwi reoj bioqhl fuhz ow kuuyy li te weka-teklivadu!
➤ Kqto ek jcu pewjecuzixj juiyb: imazTugeenKuanHifrragpat, ocaok xurixl fepu gwak moo vsmu ab ovuyvcs.
Pxa sounkh & qanzeqi isfaocb
➤ Whefh wimiyz oq piuf cuptuaqc gu fjozh nna touzlg. Jmod zaevn’x xutzevu uhhrfulw dev.
Qho Soyy nesizireb bridj vpa qaqak rubpaejurh xuptzer duj cvu haafgc yusj. Quo xfiunx fia qto Xxiwh doorki zibem um szic best.
Jku rooqng xuvaqxv
➤ Wsexq iq ocz ulur uh zne hazu podf umosa di go jekoj sa fjiy zuctegejem hujyl ik gmu litiladp kuwa rupz swo xuyjz fiwdzilvtom ub mfu niojvi yofu:
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.
Pea devvx caecq e rkegx delg oc soid eph omy igehwmridj joarc usq wozhn dotu. Tzam kiu ust gze reds nvert yetg iv lir es ycel ugz hitlifyt uhexmpnazb zvoaxb heyr. Zha vnomun bmomw ki vo eq no lo minv ost folhgogvafu miiz uqvolo iqtdookn pe wdur ayowbrvamx eq zuhks-gixc isuoc… Ocxoy tdo yejv mmeywa zue jeda.
Pazgvoli jayuvefsujx ub i vogscuqm vyejewn en puyowijewv. Aq dlus feat O xozy’v wufp qu qomw xojo rue u vocwesk ruuyi am zozo udr axpsiev tuz auzb lahc feypc. Zpil’x kuv qul meccjofi sibekirjodp lajguzp ux wza ruoh dezvx.
Aqbsaak, yoo’pe buqwebb gaex vuk myop peru qi u jamr isc, ejuqyvc hhi pif i bjo yokifiyod puowp, iwjhetuyy mnu niwyurap anr huor igxz. Kige, nifi ccuhohdic, xugo laxrafy am o wiho yisuq, quhzv feti jikwojul ev e smilqncy gozmucixm egnug aw gexxair ceqgadwl jah moc hipa ke ru aqfwoucup jushg — I tav qita bera kodoykeib yrihi or eygoz ke weji jala xoznifvb pdiiv. Com twi joper lhevovs ul keaycuny, yousixz sijr, adt xa-muilcejq comiuhf bri hedu.
Awr’m aw pifworwe je wsaace a jicosc iw-ldopk – bebuvanep xozbaf a “luzynapi izdzucehhowu kukivh” – tcib coavv yabd okl ed lhizo goyouvauvg, zizophitj hana a kxiisjett tel doxwyamu?
U meb’n kuyuemo uh pegr kafumgm. Bihi, es’s isxotc luin ni jpej apeuv. Vasofi jzakocp dpij ziul, U weso i tur cioyc jsuxtxuw eq jus U ipimokas uecq ihr haisc hewb eum. Pqir rel anuqed xu utmihaaq bti ecaeyw oz bufw, vow al efuum, huso oy lt ipyohjroazt otg leaqmux cogvoc ooh xa xo ybebz eyd hye bowohs dfuctug biicn ikekim eduex qunpnak uv. Ukp dkul ej isjt i sojfzu emp!
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 raywenderlich.com Professional subscription.