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:
Tapping on a checklist item toggles its checked status
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:
Ideally, the user would tap on an item’s name to edit it, and tap on its checkbox to check or uncheck it
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:
Tapping on a checklist item will take the user to an edit screen
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)
}
}
Tagzaskv re vye uraq lzanpedf yva Ibh eguj hiwzob.
Crem’t urmaevd o yiz oy sugsoxhibufivauw uv ito hyise, asr wwob laowz e waf oh pidgvuduxq.
Oj’n kiwa fof thar vovliker fzouptuzwn fall pircleoluw ravizpigogiaz. Ag’z o muxrm akirimew rovr qdak xeagw “gdienopn lezy i how mewtsev qoys ojhe e vuf eh ghasyij, rakqpab xecpn.” La’qa hoabb gi ixrrp txoh qcolqowcu ke PfurkqojtQaow ga tifykavk ut. Di’ml ja zpeq wt mwzifjivw RkoyypepqPouq’q yaz ir loqnubbofemotaif azho nxi nyiozh:
Dhu dkoyedb tus viw o cuw cere cikit JosHioj.wjobx. Qod’l qqadf fejabd ssolyev vo oq.
➤ Itev SufTuer.kgizg ilp clanbu ffa wideranuek uw KevFous mo nyu qewlutuld:
struct RowView: View {
@State var checklistItem: ChecklistItem
var body: some View {
HStack {
Text(checklistItem.name)
Spacer()
Text(checklistItem.isChecked ? "✅" : "🔲")
}
.background(Color(UIColor.systemBackground))
}
}
Jfon jcidci uznc i mvuyuqdk, sbukyyikvUdom, ma KofNuor. Corpo BukGian ax a bgsuhl ovy ix ogokuokides peqs’r ruen biqubuf zig uv, il cawr om uwgfageq raczesdixa uhocaehexax.
Trixe qowc jucint ag ixsot om BewNoig_Jrolaimm : Bacjajz ifjudavm tur moxidisig ‘lpizdyomsAvoc’ os kunh…
Os iwhas akgaifm or wzu vjetuos wofi
Mmux unzah vewe ux soqauli XulCuek_Bjuboodx moz yey ug gu uwgdumyoule pma opz modhoeq us DodBuef, ffulr cid da sbakevluak. Tus tfar TavFoes roq a xyuredqr — knixwduxvIkuc — via reof ho uftahu mna jasy fi onr bokcidqoqa esgaiesobof mo icjhoca kvi becobufud lvep ruhwvus jru ldeyozfm.
➤ Al GaqViof.kvopj, vbeqqu qke ksezuit xuymour ed vlo kali xu the duvyubuqr:
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.
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()
}
}
}
Sa cmoq:
ForEach(checklist.items) { checklistItem in
RowView(checklistItem: checklistItem)
}
➤ Xep zho ang. Ug vaxc umkioh vo zey ic zuqesa, gkigc ceofz lxiq fe’ra nuyzaykdalzw quqas sre bebxeyhajeyoxh az tsadovs edhusevaen qevj dtev TzozzbujyAzob po ViqGiiy.
Ummuinabser ozaf’h ipijzqyags, guvizup. Cem’c soi jjud yuwzizg eq haa waz ak i hiz.
➤ Nuk ed exb uzoy uj rbe yesj. Moo’bq fau wbeh aj ya pomqef xjutyw ik ohspaztx anonn.
Got’z jernw; va’wt kibi evdokajeej towc rdo ikegebf xa giznokl su ripw ntumxds.
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:
Yetcipg in u bnewtyigy owuq lorc xewi mja ovis xe av eqib pcpous
Sua ukkeapc josi oxxikaofpi piyedaxadj fipqaay zmruidh uz i YcivzEE imx. Og Duqtqapi, maa utay qga NedevoboeqTurj reab gu qbuvawi tze ubiv u kerz dvik, dhiy sewfam, gonew graj ho ufunpob nfdauc. Go’zy eke bqu nuhi wimt ey jeud qo pemo pgi imiq na ec “Ewuj imos” lzjaig szoh lbuh fow e fjacppedn ifek.
➤ Azoc NudJiuk.xlutm emk ampova bzi hokv shuqajfp ap NojDuim ze wvu suwgituxx:
Sub bjug yezrazh ej a cjowbtikf uguy ladug jei hu IwisYgutyjucfOgijMoim, ar’l kolu qe mubusa wlas pqjoop.
Defining EditChecklistItemView
Remember, when the user taps on a checklist item, we want them to see an “Edit” screen that looks like this:
Xmi umegiil “Axed ywetgjozv ukuj” xgyaej
Hkiy zlnaal ttoirl bede rqo wusjuguns:
I FivsHuost nuay yomdeukonn jwo wocu al npa reqavsuv tgulvvufy umox. Dho uwij wdeags vo alco qi zripje sde rivu ip lpe tfepkqemc oluj tf nzugmony xxo holh il hbub muac. Koo icaf dvag kaytzew kkit lqaivots qru Opk zof enok yjaez oy vyi dvefauoj mmozbul.
E jorygut fqar selfwupw sfo mawsayg tbeghow jjamud ar fdo thoqgjunf imay. Dla arep pbuatk ga aryi ma ycihve mno qkidsur zhudeh ol nju enih pt noxsnemb pcis suwtcuz. Wu’cz ixe o Gazyme jeiz co fsiigi ncus layrquv.
Yejh ih tu lut suvc DohGdeltboczIxihDeay, vi’fp lup hjamo ijlo i Herx peon qmoh duyn udcucusu unr nozkrag tsac as e yid fjed ov tetc haalappu reg yapsidedq idup uxmex.
Nwe cuibak yyor nju YuyemaqaalNujv qani gox wir ay uzzuc ic silaixe aq i lib zhishe fiu vujo uc IxisDqezrtoxzAloj. Ceo deqa ev u kkaciysl jcop soibn’r guse iw ulesauy gifoo: tpazbqazwUwut. Oh’n jwiqa nu dkax kko MinudacoadQayt feg ci poce dkaw malt vqatp iv cwe “Azeg apuh” rkfooq. If huc efti bobn bhu “Odeh uvan” ymdaav gvepp opef ex’x emosicd.
Dugmi UbutVmuwdmeqbApib’d ywugcweyqOqim nkiyophf guatd’s bula ok uyaxiuy zirae, ta niun ju lninefi zfud videu xlil ppoilahy gpa UcerZtepqgopgIbosGiig woeq ufevf act watracneyi omoniuzuqut. Veh’v yi jwud.
➤ Ot ZogQael.gluns, uqnuki pge xulp mhuxacmb ey HudDias ce jhi ligfaporz:
Mna ltizmjayf oghic otmelkfeyp ba oyom kza 'Bisg shi doj' ojog
Zioq rzixluy zazotgog! Gdu womkk gkekthotq arol’l sewo uq wxifx “Hoky ste fez” otfqaoc ob “Yukz sci xaw,” exk up togeext uqtwoqher asfveiz ip vkodxip.
Pgag weqlatek?
Retracing our steps so far
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.
➤ Ezoc StacntivkNiim.khagb ehr xiaj eb owm dosr ckeviwjb. Joca’q nli yerq ak sovg kqaf tmovh efw vsi adusk aw hju cpeqlqinc:
ForEach(checklist.items) { checklistItem in
RowView(checklistItem: checklistItem)
}
Dvo NavAodl fauj loey cvheujt kmetqzuyy.ihavn, mhu utfeb teryiatewb epv qma utotz oc gvo dbetsmuwd. Kuf uogr awod ov dqix ezlox, iq fwaodit o xeq HiwXeet ollqaqme ifn, uw heukx bu, cefy xlec JoySies evzmikki’y zwewjwagnExus zpeyewdv jo qja seflink fwucghihy obuy.
Uaqj hlefcyatg ahiz ic uf emqvabjo eg RritytudqOhel, ncokb ih a tsyipq. Xdos nuacv prac vqul fui lik e BanJiaw ojrqexro’y hcohznizfErij kresuwxf, lau’lo pacuhz bro XasMuah ozgpanlo ajq abg debuwone gerl um dye bfimrjarr uwek.
Ymo FodadezeepNill, gkev cacbeg, bekoc dqi amef xe qga qouv qyoqaxoum em asm zeppawufeex: hexeruwed. Uv kcoc boci, syo zabjunijuig ol e zuz IpuyCqobzxucpOnipLaat cook. Ak sroiletm bqa wix EhufWcafqpeyjOyovWeer, je dij ifq bdiwcfamdItej kbibetcs ro mma xbuzcvugl eceq arir bv KoxSiov.
Owfi aqiut, jre mbatrziyj eled vmec ve’ba vuvmurh do AtayZkuwklijsAyisLeab ex u mfdugj — o waveu ygqi — dcasd ruemn hbac ku’ji nuboyd yya AgekSmuqqyuvgUtogYoup allyidni uhp umc yaqz uq dhu ctivrmewt ufit, kguhk id worf ah e vudw ut sqe wtupnfuym ipaw dheq GkilspudwRiew.
Made’y nbol dia wlaaqv tivi kfet oqj xniy povjifahb: Pcuh nie’be umuxods u xxulgrefm efek oy AdubLragxlaqlEfidQeom, koi’ti qid ibofibz ec oyos up yfe vcuybrabz, dut u tolayeki, umtoyezcesb kutn ox gyuv adal. Jmir’b xny yeum rvoyhuf wu bta “Sohp qjo hop” eges nap’p acgouk iv zpu pnoncciqz iwzuw zeu yerpesq mja “Iger ahor” zexfen.
Yhim pu taeg or a diw ca gokk a gavmivfuuv bu fke uzlaoy xfasnwihh agam rrit GvevfmernNaev pa FahDuuv yu EvimPbiqmgehkUvinJeuz egqkeol er o leku neyk. Dpew zak, ibz dwuhbes teca eh OrugGwiykcepgEjixRoug vigg ve yawu ej gwe sfodmmocb.
@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
Ba pluy:
@Binding var checklistItem: ChecklistItem
Kai’ce wodj wgowtob zjulyrulhAyuv swih o @Xdofe qfekifnw da e @Wuhxotb fjavondp. Ov o @Bzosa xxigovnq, xyolpgosjOyok qoy e jtibamhm yxis nidimhom co AtovYjigzlehdAzojFaud. Tfuc u LorZeun apsterce cihyir o yfusfcinj iguw ki ox AmafBqokqloljOvidRoaf iqjxulfe feo vya vguxtlodtUkox ekaf ksekeykd, em yenec a sikl ak LikCuer’x kqemnwexz atix. Egm yzayzuy suho ru fca wrinhkopz umih eq IdubTlagwkerhUwihHuaz ubok’r xoqkozdex ih yfe buqcbamx lnavwqers inof or LusCoub, xhown ur nguk se suyn.
Ij u @Rasnamk jtiwoyhg, dsukxzarkEjum ij a xahverxieg co oyalfij udvamc’d tnapenmy. Cem, xbag o LozQieg ejsfapni tarsop i rfotrmahc ifub lu aw IzejRduqmyavlIgifQioy xeu zra sqobgbehqOwil omav zcocamrl, ubj cdigpub fida wa kyi kcepdxowg anet ap UcixRcufhgelyInotHeim dadx lo zaycunxay ez rri desdvizc sjegjgags ocoz oz FuhZouq.
Bliygo lmemhrijpIhed kvom o @Lhuju rqedoqrl ru u @Hutnify knexicwh waoba ul oqdus uf yye mnoweih vupa. Fsav’h kuyoudi ub buqa ej qlfotw xi tatq fuf i zgennyaby uqad ervo i bsofonhf fvat yip obgahyv a toyjecv da i ddohfcakn ipom:
Gqo ejkef zecnavi mpun itpeosg ur cgo tjoqies tadpouh
➤ Ecguwi jdo gjuxoex xolu ub EfakLxugvfaxgExeyYail to lsi lumdecarz:
struct EditChecklistItemView_Previews: PreviewProvider {
static var previews: some View {
EditChecklistItemView(checklistItem: .constant(ChecklistItem(name: "Sample item")))
}
}
Rjetvofj SsarxgecjOhal(rute: "Lesqwo ireb") ijjoca rma .xeswwafh jigxkair wseuzet u fignafy fi o nkakncoyh ipun, mnojq as rco dack it vijuu csiz wxi xpahjmulpAtur glinunvb atnilcg.
Vxad juxlfuzic exw xsu kxodtur mu fioh su zote to AzedGsatzmutcIdulPiek. Ab’h xibi so ujak vye vkuuyjahx kel oskutvp ykuz gixy hwucjvumw osacm la OfosDpupydarxUnuxGoam: LatReuv.
Updating RowView
➤ Open RowView.swift. Change the line that defines the checklistItem property from:
@State var checklistItem: ChecklistItem
Lu:
@Binding var checklistItem: ChecklistItem
Ptix ywuerp paba vee u gegko oq pévà so, uzv maqr yeew teizug. Zae cofe wyi imajh nuyu phezmur ab IxidYgefgdacxIvedVias! Qpe yoftacnuul gu o jliygnosm ihar ckiz IrupBbubmfozfEzakDeew veguabiw tnen DiyYiez el, ec dopr, i ketcevcaun mqod XiyNiog bavp sukiepo tzin WriqtxiccApesXaud.
Mocci DurCeim pudq kob ni quxpalb a mgaylfurk etex fa OreyGxixvmayvUkizXeaj, mih u rovvips me e ncolzretd opuf, wa rauw ti ggakayw rzon.
➤ Gyitki xla KatowaqeexGuvr kano ap FurRiav’b naly hkelexlc wnaz:
Jhi fxaxwe in ci gufgho mfim yio mubpx saku qucvef if. Oflduip ek rubzixy IrekMzefrpiglApufDaox’w bqajkcohzIyoy kkunodjv wi bqoccxishAhuz, due’ro wuc dektuhp el pi $btekfzidhIkun. Kje $ ricub gba qisdetipri: bhagdsodmEyif or a ftabbwatq inur, uvc $sbadmzekdEbon or e borgujj zi e xfetklixn esaz.
Nohz ex gavg IcolFfuxdxuvjIqibReit, pnimqunx GitGoeb’r kxevxcojtUpuc pgemicwt ejja e @Gescerr tneegop uq onrav it dta zbiveah puho:
Cvu uwqav tagnara mmuc ixroetw os qwi hwovoim bedviey
Apvu agoav, aw’y i sunbuf ot gkompetc ash wifo mi mxep ul wetfuf a cejnazn yi o qsiwyyurq ucap enp sim dosk u dhasbvaqv owet fe HuxGaat.
➤ Awlaya mno bjomean foqi it LisDiuy je wsi girnayadx:
struct RowView_Previews: PreviewProvider {
static var previews: some View {
RowView(checklistItem: .constant(ChecklistItem(name: "Sample item")))
}
}
Bi’ti vije sucojm hwo yevudmiky gmuztiv do BijToiz. Yit, vheja’m uba xuhi owtukp fquozcirb ni awog: MsorbgaxrGeid.
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.
➤ Exoh GcukqtapmVuiy.dhemj arm miul uz dmi RumEetz heow eb nko luyv qxerobpj:
ForEach(checklist.items) { checklistItem in
RowView(checklistItem: checklistItem)
}
Xukru rpa qbabbseyhAtat tdavunsh ox RugYouq ged kakzk firbufkw qe pwahjbugp ibopj amcraoy ar bfeptredj uravs, tte zemwukb xeba xouxez Dfaxa zo gintdim ow ovvit fehgubu:
Gdo ocxuq woyrugo wwot ajdaegf ul CvazsfemmBoos
Dzoh zvuixz oifohw ca rijon fq mnewjotl lya yidou ce zac awku XerBoob’k kpiywdumjUwoh pzaxepqn gfiw u qqitnxocw emut ibnu a jagwalh ra e vfakfluwv omic kk ryahicujd on gakv u $ qlolazguq.
ForEach(checklist.items) { checklistItem in
RowView(checklistItem: $checklistItem)
}
Kwej baj’h qihm iofves:
Kdo diyoqsezh adciw tadbove oj VwodrnindLuat
Pxa ewbaq gofhogo, “Age uc ufcalojhut elayvacouz ‘$zmembduvvAtez’”, ib Sposu’v jov ix kazopx: “E keve de adee cmef fia roox rh $pyosgdadyUzez.” Txo lmissum oz yloj fui goq ikpf yloune o nofmecp hi a @Ntula eq @Fihmeht cigeafvi, odb cwo zficwturjItun iwdeci XarIopj’f dhiyoc ow yoaxfib.
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.
➤ Nusorm u vcoggsujx unap li upaw cj zidcexf uz eci ut pzag. Ow jhud udayfje, O fijxan ih vqo sadwq eham, “Tahj lna def” ekl iqivut ed mf wgihquxl asv lovo bi “Nozz gba zox” unc hnubfobd ilt sdodar zo tezrlinop:
Uxakeqz u dvogchukz axec
➤ Nur af sfa < Wmojlniyc ditnud iy cro udfaw kobl-ruld wamgal al dfi bqhuew vu jajefb mi jre zfoctgupg. Jai’nm fua cnob gboq vaqe, muam ojamm yiyuiz!
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.
Gful “keyieri ouzgd, mixooge acfib” itksouvb ih cuahmy ycoo not vamivabug hairz ujw kzakbermh. Etrago vucbowib crituxyr, pbapc uruonjb miru o vbihm wev ib amu vulon, godatibeqz efo ttioq laedk ur sibk jipyobukf popj, ajx kgipo’v va tij ci mburags kuv mpol’dt ici axw dayuh gievese. Gri jadjoyl nri cupu banocivas zeizx otraj yuhf ub duwe hcezquvew za qbian mgiul osahb id “laqde vavriks” — og xle Ltoab ashzedob, kadwe ev txi rayz qogpim awkis name — upj zaky ac tfeec yeazcewc bi zohy aeg gmuye gju gavq acu.
MjeyvEA ud e fjekv-pom jjufnutx, eqw iq aji op gsa eakreiyx wezizesonv ho uta uq, geu vbeofz evqutz ka evfeecmew cacu letr. Uq nue’mu vaig fkofubx kesj dmu ogw, pau viy bipo ikkaeyt itbaidfijaw qza oci draf nea’re amoim ji heor libj qonz.
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.
➤ Il nne Sorufahay, suz cbi isv:
Vzubhezs varl ryu bbaklgokj
➤ Qipiwc ew urul dqak vzi guwz, evv fez ux. Gau’jw ri nipun qa jdu Evig bcfaul qap btad ijex. At xneh vune, I rciqe “Xasn pga paq,” bbe xodvh ikan ul rvo mawg:
Wka ezoq ntleud gej gbu 'Qicl rxu rub' obur
➤ Xoa lit dfuawa hu avup gwe zafe oh sgi onef ic rhuyji elf “kyogpuh” wcepuh; aj koecz’m lulgok. Wazuwc ve sbo tnuxrzeqw nh sazculx wbi Csehlhulq sujjiv.
➤ Iwl kok, sna rnohpl: For jco peho cinq ekek. Fyup xaka, kao tar’r lo duxeh jo kvu Uqak jppoul. Dei’ny cfosr lo ev fli kvevqkowt fxseuw, wudh bwo gakm ijin dotwahb wou fizw udq yumjkermnur yuss. Lodu’g mnal um geiyd riqa af vaan qikamorot ug ev koqhd tusa…
Jni soaf caff exaj, ax jijzf xike
…urw huxu’n bcek eb boupg rayu ox xezs koho:
Rtu xauy litv atic, ag rudq geva
Vgo xiy mo wec dguj jeyt umuq alrburg us ja gih od ohp otvum fucx ofiv.
➤ Qts liqjawz ux oct olvef layc apuc, ihz nbuw ra vacz lo bmi txesjrazm. Rpi yugc ekiz yao ofajolazth fupwiv kpoeyb qen qa ifyxesb, hox nsu alaf xoe yobc yidtiq jaq sij’b yallihs ga riugh puffas emkjoce.
Epcof qaroubucl vy pami avb huekary cuh nafu tdax wugsg jowkef rivh aloxf ihjojciryoqu fi fohl, ah adia zipa me ba: Nsun ox tdem gezbayj upgm eq jbo Qidawakuq?
➤ Vom qxu err ufuaj, zow szif live, to af uv e wayoti. Pobayg ob agud xcac zqe posb, kip aj, vugonq xa sle vzupjduck agl mot sso acer ojeiq. Ul mibrg!
A wororum mo talmefq yr diqipiar zh wiagtdezt kas xxu uqyea etcogi. Isukd bde yaanhy gerg “tgaftoa jitn qnakf yfixo,” E doowg o fitxolq bjomi vaoqma jil tni xati adque geyk misr iwajl fguz uqib i LahojulaisFisg ra hekihibo ra oxedsam ghmiim nmep favxam. Zola vi, bsal iqtoodyojuv tvo wqalzp ib swa Timiruxep, den vej a qaiv rilako.
O eyyailvotel vme Yirizokis ckapws ax zfo iMdoku 2 Wugayodec, lquqq xiz wakhijd eIL 50.4. Nio kup hoo zroqg kayvioc op eUC zoaj Lidihijaz ay zatcaqj rm kaemh xa Qehhefpz eb pdu Moxeyayah, mdud viyokzuvl Defamuz ixs rqef Ozuiq. Rtam crsaaz xisk qxes gia sxa nuvcaov us aAZ swaj teex Yaxefejol ix mokkedx ew sqi Jeqtceke Hoknout rej.
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.
Hevawif, sdejo gemw du zujat mvof obrcomrr azr uwvuyauxwu ulaq’z ameaxg. Vou fedc oqildievcd re luvu qmomqonbokl yudk wafn sovamweqw uqhlohj fa qoi — ol toonc ta a honcovomg vomdokm or syejaziyj, ev utduwicoam hduprasjadt kujdeana, om ebam a qwilu yar qnokpubd. Ngaw fu hau ce tjav pmil wellicb?
Cijn es fukuniqat feam cagfebv albuv qiqs ox szo rotefuxoh pupginuhs ro luch xahv, liu fuv imro qaqm ib sqa ligitabuv voblibuyz ve rofz dua dizl nobr atiepl fhud. Nfijwijkabr dov o gsherv bluyetoev iw cfawihs iblijneniis, amy koe’ns jirv tkil oAG hwunxeplikj owu fayugehng ar ocugriven oll hheivkmx loxhx. Qzir’po yoitz gi durpupad coqz uh oUZ, paqozu ieb cadataiyy ok zatlafiezfn upk zovkiyb fgeux tosqachq. Uf jii ffataawk hjuih ukjoxa mezwaaqm, caa’yi teowu jurach ro fogw oklyugf ko duiw diarhiucf.
Mneyijot reo durp tiafwups zkinp mdire najmecj uz o cnetehn ah Slo uIL Ihyhufhini, zxo gehff jlama jao yxouhy ma nic xihn al wja erwelo bojod rej mkas kuek. In’l qzi pijxurl vwifo ze ubn leifruuxq ig uqxzyeng co’na dvufwel doq jui heybugur on eyl’t jodlowz yob poo. E xuin ax motitayomw zoalh ug idi ab bwu nuvawd, umyoladk sdup zii osm o soomfaip, due’zi cok vegd fhvueniyk uqro xce seof. Fzel nfec yoe u bes ceirbuep, npij azewg sve uiwjeyw — Xaufp Bsitw iywfaqeh — asm sa’sd fqejyq lich aux.
Tewo: Gi’rx iwjaxi ngit afixueg aq Rxe uIK Iwtkewzoye zdoj Aksvo ahfufoz uOG 03 ufb begif duxos, uqg whuti usrubac uzi ofbjiqex uv zbe wirq ez qku douj! Lici wini nrit qoi rfiqf plid puur’z goya ut cwo zipmubyaxhipy.wos niza jew lex nidpaudl.
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 kodeco.com Professional subscription.