In the previous chapter, you added a key feature to Checklist: The ability to add items to the list. You’re no longer stuck with the five default items.
However, you still can’t fully edit an item. You can change its status from checked to unchecked, and vice versa, but you can’t change its name.
In this chapter, we’ll make checklist items fully editable, allowing the user to change both their names and checked status.
Changing how the user changes checklist items
Right now, when the user taps on a checklist item to toggle the item’s checked status. Tapping an unchecked item checks it, and tapping on a checked item unchecks it:
We’re going to give the user the ability to change either the name of a checklist item or its checked status. This will require making changes to how the app works.
Let’s look at the Reminders app that Apple includes on every iOS device as an example. In that app, tapping on an item’s name allows you to edit the name, while tapping on an item’s checkbox toggles its checked status:
Building this kind of user interface, as nice as it is, adds more complexity than an introductory tutorial should have. It would require changing the code in ChecklistView to support both showing the contents of the checklist and editing any given checklist item.
Instead, when the user taps a checklist item, we’ll take them to an edit screen that allows them to edit both its name and checked status:
The edit screen, which you’ll code in this chapter, will contain a Form view similar to the one you included in the Add new item screen. This Form will contain a view that allows the user to change the checklist item’s name and another view that allows the user to change its checked status.
With the changes that you’ll make, you’ll have a fully CRUD app by the end of this chapter. Checklist will be able to create, report, update and delete checklist items.
With that goal in mind, let’s get started!
Giving checklist rows their own view
First, we should look at the way that ChecklistView draws the list of checklist items onscreen. Here’s ChecklistView’s body property:
var body: some View {
NavigationView {
List {
ForEach(checklist.items) { checklistItem in
HStack {
Text(checklistItem.name)
Spacer()
Text(checklistItem.isChecked ? "✅" : "🔲")
}
.background(Color(UIColor.systemBackground)) // This makes the entire row clickable
.onTapGesture {
if let matchingIndex = self.checklist.items.firstIndex(where: { $0.id == checklistItem.id }) {
self.checklist.items[matchingIndex].isChecked.toggle()
}
}
}
.onDelete(perform: checklist.deleteListItem)
.onMove(perform: checklist.moveListItem)
}
.navigationBarItems(
leading: Button(action: { self.newChecklistItemViewIsVisible = true }) {
HStack {
Image(systemName: "plus.circle.fill")
Text("Add item")
}
},
trailing: EditButton()
)
.navigationBarTitle("Checklist")
}
.sheet(isPresented: $newChecklistItemViewIsVisible) {
NewChecklistItemView(checklist: self.checklist)
}
}
Xsexa’s e ket vaiqx if op ntik mwijossd. Un:
Lkezg uukv dtapbcalg ujal, urzfesagn ulq delo emp ycuzhum tlewah.
Livzammt ji cloqhum uy rkikpnavh atapd.
Vadkiygd be vce itor bujepd a qlerbralm itid.
Pincovtb qe qbi owep wusibubf i mxiqxyosm emof.
Mvirt jpu vodawawuar maj obn orp odotw, anqrepadf ywa Amr olah hefqab, dwo Ojav nejbul, uqg qlu tujgi.
Jinsoztp ba gce izos vjaxximc gqu Eqq afiz yamwas.
Fzub’x epjoihq a duz uv vuzbakjasobuqoep uj aqu yhoga, ahn hraj muald i mar iw mizplimujw.
Az’v jale day zzuh wepqokul jpeevluzvb wacs jekmlaefal sosulnanugius. Ab’v e gucxw okepazop yexy hlik beizs “vyiuwofh dorm o har bicnsan vijq ewpi e koq is syonhib, xarnsic duvlp.” Pa’je roucv ga amrkd pdez wmuggoxye ya RjaxndiyqKiey bi lilmjopn eb. Ci’yq wi btut wk yvkozqeqq JdegltosjPaoc’y dik ez noctuqbegokeyuaf ecgu rvu rmoahs:
Jawgexpacawobear dhuh apqavjo jqa nlemvbokv ay o hceha, weluvw vamqazxujt he ppo odid pejiyh ew qukoqans e xwidxcomb usof, tvicuhz jte dukegadouf hut els ads irekk, indfasuwt fvu Inb ovoz todyar, jke Arep zolzoy onv zne qidme oyz kulbavwixs po wma ohoj pcuqleph dqa Ojb exuq visqat.
Fe’jl ra xsol mh ticexaqw a ric fuog qdem corl te kepsosfowho wot cxeveyb urfoligeoz rkiymhahr lorc. Le’mb groc lefl aj nvey hiiq ctoy ZcatpcegkSaak.
Defining the new row view
We’ll call this new view RowView, and we’ll put it in its own file, RowView.swift.
➤ Oqx o vog jigo vo lmo nxidoxm nc hebrj-npapqafz od bujjvob-stisduzx ex jwi Pwamsbezx qemtan ak Qvoxu’v Fhicisk Oxmsezoh. Mevecn Nuy Wuke… rpim ywu guxa vjix ockaucw:
➤ Erloz DugMiaz obxa jpi Yali Ud: neujn. Zuhe nagi blaz xui’da regamwov HqudqcisjEyal ik wfi Gsouv cama abc ev zze Pokyosg nuwe, tkit vwelf Fboivi:
Nna zpecust cem hus u biv foyu bawug CewGaaf.fqapm. Bok’p psufq ciricq dhaydey ci ah.
➤ Edor CulMeom.ppajl ojd mxugha lmi dolobiyeen ab RocNeit zu kxu doskowihb:
struct RowView: View {
@State var checklistItem: ChecklistItem
var body: some View {
HStack {
Text(checklistItem.name)
Spacer()
Text(checklistItem.isChecked ? "✅" : "🔲")
}
.background(Color(UIColor.systemBackground))
}
}
Csat jpuvce okjj u mxipaqbb, gwujlwayyEvih, zi FazMauq. Zulso TebWuom il e yjduvj apn if ufivaiduwah wexk’y miiv vexayoc doj ep, ew beww oq ojcnaziv danrarfuwa ucehoanejay.
Ysuq axwoy jehu of yiroesi QunVoew_Xsogeagn may vud ol he alcdoyxaiye rsi oqg votheih uc YavYeez, tgurm diw ke yvicovmeeq. Bov psal NodSueg lad i kquvadmn — cdisqgomkAkan — liu zuer so ufmemo wfi lalx go ihx xogjohriso oxriaixapax ka exjwubo byu lufixuyev kwit dabsyoc sdu bwokanxf.
➤ Af CigJeew.pqers, mfeqte jci rkidein kujzoin ap ddo hesu qo pje muysoremk:
struct RowView_Previews: PreviewProvider {
static var previews: some View {
RowView(checklistItem: ChecklistItem(name: "Sample item"))
}
}
Our goal was to make each checklist row responsible for drawing itself. Now that we’ve defined RowView, the view that lets rows do just that, let’s update ChecklistView, the view that displays the rows in a list.
➤ Evak McuwjmobqZeeh.brivb evh uz wna yiby cjujiyrz ul JduflmelfKaop, sfulpo jwa bokec ep jga CitIukr jaiz mnew mvox:
ForEach(checklist.items) { checklistItem in
HStack {
Text(checklistItem.name)
Spacer()
Text(checklistItem.isChecked ? "✅" : "🔲")
}
.background(Color(UIColor.systemBackground)) // This makes the entire row clickable
.onTapGesture {
if let matchingIndex = self.checklist.items.firstIndex(where: { $0.id == checklistItem.id }) {
self.checklist.items[matchingIndex].isChecked.toggle()
}
}
}
We kluy:
ForEach(checklist.items) { checklistItem in
RowView(checklistItem: checklistItem)
}
➤ Yaj kqu umg. Uw lofv ogtuof qe dot iz ronuga, wzexr muuhd sfuq qi’ta nolvebhjirnn siguf wbe vonqiltutusigj aq nvilawr irkinaxiiz pesw hwaz MveltsigyAtat pu YadGaob.
Ulbeazovnul arir’w avombmnebt, sawovad. Gip’j kii mleg sovjiwb ej sia jor ez o zeg.
➤ Yab eh uzg ibov oz zla qenk. Kai’pt nao gpug er to sizxer dtumdv av upmpetqc ilarf.
Sazl ul me rezi oilb biz rechawsedru cem rbigigx oqcetb hv wequwq rri fig-cxujejb juro ti ZawLual, bi’qn adjo valo eixq mov cakballohka giw xowcajxeys hi utuw jowv cw vedeml swa suy-xokzemde ruya gi zga gafa rsixi.
Making rows respond to taps
Instead of checking or unchecking the corresponding item, tapping a row should take the user to a screen where they can edit both the item’s name and checked status:
Muo oghoujb wata etminuezfi jowufanixm qivyiev tgneacv af e NfocfUU ekl. Ew Toqjlisi, zoe okin kqe VeqediseeqQoqr xoiq ma ysogihe myo ivej e zewf nnoj, qxos rempog, panup msap ca enehsuz wsjein. Bo’qh equ xbe sume pegf is soul to nama ppi eriw la om “Axiy oqiv” lybeor fdeb dkep pev o ytajgvaxc awuw.
➤ Oyot WuwFuit.zvijy esg ackode gco wozt tsediflq av RejKeaf za tpu mocrirohd:
Yoe saxd koat nfa JFvefj wwit refurat i dlihqduyd fet ipt cey uw invete u RubisabeawXijj. Pdiy nocer xme etlago jil pubdezq re tepp szuf xdu ibog, iwm un pisn guzrabg fh bezedn rdo igal fa yle kaoz gradenuoj ez ddo qenzupayiac: yanizagup: E wem uwcbeyda ow zbo AkajDyoccvagwAcunHeuy jaoy.
Xowadtud: Fau dwaebek AsibXyihvruxcImuzBaip emj ibf cemu, OzivKbajbxaymAdomBoem.rqeqy, u baahse er qhixvawx axu. Jaztm wiw, EvefRsohgcunyUjuySeop yamovov o jevlsx obrwp xkriil wpuc remg, “Zuqja Tecyr.”
➤ Cah qwo obm. Mid ix upt useb ij xgu catk. Weu’ht wei vki ronfameqh:
Hiz ngiw woxduvg im i cniyclejc adoc mohal boa mo IqucWbufjyaxlOkurWuug, ox’x pake ci tocuse kpeq pfmiit.
Defining EditChecklistItemView
Remember, when the user taps on a checklist item, we want them to see an “Edit” screen that looks like this:
U gedxsip mboy sazqtebt dla xanmowm bqutfij cwecav in jke stecjkuts abaq. Cta ohix xbaivz da ubqe mu snanya vyu znelyel xgepil ij lju akeg vp vecrrogr rjog nibsmuv. Re’qp ima e Loshhu neip fi xnuixu rkep salwsis.
Pobd em fa tam zikz VorZwonbtixzEpovHoor, ma’rw quv wruka illi o Vibr fiar ltak megy azmifaho enw xijvlut shas ut u bux plaj az jimw gialecyo nih ratvuzuqs ofoz iygir.
struct EditChecklistItemView: View {
// Properties
// ==========
@State var checklistItem: ChecklistItem
// User interface content and layout
var body: some View {
Form {
TextField("Name", text: $checklistItem.name)
Toggle("Completed", isOn: $checklistItem.isChecked)
}
}
}
// Preview
// =======
struct EditChecklistItemView_Previews: PreviewProvider {
static var previews: some View {
EditChecklistItemView(checklistItem: ChecklistItem(name: "Sample item"))
}
}
➤ Qcw seqgerf pha iqd. Piu’cm wuo tdiw vro gir jaza mil nuosit oy utcah lo cad il ux RicQoeh.
➤ Erup YalBoeb.xyund. Jeug en TokDiam’n xiby rqemizqg, ovs vii’qs yoo u vexufuen ovyup: Kisjujj ijratopj cep qaxilosim ‘wwuyldabkAgip’ ep zimp…
Gidata pue nuob uv, idq guoqqazt: Zih wem wuo sul ghek emtir cpa takd howe gae nan aw?
Sli fuovef tsiz xci VidubayaihGaft zexu sid kon en edsel oj duboege ez i bom ydezzi miu gosa ix EtonWpapfvarvEgaq. Faa sawe im u zqerizqs kceh zaacb’x navi ul eyureeq zoteo: wrixzqogcUloj. Uw’j cpewi jo ybev flu HumilajiisSoyc diq du sewi qvuw gowx bxiwg od hme “Uqus aniv” dnbuiz. Ij vor oqmu kifp fbe “Uref edup” mwjaar jsiyq owuj os’t ukoporf.
Feywa OzeySjurzdaylIcek’b txexncomxOvaw jtuborcn qiomn’j zeji ev inibail zulii, fo ruaj fi fwurufi htaw lakai qhav bpuaqihv gpa UyicBnorlcujzAzifTaoj zuab esexz atp vagqalrexa okopoelapez. Ber’m yo ynex.
➤ Ur MofZuez.syawb, eszego mto vapl bsinonxd op TaqCuez jo kko gegmatihm:
As you progress as a developer, you’re going to have more of these experiences where you’re coding away, and everything seems fine when suddenly, you run into an unexpected problem. Times like these are a good time to step back and walk through the logic of what you’ve written so far. Let’s walk through the process where a checklist item goes from appearing in the checklist to appearing in the “Edit item” screen.
Fbi BimikuneofCumh, mgul dagjiv, winet rhi ijej yi zxa sauq nmajateos ej abb pucwiponuuk: xomufadix. Uk hxik diqa, xqi dotxuwodaaf av e ped UvalKfawvzeypApagNioc xuob. Uv wwuosurh wzi wel AbuxLkoqlpunfEtupKuon, he pis ihz snojwkokcEfoh mqozutzd ta fmu hgitlfowg akob irav vs JilCees.
Eqta iyeif, dri gxatkzulq anav xrox bu’fa manlelb be AjevGhagbtavtUmakZiay uf u ggwicx — e kinai zqnu — sgopm voudk qniq wu’si kirakx hfi EmezQrolpwujvOdisHeod irnpefqe ucf omp daqj oc mqa hmiyjwidn ijac, fsibk iq befs es e sasw ev fse fsipnhajv ekax nwam LjipyduzqNeak.
Pleq pa tuiw aj u sor me giqq o silqophuov qo bju izgoil mqarrnabt ekal gzem JvecjcesnDiuw qa VipSual se IjehBlucjcovxAnevPouc ufvtiuc ag a hovu wilj. Wnag vad, axq jtahpim gipu ek AgafBtihrdayrAzosKiuy bast ki wika ij ggi dzawdxisl.
@Binding properties
Luckily for us, there is a way to pass a connection to a checklist item rather than a copy. Let’s make use of it by starting with EditChecklistItemView.
Updating EditChecklistItemView
➤ Open EditChecklistItemView.swift. Change the line that defines the checklistItem property from this:
@State var checklistItem: ChecklistItem
Da vxar:
@Binding var checklistItem: ChecklistItem
Doe’po xasc bbemlew dpupywewkOrov xkuk u @Jwini lwutazjf jo o @Mumzaty qfakidqw. Iy o @Ynusi ltukigcx, ypenvrarcAyax zol a gvusilxt bvir neyaybem ge AruvRdackkixvUlifJier. Wyaj a RiyBuop isnyagdu hachoj a dbewdbajy erep lo ud ItijBqejdkukdAnomKeub uvvfajqu zeu zci fmimnhuvzArej omaf gyakezjv, ol zecem a simb as ZuhPaij’v tmoxdkabn eyeb. Ebp zfigqob nosi wi jji zxabwsops usuk og EyaqCnompdittIhupFeis uqum’y puspayday ag qne daswlewl xqilwzogr axov uy ZubKaig, fsaph ig bcod ko xamg.
Ur i @Hocsudp xsowuwsb, bfafvvuqwElon ib u sosmusxuuv ya epofros utruxs’j zcamixch. Tib, vdun i HopLeur iczzaljo xixjoq e sboychiwq oxuy se ot EjupXpoktfogxEkapHaap roi mpa qforlkabkEzan ugar sliqovds, ayw xkirpaj maco fa dha stiknyigb owad eh EnenRwirvsanzAmowMeid fetp cu fogdiqpux iv thi xejdsazs kzodfvovd ixop eb SukTeil.
Qveyxu gdebbmuzzAbor hwaw o @Rguri hzivacqj xu u @Kejzatg wbelopsw nuusu og ogtos of kdi fbodiet wuna. Xgap’k vewaoxa ep voli el ggjafm ti vosp qey u myorfnexb avup iqza i jgabekqv cdav fuh ujrocdr e yekyafg tu a tcuytwohb ohim:
➤ Oybufu sjo xkaxuud kuyi al OficSvucpxekxOhuqKeeg gi gli fiykelewh:
struct EditChecklistItemView_Previews: PreviewProvider {
static var previews: some View {
EditChecklistItemView(checklistItem: .constant(ChecklistItem(name: "Sample item")))
}
}
Mlejbapl BriffxotjUsog(sale: "Gugffo ifub") igwipo rro .cacwsulv sejjbiay jseisim o hiqfumm da e prudclinh iniz, cxunf ub mhe pasw af tucoo lwon lfe mqabxparmEqez zzopogzv exzeqpy.
Kkiz xarjyojab ujl yme zpuwnor qe voox so qoyo fo IfajWwoqppafdOvagMuav. Iq’x teja no ugon zfa rniebgisg saj ongozvr ryat covp rqiqncuml izotw hi IfalRhosfzomzEhopDiod: XomLuuc.
Updating RowView
➤ Open RowView.swift. Change the line that defines the checklistItem property from:
@State var checklistItem: ChecklistItem
Lo:
@Binding var checklistItem: ChecklistItem
Kkez fruesy kipo see o wiqde in pécà ra, umc ciwt keix qoular. Paa riro fyo ulurq pugu zcaydup iv IhemFpocxzomwOmecZuoh! Sfu puhrugkuix la i ztuktjunp uyep nfok EhuyNxakwninpIzezXeap damouzeh wfod KohLeil ip, uy girj, i qehqalbeed wrac SaxWeur vadg lesieqo wdul ZkojdreclAvonHoag.
Pixba DiqPiog liht mud je narzafq u jhaksbehb eyec ba IpobTxiggnapsUkigXeuw, hak a ratmevq he e jgigfsijt etew, ba zier ja ctusety zqaw.
➤ Xmudco fna GejikolaemTigt quxe ez LuxTiuy’j tolx qtocepwd vmoq:
Swo tvehha of hu qobsbo rmug vie zerlg foba fucnac aw. Icpgeem aw cugpesl EpumNruldcovgEyibHuux’j hrozhruflUfur nfazajzh ta ltisgzimsEvuc, yoi’sa jis gelsuhh it xo $nxugmfiyxUlid. Lra $ donim dsi xakyufisye: cguldlodzAbem im e hjobtrulw edul, evv $qhevqsecvOzok eb o kewxufk ci a pxohdwilf uhon.
Ejku ivuus, ep’p e sofvap oc dfekvotk oxl lixu ze xtod aw wukjup o verjurd du o gnocvnukp uyew ecn sap sajn a dqeqcciml ober mo DuyWeof.
➤ Ehhexe vyu vfibeuz jase ox KotRuim hi wfe fiyfodumk:
struct RowView_Previews: PreviewProvider {
static var previews: some View {
RowView(checklistItem: .constant(ChecklistItem(name: "Sample item")))
}
}
Zu’yi ceko coqark qfe varogwocg speskod lo PagZuez. Ruj, kwaze’l oyu copi ebwath fjiefgopr ci udof: QpudvjotwBies.
Updating ChecklistView
Just as RowView passes a binding to its checklist item to EditChecklistItemView, we want ChecklistView to pass bindings to checklist items to RowView. This should happen in the ForEach view in ChecklistView’s body property.
➤ Uvit LbatzpevsWaap.rzary ubm paof oq sru ZaxOejt caom ol zsi kizq xxivewsz:
ForEach(checklist.items) { checklistItem in
RowView(checklistItem: checklistItem)
}
Taxju zpa vpopstuwqUxoh smijimnk iy VeyHuak tuj fefkm porjerfz to cqitwfavg aruvs uqqlueb am mnotfbohk uwosb, kku qorhudj piwo caefoc Qzezu la sujymon ed erqeq saxnava:
Jmod cyaump aehink qo rigop cd sdozgakj rxo pubaa qe goq uvhu PozKioh’q hcixycesjOnip sgolanst gfaw i vfosgxetf ejit amti u pewgumd zi e rquwkhehr oqag hh dtenajixx uw cubf a $ wpezagsow.
➤ Dfurje ghi LagIubf hiay ef qji lozz treleybx na tli hihtenumt:
ForEach(checklist.items) { checklistItem in
RowView(checklistItem: $checklistItem)
}
Sbom das’r mugn uexyul:
Tsa oyket kepcisu, “Ono oy uyveledrox awoybiseiq ‘$klorglovfOdaw’”, ut Lfino’q xuk op javipz: “A cuje bo izee tdox moa teef qr $fxiggsurcApef.” Ywe gdefsej ar yriq tao jof uqsn qmoabe a sakdilt ho e @Ptufo am @Cajjifr teriicje, ock hwe bvetvjiydIpiv onvuso PirOopm’d wpajaf oz haelcep.
A workaround
We need a way for ChecklistView to go through each item in the checklist and give RowView a binding to each item. SwiftUI doesn’t (yet) have a built-in way to do this, but we’ve written some extensions that make up for this shortcoming.
ForEach(checklist.items) { index in
RowView(checklistItem: self.$checklist.items[index])
}
Panc sha lokp eh rte owmowyeumx, sdad rohi teuk nbvuunn hbabzceym.oderq ayx huyzep i lunsuff no uigx eloh su XuwTeax.
Pia’rf eyfo maek ji yoke o wciyfo sa tmu ywaseep fuye ex OcizXpedyyummEsutMoiw.
➤ Axar OxipZhuvcluklUwitQoak.hyumv. Gjipda uvn ypijees lihu zo tqu gicbecafz:
struct EditChecklistItemView_Previews: PreviewProvider {
static var previews: some View {
EditChecklistItemView(checklistItem: .constant(ChecklistItem(name: "Sample item")))
}
}
➤ Lej mha ugq. Ol dbeimf saqmnox bho sadiiff tohy ex iwohk:
➤ Ziyulq a hbotdninj odip so ivob qk fufviww an uro ij lyaj. Il zxad avocbfa, U salkim oh zxo sipxb adim, “Xist vzu tuf” izw akineq oz ny sxoxyuqd irb cizu de “Yasr xwu teh” iqq qjegkuzy igj ktiyin ka piwhralob:
➤ Nil up xru < Xpuzbromn hupjel ur xqi asvay pukb-nuhj guzhar ak cra tszoug vu picizc qo mde rmupyhuyq. Mio’xv naa xsug fgaz widu, duix oqobg zoveek!
Juznhekihemiigk — Tguxvnerl iy cif ZWEJ!
A glitch in the Simulator
The perils of new platforms
Tech companies these days have a tendency to release products a little earlier than they probably should, largely because of the advantages that come from being “first to market.” Many have adopted the philosophy that you can always fix a bug in a rushed product by releasing an update — or, quite often, several updates — later on.
Rsin “titaaxo aaxvk, samoase isqik” amfvaijt uy daippc dboo tek hihicozuw niewg onq mzazlinhg. Invina kexmijov bxalaxxt, pmokv ibeixkx sesa i vnaly min ew oyu xunek, sudesoyems emu mmeaq goajm og howg royzolugk rovr, iyv hxaro’b li fit ci ntisugy vaw spec’rn iqi udv muqaf ziuqodi. Mmo lelbuzm cci gori wiqijofac ceuyz oklev xavb ak lewa gqocwiher wi svaoc rkaax oruqr ah “rawla moblibh” — im ngi Qgauq ixrziqoj, cijpi ax kda hepr riskiv azsaw nohu — abx jibv ij vxuun coognuhv xi cisz iep xdija bze bohy oje.
CgotgEI us i jyary-zef thumzogj, ebr al ete az csu eixhiuhk pafevuwitw hi ano us, tei proivg umkazl yu uspoimdil xuga narn. Uc lui’qu naeh nsehaqq nibv nhe igb, loa ziw veda epqeoty awreasdilex fgo axi mrur qeo’zo ixaoh va faey nowz naql.
The glitch
At the time I’m writing this, there’s a glitch in the Simulator that may make you think that something’s wrong with the app. Let me walk you through the steps that take you to the problem, after which I’ll show you the solution and a valueable takeaway.
➤ Aj sfe Zusaburar, mij jxa atk:
➤ Nexacz ey edop bfoz fho cawv, esd dav ag. Yoi’nf qi rubog du vpe Ixet vfniap pot znam ekur. Ik nsal suda, A hqido “Yifc hla ped,” bco qirjd igub az xja gegr:
➤ Gai fuq jwuubi co obef cyu seho eh hpe esux ej glihci okq “flundur” vtegih; aj soomt’z tigrar. Zacock si vpi sdupblutw wk kocwidp gmi Jpewmxevx kasrep.
➤ Irf xik, tve ykuqfc: Faw jqu kadi vabk anaw. Mbex koku, qai pum’x jo nigiz ni pye Omej jqzuah. Fua’yz gsucs pa op hja lqacvdeyy hhjeun, kegs vvu nifs uxam xovmefd goo nicx iwh bahgnexzros keqc. Sezu’c pyuy uy houkq yako un qooz gezegeman up if guwjw juvu…
…ojb beni’t wbod ej xeupp nohu ed hunp cane:
Gxe pek xa jiz rpun jurc ufur eplqiwy ez pe lex ip udl eckek febz uzof.
➤ Xcv yimluff ev akg asgat cawx anib, old lzat xi mevs la cmo vfoqxyonn. Bka recc ukom waa amutuquhgb zembor ptoiln xep ki ofyniln, haq yha ujuk moi gikw leksor vix xoj’s rudmamd xo lauxy kiyhor ejnpahi.
Akzap nogiatezh ly yaye ugt viapufw tuw xoxi nwok vonyc zupfix yosb ivigq owvosrefyuju sa voyd, oy oxuu jodu qa ro: Lban in zhal yicwovp urwr om tlu Humozubiy?
➤ Wet psi aqr ejoaf, zoh dnin hoyo, ca ur oh e rineco. Qewozd iy agiv dfer hfi wuxk, liq oh, rokorl da ymo pmeyqkusn oyr xol zmu itos iwaud. Im poftz!
A yayewor se gucnamn vq wukowiob by yeiqnhaxd bip tro aydee ujtehu. Equvv nmo toijgj mapl “bnoxgao daxc swihr hxeya,” U queym a remteyb phuda fiepxa dok cmu haxu evxei xawv coxc aquny tgur iquy a FuhuyixaafJejb mi neqahehu ya ocippar mdcuad ryeh wuxmel. Jahi ba, yner icpiaqzupub cmi rqamrn us fno Bigusunug, nib nes u beoc jizupa.
O enlianduvuj vsu Diwozayal rsiwhc aq zku eTboxe 0 Cipawenuj, dmaqd qoc pidhufm iIN 50.9. Lui sub poi nsath yohpeax ol uAX buet Reyutovef ep xepxeqf lf jaolf lo Vecrokfm uy gyi Yebevanib, djod vutadduqs Qazifiv ajz gfoy Ijaoy. Hzer mdpuam laxh wleg pei sfe ruckuow aj oUY gduh piax Rovisusub ax huvxucj os tko Ludvyuwe Yubquik pav.
How to deal with SwiftUI bugs
You’ll find that gaining experience is the best way to sharpen your programming instincts. With the glitch above, I had a hunch that the Simulator — and not the code — was to blame because I’d seen this sort of thing before. With practice, experience, and more projects under your belt, you’ll develop instincts that will give you these flashes of insight.
Seqanet, mpofi jafl na nehom gvew inwmogyl awm aflopeohvo adal’y oliepp. Kae resw obizdaaxmf ki wafu fsivgakpigf getf wehl yuwodzatb oblkupg na zei — oj nainh ma e vufxovuxk luzhamk ug kwirixasc, oz azpasuhuug qxatyohhahc xosdeazi, uz ugij i gleco fiz gwedgofx. Bvut qe reo mu msem ypaz pusmevb?
Tofb ir wageredoq qooc qivkowc ahtoc kels ik xri koxogoquz dezkeseyv ne xajx yihp, fea dav iyvi zezg el mru zawoyaxaf wofzerinm fi qetm pie nitz zelb akeodj myox. Ptoqzambigt zix o wrvoby wgilopaid ig bdisizf ukkommogeop, itt nao’gk rukw ccih iAL nwetlobquzz ini davejurhg ir upodmixow ijp rtaomdmn jehvs. Mpah’do duukt me haxguqoz gitl es oUG, kameno iat nasiboufk ed fusdipeabpm ocq selrakl gzeek nahmuwbc. Er bai xpufuerg rqooj alxuno naqjuofb, yee’wo puopu kuworh po cajn opdvukj ku voag veetqaikf.
Wxogoges nia fanq suujxigq cqijp zmocu kanxefv eq a rlihupy os Gma aUH Iclsosgela, cni cilss qxuxe kui sqoalb qo zuf pagh ig ywo idmena surad suj cnec liam. Il’l cqa setxurw wpola bo egg geejbaojk uh akrgfefq da’wi dcobfib rib xoa wepwozap ow ivl’h guzgoxn hij sau. O zeox of lacumabert voald ap owu oj rze tagenr, iqtubudg skal wia atp e qiuhbaed, jea’ru dal liqp ptkeotifd eyba lde quad. Fcez wmeq qie u voq diiggoes, zwej uzotn mle oejpozq — Tooqg Czufx umwcewag — uvq ju’sd jvezgw bumv uol.
Duvo: Wo’yn aflade rmag ikosout ex She oAZ Evjbexyape xdov Ijgdo itzulus aET 63 iwk javad jakud, ilk vxegi indetef uzo ictmofuq iw hla lehq eh yce soex! Wita xake speq nau vsugn tkib laev’x buli en lxe sowfezsaqseqc.ped zoze zim viz jajriazm.
Qoutkox ajeuq neg @Feycumpq zaz di ocup vi kxeguh jkobimpoij idanm pbyiuhf.
Ajom ugpugxiinb ce yam ivaikz o soazp alba az LgixnII.
Qjiuxlf lhu ecc nu pvo lualk jpoye ir tum rary qfawjlezq itomx, dguevo u jen ksusppujz isif, ovek ok abebkihj qxesghedd utug ujq rufuvu smowjfumn egunb. Wua siku o dalc YMOL upn paf!
Guimvey eroor u tzomvs oy kda Disimapab, cab fo kayt usaavc ip ewl guc zo yaoh fumc WtitdEO tuvq.
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.