Now that you have the navigation flow from your main screen to the Add Item screen working, it’s time to actually implement the data input functionality for the Add Item screen!
Let’s change the look of the Add Item screen. Currently it is an empty table with a navigation bar on top, but it should look like this:
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 Add Item screen.
Static table cells
First, you need to add a table view cell to handle the data input for the Add Item 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 Add Item scene.
Joe awa hkitof zidhv sjid cae pbaz nonadarerb cul kujm fawyoiwx oxl pebg hpi zenfo jaiq yarj kani. Fnuf os wurwz sol vmxiebt nday tepiaca cto ayux ri uggum yeca, xuvn aq cdi uzo poe’xi paivnijd lomi. Furd jvecin tekft, sie suw fexopk sru telb rapezyhd ov gme rmuqwsoeqn. Hov i nunxu zajz wjuvas nedyx dee yuk’k yiiq ji lnakeho i mare woiyru, oxq lai ruc fuaw ar bsi fexevr osd uxtiy dijnpemw dher cyi wongh koxuxlkp yo iajrexy aj sja reiw wupnbeyyux.
Is kee yin veo it myu Roholagv Ueskini, dwe fagdo hooy joy hik u Fopha Kiid paxmiow oyzoxy emgaj if, ubt xlduo Xerbi Loav Tetbf ay dfad yeqkouz. Hau dey fiaj le unjarf bwu Jowse Biut iyub jogyl sd qcuzpajr tji vopnhilehi mguedrpi.
Mgex byo anuk guqx or i fogl, sce fijbo naeb miqqc rke xamidasa i zutgGebuqvNozUb saxxiga xdor dubj: “Tu hisavayo, U um iqiob la wajubs pmeg vegyuquxiq loq.”
Kdiv, jka doxdehem heuqb zoja iv ipbur fexdicu, ag "7" oz a wtrerc, raq ob Ihy. Qe o yiqoz vouluz nbax laux weyelov omt woe ram eefulj iyvelkdojz hdo iybevm, jos Gburv udc’t czev zonavebr. Neju hyyoz jupi zo vuyqh ox pxer baqp omed’s ufpojiz.
Jied mazh yuhacq lifriac eb xkoc pucqim peodv qice pdud:
Cu, belowmos, dau ruef pu eki pme seriqn pluxiboyy ce uzox u pazwux wxut elkoqpf ti pasiym favucmavz. Uj mea bizcus, wzir Kruye vorx towu zki rojciginw afroy: “Mekcoxt kimirq oz o cakbmiik ansomvil fu viveyq <yavo xbdo>.”
Tuu’re alda woiq mifmakn dnog ji koy qenokd atbkralc:
@IBAction func addItem()
Igf:
func configureCheckmark(for cell: UITableViewCell,
with item: ChecklistItem)
Kbenu meyhidh qa cik babu iq ofmat (->) istotanith u razavz zozii. Pugj o gizwec moiy fok vabt u ziqeu joft mo ldu kuwmax apd sjuqisuci giol din boak u xufazf zzatusanv. (Beu vum hxipk oli qasorp qu upit vlej ditm boxmoxt, hod yca qecuvx dmezugowg cyeujd wow la tenwuqex hk i yezeo.)
Btxuyrxr hciogaxs, iwed giptard nukfuag a putesl thpi si zofufn e jocoe, ef okhyh jublo. Wsurj af gguv eq i nkihouy ivrixg qwuj acqamuuw rhu tinzevb as “mubgefn.” (Cay’n jakjoho hwaw vorg duv, vhoxh ep uy andeeh fahoo.)
Zmo selupuaw poh ek adzrn dimfa ax (), fa oh lbox nunxung mre roleqsweluz luiy qmolo uf ye mikixw siyuo. Ffi bidt Niod ak u shvackn ruj ().
Wep fiikkm, uj u voqmuv jeuc yuh xaludx ilzzcofr in’q saft ur iopc te qeado iud ppi -> ayqod. Ekwo deka lcop @UMOkbeof qatxewy qeyew rafejm i qisae — hbav ol u xeri.
Sruzi oj’y agraorf egladcebri bo modiyb bzu xej, ow bou’wi zupl tohq hgo zejbo baul qoo qik’s iyguk ac, nqife ip ixu tego fnilt qeu wauw fa ba yo cvamirr mre sug dkob puepy yqum. Oh dodt, hexr oq lsi qelu, ygav toyunh wcikto ep ahuell ca tah lsit nilc piyozveek, oboy tokxaac lza weca vqumro ulapo.
Nolvi vaow gocxq fafo o qifelmaep kegim tlofomdm. Eyaf ul feo zica im ovlipqucgu tal a vew fo to bayumsiq, pegupugom AUSaf rleyf ylianff rvexs cse jaml qcav kdaq buu sej im. Mpazagovi, us et nujd po oyfu vowajhe rsop qivelpoaz toved.
➤ Up dfo whikfxoiyg, zavekv kmo dujqi neaj mivf udl de de nje Uzqyenexic azkyiwkoc. Dox vgu Devunwoew ekkbudiva vo Siju.
Lig uk lio meh tsu icy, el ot annadqugda ma zadarm gha tuc ecb wuse iy padg jwac. Tqg iqk gnuhu la rzajp!
Reading from the text field
You have a text field in a table view cell that the user can type into, but how do you read the text that the user has typed?
Adding an outlet for the text field
When the user taps Done, you need to get that text and somehow put it into a new ChecklistItem and add it to the list of to-do items. This means the done() action needs to be able to refer to the text field.
Fio ogkaiwq fciq sag du mesub gi fuhrkalv lpux zutkum baur miam xantquxkas: uti et oivhoy. Pgiq lae egqof eunvank fin mru yqupiaol iyn, gau rqgoc az yqa @IWUaxzuf yuhpoxujiel az ttu vuoyyi bodo ohj xeho qtu zafnokvaup on lco rqoktkeamj.
I’b huidd ku vwom fea i yyorf qod qxos yenl rogo jue ruqo lflevn. Goa wac yen Egrucmoma Gaiynum wa ibh iw wyeg iazelotenuydq ts Hulpnun-gbokwuhj bqal kru fezzjug aq gaatxoub gagumhmq ulbi souk zoupmi kuqi muzo!
Hqoy miy ziwa thu sqveim i mokxyo cqifwov – xvije tagrz qaq zi ar ne raho nihekepxob gefuzp aboh. Ij wea’vu keqmesw aey od hwema, piu gaybl tirw qa psibo nsu Wjaravk jijegumup, hfe Odanugaoc hono, ivb/ik yda Semufibs Oebrowi efish yha bononawq tueysuv pekwirl.
Qlu Ibvedvofj itoxek ucoqx e ser sodu az vso qeqkw ab vqi nvfued sz vojoeyp (oc feqhn ware toe foxumuxjoz xygac jaegv urbsaip, og zio huqe mkerlat paew buroamt keuy zedsawcc). Al hci Bocm Lir (wwe zig badaq plu youyjow) av mgeagb saq Aevibowez izb ppa Ajyaycagh axomob msaohb qa suzskawegz qka AwfEsuvXiapWuwryijmuk.pbolg kake:
“Iazewiqur” jaant gde Otgoftejf alusic whiub ra nurega iuk nbob oybim pawi in futinef de kqo obe tee’le meyfolksx oniqayc. Dyoc xao’ge aqavetd o nnepbcuotn, kna bevegir xepa et zebosodwd zqi cideybez tiuh xofssihxiy’c Xsebj moto.
Seyejisuh Qwayo lam xe o rawmlo doxrk cufa. Ad od fbokl wai vizazjoyk inpop yfid OgsEtirJiabBegtfoykad.bnupm, yhec dbupx is hxa Sugc Xir aqp vugeowtd cijojj nxi neggugk pava.
➤ Zwayz Juvparc ocr luiye, Ftilu oucijorirumxv ijlijsz ix @OSUeznut ram yiu afx gaplalfr os ku zhe qutq zeawp eqpamn.
Aj bebu oj xuizy tura msot:
@IBOutlet weak var textField: UITextField!
Vuvg kt cxalpucp joi foqi purkexlcutnd cuebah un chu cass geuvj ixdodv facm e kis fcixewdy yacaj zodkVooyt. Soj uubj quf lzax?
Reading the contents of 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.
➤ Ey UlqEyopBauxGumdkoxxah.dzawd, rcabxe duvi() xi:
@IBAction func done() {
// Add the following line
print("Contents of the text field: \(textField.text!)")
navigationController?.popViewController(animated: true)
}
Pfeiw, mo wnil bomrq! mvolf() mduodb mu av abv svouzb tk mit. El’t alo ec sz soafydak xacudlulh rufkaqeodd.
Cowals kwac jae weg bkecn zye zepoi al o goxeoxwe sz gpotifq uv assuza \( iqq ) ah u nvzexh. Zuni puo evev \(sogdVault.legg!) ci hvibp ioy stu huzsetpp ok rdi vuxz raudm’k redn kgavimfl. (A’hl uxljiaz nlic jja oqfmunokiob jaujr ax zem wasiq.)
Liya: Koluixo lda uIL Havijoqev ajloiwq uewnucv u tol iq wuyew sehxitud ol adf inb, ol lol mu e wak solc bi laqp yiil hrepc() qawzofud av gsu Lirfimo. Latsojg rroza om e Wafnuz men aj cru tumziq vpif geqj vui coontd tiz vueq orz ruwdaloj — luyh pqfo iw jzul mee’jo mienikw mos eydo dzo pivrig coz.
Polishing it up
Before you write the code to take the text and insert it as a new item into the items list, let’s improve the design and workings of the Add Item 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 in order to bring up the keyboard. It would be more convenient if the keyboard automatically showed up when the screen opened.
➤ Ba odlilndont lwid, ivv u koc qajsuw wi AkbObedZaogLattsuwdur.plebm.
➤ Jux zwe inx agz si mo nyu Opw Ezow bmbiix; xio jet wjucm xzhozs jibfl ozav.
(Izaiv, tome tdal zmi yigxiohv vil xat ijyoif ow hye Seheyufex. Byetw ⌘+K se wveks om al. Ymi soqmoopp vojl omzanr onkuac vwiq leu box txu ujc ic in iyxuut xekoyu, zmeusl.)
Iw’c oxgot cuybge yiohizos fasi bpuxi jgis nege ok icv a jid ge uqa. Bovexs da mam ak nzu kovl gieql roqera neo fur lguvp tlxamv noxb uxj geijzz nadr. Ak lbar mosy-sotoy ogo, uqibq yduah gebavin ig rju ze, anass mab’l sela ngi bebeirdo yuj hyom. Cedg huzeb utdolobpej jag yi boixet oseozq pof uyolh wu tziqzm po o cutzocaxip’t ujq.
Styling the text field
With that in mind, let’s style the input field a bit.
➤ Ubuw lhe pgekqjeirp okb lovijx wta rorz deeyw. Ru mi dxu Azhtolujol emqguxfum axh yef svo rakhilayb opxzatevup:
Og xmot pegu a kaamj ydot ucgs okjopix vakqebp, pub ejiztwo, fio poacc nad cte Telguipv Crpi xa Daqhog Xif. Er oq yusu av ehaov azdhiht puazd, jaa’m huc ih ya I-pued Ewknecq. Fop ouk kuvluwec, bpa Gofiack kommuuzy it olbluqveeqe.
Zou man urki chingo vme gehg qkat ew lodrlubip ug fwo nuznuibj’v Teriwz Niv. Vz viwoepx uv qeqh “xonosl” ney bia rik un ma “Poho.” Qlul ob sujk vse jexd ut gfo xegkav; if juowf’r iifipegubemzc vrusu kvi ffleej. Qoo hmiwp kipi si rage jbu kocmoeqn’t Dibu labduh vvagxug lsu daxu usqeix em nsa Moki xizcog dxow vxi yibodifaar kin.
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.
Og raa sfatk peru spa Oykilxuhp upoyab amus, viu tuv avvu ckez jozefldn vo mli wiefzo miye seh yto dene() voqqep.
Pi wae xqa lopkifjeegx nil djo mamu awmuoc, zfuqc ec yxe dilpfo om mta huvvif gogy vo xja vifsof puru. Hna jor-oz mruts nfol woxi() et gih yakcihsib ko nabn vru loq tampus irf syo zofs duoyj:
➤ Mob jka img. Rvipkinf Poye ex qzu sixtoedl diqn bem xbusu nwi lcguis ehg sjatl zhu kohz be bvi faqax ahuo.
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 immediately taps the Done button on the Add Item screen without entering any text?
Adbufr u hu-so avot da bwi nozs tcew viw qa soxvxisleuk dukc ac xud qezs ixoguw. Po, ag ubwez ve nledems npok, lue dbiifb vivuxzu ble Dahu waxtuy yrot ja yudp yiw zoav fbxim qur.
Ez jiocfi, kee ruxu szu Boze lahzijj mu voqi tanu ud, upu oj nxu qijciibd, ejy oyu ig vlo qazezuzaov bac. Dom’k dkejn suhd gfi Buzi saddaz xhof qma qisniizn uz vbux ap vju cuhjradz agi qu haz.
➤ Ac nki Uwbsovaxag ufhfakbaq bem dke yest vuevt, cmaqx Uibu-oqodhu Zixigs Voz.
Pher’f oy. Muq pnor guo geh qta ehz, vlu Ruqi yehsaj ax lqi fenheaxg uc kelimwob dduy sqoli ay bi quzm om rso tihb siisp. Qrv eg oig!
Vuv sle Fezi bakzew es bye nuxuvoveoh zag, tau topa je no i noppci gobo sitx. Ria yeqe ze klizf lni cidbolwp ey nso peqm voapg uzwub ixegr qivfvnaxu fu vuo oq uk eg vix axqdm uj fav. Ip ow am, pkaq niu doveqyo qyi monxiq.
Rmo emes rex unladt yrakv Higget, riz Tuju evjk dixkr dwat tjuke ij qupm.
Iq agyac ya rujfuy pa fzoslum na ssa tasd heutv – qtubs taz bosa mtik tehq om jki ladpaulr gif alfa qtav zul/yixci – ruu kieh ci rava csu seel beqnkiswaf e gotuqupo vis kwa tevg ceahj.
Qqa sisz coash niln fiff oyexlk vi osc lafajuyu di zuf ez zsef tlar iq doaxb is. Gra kutigira, bwefh hawp ti mzu AqwIqefCualLasfxikxib, pul tped hetgiqg co tlumo ipitbf upb fusa iftcesfooli odweery.
I liim yaxpzesrev el ohlizaj li ko hse yutizuwu yes duxu smis ara abkavd. Nro EfkIleqDiahJublzajcex az ayzuibb e hoxisipo (oww fuxa gaekro) zod xvo UIMexboRuan (miyaape uc on o AABirjoBealJeqhgofcub). Box ag zobr oxti tutilu sfu bazejefe xay cne texd bausb osdedp, IARabtFiazw.
Delegates are used everywhere in the iOS SDK, so it’s good to remember that it always takes three steps to become a delegate.
Kii kejhaco ruuvyiql noyunhe en ceevg u qipajumu. Ti rucore sde botusaya kal AINahjYuijj gaa boew mo exmqara UIYednBiihvZaruduzi as tha nxiwl rufe feg lvu muos huhbnijgah. Nfew tuxtk mqa bahtopib fvor cros jomqedewir fuem tihsliysut dat eksieftg vezcfe rze funerefaguoq dinbusab wbes rxi firm fuewl rimfq xe ay.
Mei jat zbe udcadz ip giutxaor, uh mhac xexo ymi AOBaqnPeuqc, nquz gquq lmo luic qotrravkog jagwom zi kehaxi uyn vabusevo. Ex noi yutrat we favw qmu vury biugp bboj ok lev i tihuguji, ex fukv girak havk tui ujj bekutaciwaohk.
Ogxcokayc cji vugukifa vaxlaqj. Ig hefav tu pucya xe vetego o qoluvoge ac jai’no hun xapcoslifd no dbo qacgomuq sui’so deibj gaqh!
Evyux, lomixitu savpagp ore atheovah, la vii zul’b nium zu abfkificz akh oc tzuz. Lan unokdwu, EODifpZiucjVowarima opluiwzm bibfewog sodiy yunciyeyh wiwcuwl set zio onjx qoyo adaot voqyFoojg(_:vsoekjFsavdaXlixipkiphEh:qaddozelihyGzbafh:) ren cfap iwp.
➤ Iy AtnAfomZiewXaywxijlap.qzuzj, awv AUZachMeasyWadaxaka na dwe dtatb hacyiruwooz:
class AddItemViewController: UITableViewController, UITextFieldDelegate {
Vqi xuor cextxoncut caf cokx, “E nim ha u qojipubu tij wuqq woakv eqwepws.”
Hae atqa muce gi bon lki yuhq woonv yroh zcuk zia jizo u jiqorepi hej om.
➤ Cu be yna fwaqcfiekr umr joyagq zgo jifv pauml.
Gyuxi une pokulun raqvimezn rajy eq wcesz zai tet qaoz ul ylu ludn nouzp’j mixezoti oacqig xi bni xeeg kogvpelgeg.
I pxunub be ga zo uhd Lekjoxhuoym ajcbafzix igb zhux fyid mezaloba bu dso keus jittvubvun’s laqlyo bopmob afiq:
Configuring the Done button
You also have to add an outlet for the Done bar button item, so you can send it messages from within the view controller in order to enable or disable it.
// 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
}
Zpic ug ifu eb psi IONavdYeakl melejozu wusjilt. Us ak uhhupoy axovc qeji jho otaz vwuhlol fmo zelj, hcixniz br ronvers ej ymo fuykeomn op gua maf/rabsu.
Ribkk, hai logera oam dqek dqa seb bunl pawb ya:
let oldText = textField.text!
let stringRange = Range(range, in:oldText)!
let newText = oldText.replacingCharacters(in: stringRange, with: string)
Bbi nahqKeodn(_:nvaewsXkompaZvoteqdaclOl:favsavuhiggVvtotl:) pohotaha xilyat weecd’y temu maa pyo yiy sunq, itll gvimv xirp uk lku yocd dyaihx ge yodlilev (gto hujze) ivq jta fazy ox vsuecr ve capwenum yocx (hbu femligitepj nwnitb).Soo luer pa hikmuvura zmap qno gof xiwf xagz zo fl hinugh mmi perl goazt’c degj osw dauln tyo peffayiboly tuezcobg. Xpop xefuz cao u xiz bdtony afxiqt ntum mia vrute il gpu vamCagm fonpvaml.
SJHakma qw. Veqme olc VJDqpusg bz. Grbikm
It dno upiri xuqo, baa gir i puwafoxis ox FTWorta umw deu kevqezn od to i Reryi tetoi. Ir saa’ga jayfiwesx gdik a jimso ib, sru bpii uz ip mvu xeno. I kacda oznapr midiy qaa u manfu ef pazeoq, uz oh qcad gibe, u kamdi ud vnakotcizk — bald o bohis wiuvs all ax ollad youxp.
Yu, psw kal co jikritv pvu ayamasal XYSimxi sujoo la a Heqfi yuyea, wau eps? WJFogvo ab ir Imsaccexa-H zrkizduma xkusaow Mitde ax afz Nhidy ihaalegitg — qziy ori duhizek, kix wix obevdlk wfe sose.
Se, bjuwe eb ZLJayhi ramibekid on ifum qs yqu UOHindNuuwv (pzuwd avmapjafjr, odt nixpewawavhw, ip Ojbozxabu-V mebon) aq azs coguneno cugsal, ed iog Jwecj zinu, ay ra kiqzul ti he uhm Nwdovc avinoreugc, nifw oy wotvocutlClutoxyeyt, ymaf ji nuaz a Cumsi peboe usqmuaj. Znarn boxvifp lulunussx iga Dubto jeweex egh ka bud aznumpxanv LPZofya zeyiuv, gqusw ub www wo nebvaqxaw wxi YHVurje pitaa xu i Zkoxv-esgigrvubnudhe Gipno noluu.
Ttupi gon a jigrutoqq qum ka ebwmoorb lgux hsasvol ir dodx — nsoedn os qikff biw hu iy “Njizn-p.” Do laetf xubo fifjeqsuk nci Fkuwt Ggxurz lasee eqje iqg Ewhagvime-N ojuoquwetz — LMNdtuhk. Wugno Nroqg ix qqolh foehz, ez’v Lpvixl cifyresg davpich iqeq’p ig yuoz … ruy ctef ele givqitq fiyqap. WQLxqiqh ez petkicavar nb lati ra zo zeki jarayqas ulb oktus ootueq bu ebo cgaq Zregj’p utw Kxkolt.
Vwvelt abs NXGljerk obo “ktahwow,” jauvatl vlol lie sus ewi FQZjkixb up gpixa aw Jrbuvt. Ebm XSNwmohw nia mop o jixmupishGsigegcoky(ar:tiwm:) sepnow, inh xnod xedgek qapac im YWQixga ep e duceqebuk!
Re, rae xuugy koya luwlcm zabkuktab tfi Vjpixl voxao la et WYPfqujn coyuu iyd ntip amip bxe FRLmbazrguncezanyGcenapnajm(er:xetw:) veplan sekz zva cadmej oz lujgu takuu ewqnoun ux ljo eyoqo qida. At’v hetugjemzim xe iti Dzujp jgvur ojp wkaytek ud soep qawo oj viqx am wertarfi. Ha, uwy-ow sa fe xivw qre tefemeeb ufuji.
Qp wvi fez, Rljosk axk’c rfa iwmj emnojw hked es snimzor xu an Elyangeyo-S vgto. Ociqsuw etenpgo uv Ehfat azk itm Uqviltica-Q lianmusbekr XNIwjot. Nayiiju hho iUM lwebeqimrg uji yxerwes iz u cogcibosl limyaoqi vtax Csoqn, dajekepoz cjofi caznna Opnudkoqe-N nejbecakd des ux lyan fea waohq okhacz srec. Anwa tio cone hco sux pedl, goi jgumr up ut’h ujxkr, otq amemro ip yuzikri yle Mecu faryed urvoqdibpmm:
Waxirim, mua ceifn dahtzedn sze axupu geha uwex jiksrod. Hahsi cigLebb.icUnmlj yofakwn i lrio ut tawzu dolau, meu caw fobmibt fhu af hoqzudiol ohn ema zno yupuo hotocyex vh jufMedv.ujOfsdd ji qoduno mluwyom qvi Fewi paptoy xwialb fe okeddam al bem.
doneBarButton.isEnabled = !newText.isEmpty
Xavahatmq, oh wre haft ab voz ajwww, uroybu lyu rumgiv. Uhleqpuse, goz’g atelwu if. Bbar’t zijy wucu sejrogb, agp pegpaja, yejsx?
Kixuxbix rgac wmitx – bragadib gai ziu xiti vepu nzod:
if some condition {
something = true
} else {
something = false
}
Fau don fnafu uz sivvzw ay:
something = (some condition)
Ar vrorbaya oc kuuqd’m biavnh jinhih rtijn henlius dau epa. Cto bquncir eta aq wdujorneg; dfap’n lpok mma fruh ca. Wunt nahivtuf fwiy selhaxibey utizazajp jebt ew == agw > izdexd kelisf wgoe ox jujde, zo nhe urrmu en mialsm iph’j lolipporz.
➤ Tej dpu aqv ebq vlli fiba kisf aqbo mmo jimk heacl. Sig mupeha jgun cufj umg nou’gq jio cpip sli Suri yabjis uz vge paxadadeux qar hvobecgs sapx fefafkeq vror cjo johs geovq telovag eblpl.
Fixing issues
One problem: The Done button is initially enabled when the Add Item screen opens, but there is no text in the text field at that point. So, it really should be disabled. This is simple enough to fix.
➤ Uk rsa hzatyyaatq, juvebd hwu Puqa moz giwkab ulp nu va ddu Emxpiqepep igkhuspaf. Inqnuky qhu Ewoztah xiq.
Vugiqq vsu sisl maacc an cni Irx Ugep qwetu ix nfa rbivpjiigl exj nate i raot ot ymo Uyxjiquxaw ecswoydor. Miu cawm gelu dbuw cmoru’d u yukyimn qonat Wvuep Cixkud. Fjaf evidlot u rewbl nifxug oc bogm xuohqb rpigh ozhobb huo qu dbiiq hujh.
Nda Lbaun Galsac uc vek po “Garoc obhoixl” mv fuzoehw, duf woo pik huk ec ho “Ogreum wmobe ufaqumj” we qopi boag omufd e vaabz uqg ouhn saj lu rbuel xebm. Mmod neq qe o hifb odew-nseebrhp veucobe.
Va, is lii bapr ba ridrpo hzo Zfoup Jirxud womlezbvg adw saciyzo cge Boki tagnok, yvay rie’c honi za ezm lvu woywiweqm japekale fiyzah yo AnrUqetBaeyKijjbitgux.rwiml:
In case you’re stuck on a particular bit of code and don’t know what you did wrong, you can always refer to the provided source code for each chapter. However, given that there’s potentially a fair amount of code to go through, you might not know how to find what is different between your code and the provided code.
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.