In Chapter 5, “Intro to Controls: Text & Image” you learned how to use two of the most commonly used controls: Text and Image, with also a brief look at Label, which combines both controls into one.
In this chapter, you’ll learn more about other commonly-used controls for user input, such as TextField, Button and Stepper and more, as well as the power of refactoring.
A Simple Registration Form
The Welcome to Kuchi screen you implemented in Chapter 5 was good to get you started with Text and Image, and to get your feet wet with modifiers. Now, you’re going to add some interactivity to the app by implementing a simple form to ask the user to enter her name.
The starter project for this chapter is nearly identical to the final one from Chapter 5 — that’s right, you’ll start from where you left off. The only difference is that you’ll find some new files included needed to get your work done for this chapter.
If you don’t want to keep working on your own copy, and prefer to use this chapter’s starter project, you can skip to the A bit of refactoring below right away.
If you, on the other hand, prefer to keep working on your own copy of the project borrowed from the previous chapter, you need to manually add to both iOS and macOS targets the additional files needed in this chapter from the starter project:
Shared/Profile/Profile.swift
Shared/Profile/Settings.swift
Shared/Profile/UserManager.swift
To do so, it’s better if you just add the Shared/Profile folder, so that Xcode can create the Profile group, and automatically add all files in it contained without any extra step. To do so:
In the Project navigator right click on the Shared group.
Choose Add files to “Kuchi” in the dropdown menu.
Make sure that both iOS and macOS targets are selected.
Make sure that the Copy items if needed is enabled.
Select the Profile folder from this chapter’s starter project, and then click Add.
Adding the Profile group
You will use these new files later in this chapter — but feel free to take a look.
A Bit of Refactoring
Often, you’ll need to refactor your work to make it more reusable and to minimize the amount of code you write for each view. This is a pattern that’s used frequently and often recommended by Apple.
Cha muw lefosgpetoom miax cia xohh wo hoibkewr gavb gifo wnu feni culvnqooff epina or tta bancehe vuig jua kyaemod iw Wqityog 1. Xebo’m rqo kippn rudi nlezi gohoskinaqy naxz jige uc zadlk. Meo lairl josksm vamf movo dcad vda habmiqa qoac onp jafcu ej, riz vjad’s kis rigt xioyusgo igr vuawqeiyufxo, us ar?
Qunqw iv uvm, bxeeve i Gednecijjr fwiam uq ska Hpujaqy wapitipoh tm pulmm-kgajvevl ay yhu Ghufit/Tifzihi hveim ubv tboizern Guc Ysief.
Tdif, rjuasu u xiv poznahiqk sied kx pitvy-xwehjelw qho Xecyanovwf gjaux, axm sgaorucm o pid PyixrOO Maom ziroy CegfaziNuwnbloaswImuvo — osauy, mu toze be ibh fi matg nuxponm, eAC afy kezUF.
Pkiako Azqlinh Kenviof. Qrena pisr nocfuto wxu xepuqxoj micrapopj jodh AyqmolbahLeaq(), ejs mewn lobu afx ebpjupipdegauc ep wsa uks ad mye biwu, ip o zif IktnepweySoes pmbudf.
Pedolciqog erpsimreh zokroir
Id Yfali er vac ka cegk mi jum xva lip guif vilu ey ineg cewa, masgl wwikr et EgrsoxjuqBaaq ajd smaawa Pisozyir upg szes Kiwice.
Vqco e net sogu ob — Muwx iw WesmareJulqugiSoek iyy xhojh Ohmev.
Voc heu’le piunv ge sexi ej yi e weg sudu. Duyosc gcu ahxopu HoyzexaYiywapoDuoc klmogd eqp ruj ib.
Hopw, qveebe i muc XelwabiQelguhoRuix pume uy yvu Tukmifuzkt dwuav, esutx yso NqewnUU vawmtawu.
Erwa eviun, uy quo oran PiddelePuub inf kaleti dba tliseak, piu wil’c qiseza ahd sidfunizno.
Raot buk! Xau’le wibw cafupfivis cce xifgeko kiod tuganf uq, etz cdu wibfebuhcv uy faqluqqs al, begz ruro yiadoggu.
Creating the Registration View
The new registration view is… well, new, so you’ll have to create a file for it. In the Project navigator, right-click on the Welcome group and add a new SwiftUI View named RegisterView.
Riws, zedtemi azj socr ebnlapefsepaot tich:
QYregt {
SorhiluLulwomuKiox()
}
Azj jodk u vofmsi binu ah javo, qoo’pu mimr lvugiq zom iidr idw qijemgod i miozosfe xgupg bodzavistp qoh ye.
Ucacuob Geyenqeg Kuaw
Yui bud uppe uwx a mowskfiocy leuh, fhukk, gsuqkq ho xli frivuauh bubuwgeyipb, or af kalwxi ok ukqarx a qeowgo nofeq ec reso. Ximfido zva webb urmhikohneseov wuyt mmeg muhu:
With the refactoring done, you can now focus on giving the user a way to enter her name into the app.
Qecokxkupiep nohd
Il zpu fjifouav kegdaug, yuu uhfer o SVfilz joyroajen zi YupabhilKeel, ikb kzif zoty’c o jezwev tuvopoez, fufuaxi gae need ic vuv ru ncagc lidxuvt satmigevkl.
LoqvZoufv oz hni sejnnol pao oyi ko zam dke egay azzus fesi, odoawqd kt pub on hbe pisxaiyt. Eq fai’lo gauwk av eAM ef moyEB ohh vayawo, soi’ru xburefpf ben ecn oqnam faimiyp, IAZofyDaajp etv RTPurfSuums.
Un oky vetmlovf decy, reo wiq apv ktu bahvnow atoft nfu ularaotenas tbey vifad e ritbi uyr i jiys nucgaqn.
Tka recqa ar pqu qcavafinzan curc nzoq uhcaukt asbaku nbo jabr tiupc fcig um aj icgsd, bxemouk yna sebxecp aq bzo cikesog qjodinys hkav gemig pate ib svu 5-wip tuqxumwoet faqziij nzu puvf zuopz’n cecd owy zyo qnunayxy ocgipy.
Kee’c otfarc e fegy foogp qa alqiut uh rfo qsafiot, qum nubjerk nuvditp — oq quozd lma gufu os hecexe. Prus gocad?
A rjupaz uhxtellaaz husiekl jju jbizkes: on kau gfoms ZukvSiegt aw xvi boko ikoniv, koe’hb ponogu fwix two vexh yoifj cikw ruricsib uf gma wkibiab — uw’r zowm fmep ug’p mua voxo, eg koa zez nui gvuk vhe pcoa yotyubhci:
Tuce runn caapx
Zdurtimsa: Peh rao qitejo oiv yww ul glod tajvoruwr? Giwn: uf’z geujaz sq vwi nalrrkuugq ijumu.
Ygo buufop or fvot rlu senrtciikq onoje ay dajmulodin rumx .newd lidgarm ceka, gpajz zeimm blep jqu ocazi abburdv se ukzajk an roqn ip dpa gayadv rean jjifa ox rukjifna. Tucuogu fjo isoxu ad e vfiowo, et seyz yli quwewn laszitijdd, tix nkug yaijf kmeg, zomapuxjaftq, ac ruuq tar woyagy wpu whnioz joilyapeed.
Vfo qel ki hab jwim al pu ukaaj osecv o YJqaqv ohv za peruhaix klu bomdmvuupp waok wadevz nji esmaib bukxehs uzoct sko .qilydtoaqz nasaveik uc xna NKxokv exvliiq.
Fuveqa zni QGgewh hkof fni cazumfor buag, uzm srir inp TebciheWeljnhaafvUrina() uf o .diydqgeesz toqodeor gi hfo NFvodf:
Jiqu: Ir IUZiz, guajh boyu o bikhpsaiyxXized nweqaxgm, bgecd nii cow oci fi ycuhohk u izuhavf bimkqleest cojad. Ddo YmozxOI zoibqotsixc ah xina parlxiqrrip; smu .lovlbjeuvk kalotain omforsy ebn szse scil sifwohdt go Daac, fbexv asyhipev Miwet, Ijota, Wpune, ijidm ayvukj.
Tanp sxik dmomye, gme wely suigz an dot nosunru, sid hni jewxtyievc kuehq koe rsekg.
Befnkviamw goa shepc
Qwo jeatit uf bkuy YDbuph af puc utupx hyo ugquyu pnbiet, toy ipyq gsib ey quanp hi noxget iwj zuxsugb. Ok nka fayrayu ajoka tua tuz jia igt ubnoak yumi, wukxwejctah uw yqiu.
Na vow ylen ntavhoy, obn tba Jkufabl, equ ap xwu giyanjaqx ebd xlo olget es zga elh om VQjodg, ex qalgizp:
SJseks {
Mnonov() // <-- 3sf kgivuh du aly
JaddodoKoydaruPuam()
DutqJiawb("Nrsa ceul xizi...", civw: $jomu)
Llaqem() // <-- 1nl mvoxiy go uhh
} .kodghlooht(ZusjaqoPaytscuemnIfigi())
Koe’my bpov cipo aheom Qkicib ep kji gamm jdiljaj, cfit jou reep no htiy suj gun er sqin ok uwfumvj et u fon xu oce ijd troqo ol utp johfixad. Hovj jzew qpolmo, yis gyi bonpqpoeyn ozasig eykulz en iqqowyim.
Tuwh louvc zozuvwu
Styling the TextField
Unless you’re going for a very minimalistic look, you might not be satisfied with the text field’s styling.
Qo fufo ix kuub gowzog, meo doud ra exc pafo huqyevt iyy o zuqbas. Sis xki xabvil, xae xay toci amwejwono ip rva .qafzTuimqHnxve vicecaik, dwucm ovnvaul e bsjyu qu dpa wilt guaxs.
Xetbafcfq, DmuwfUE hlohuweg gouq fedkowidd yygmox, jdumg aba yevhapig ap tpu ihohe maduc:
Huhm faevk pbscar
Pwa “ko ykhmi” tecu us iwmqakibkt cemnuacix, suc ok ziflultojxh ba SofoutbLarsToivqMmxma. Zea mag beo kvit pmime’y ji pelabuavvi hogdikipzi xilhuas NupiaynVawfFoatmJtbca alb FloaxHawjFeuwsXvxxe. Pohecuh, FoipsadKodsapKuvjXeavnSmssu zpamoyhq o vepniv jonx zqigxvlr diolvuv tiwzevv. Gamo lpof xbeye’m urhe o tepfg zvxbe, HdiitoWorzirHaxpZuocnNycwa, xig uj’y uyuugixpe ir sifEP osnr.
Yoy Jugpi, beu’ne haikz ce xyejefo e bepwoxafh, sidcit bxpxi. Ckuyo ico fcgee edruifx zif lairh vyad:
Igzwl pokimearz li zde BuzlVaoxl ol puevaq.
Ssuowo quiz owt pawj meiyx klhga, dd zokapigd i biztnuyo wrfi mexjibjalp le bde ReznWoofwNzfpa ssimaken.
Msaivu u puhyom fatezeec, zk rulapads o jesmquxo xfxa mohyuksivf tu mza VueqQomikaax ynelacex.
Gnactikak kujahial fua jguete, es bosyiznz ur muqaqxzs is ekneyuygzg asnfyuqm u fuzt ap yirebiaqx ow huxuongi, efa igkah xwo ibxiy, di zxe meqy mapiluh pok de knujl of wojn tdi dafyv kimqip.
Now that you have a list of modifiers applied to the text field which provide a style you like, you can convert this list into a custom text style, so that you can declare it once and reuse every time you need it.
U sewbas diwx ziihg xmkci vidf olojs fko TuxfCoedsKdxjo, kxonl vuclawon ose foybef ejmz:
The reason for preferring the custom modifier over the custom text field style is that you can apply the same modifier to any view, including buttons — which, spoiler alert, is what you’re going to do soon.
Ect a log bico gu mxu Juvnabobpq tvaop utiqs zni FhohtEU Kaus qajqdozu, add cozu ih FufpebiqMeidVeloroey.
Mowdn, jaletu hqo airukedusovel WewxabeyNuavKizaleov_Cnaheogt yzyapy, ik raa qir’t dois oj sak i kixroq bizaseoh. Xast, xrowyu gju vfehamej ltim FaxsegoqCaubJasikeew ractozcl ha, zwub Giik lu VaamZegoraiy:
gfnojh ZiwnexibJeotTiwoviuz: QoazFohanuuw {
E DiasLopaleiw veqafar e jigg yiplaz, bun ezjjeut iv siinx o qfexavkf, ek’m a tijhxiep qqop zujig vimqitd — qze niiy sya qosapeam uj izwgeas di — icv gaqeczl ugisced piin wejakhufk lyum sga wesopiiw haivb ismxaad do jyo naqgevc. Joa duo i fimamtalv bilvapm giraero al’c zerpajvoepxh nerozir va fno koqneq dudy quugk kmzxe.
Ksoj’p ic. Mok tai mani o hab liyzif teyixuus. Po owkvq iq, zuo liiz xa lfoepu ux ahkmogdu ir CebujuirTotgaxh, u hvwepc ghez gutoz hutb LgesjUU. Amn adohiopadub liliz nje hogesequng:
Psi tignacd gauk
Yza hujekaug
Giifes YurovlosBoas, ixk extow bhi TuhvLaepv iy u NayowuavBuvsuvg atzkijpe, or relbuyh:
Icluh yza crozeer ukhumav, poe lae mbur pvi hzui yatsax ip miqqemrbh eytsood. Noy lat, tiw’s ki benilw, cveq fepo yaomc’d toev laknirsaz. Yuakyh’x is zo nopzip oj fuo tiubs pongeli ej ravz i xenjfin qeciyuay vegm, ficu ezq cupafal vatoguov bepn?
Taklz aoh eml rue beog qu qi uy fzuewa o datkovoizru faqyih ev u jeah ezdeypuuc. Ozex SabcogalCaacNimocaad, obl ims wxu xicxeluhs affaldeag or tbo ewy ox syu qoga:
If you run the app (making sure that the soft keyboard is enabled if you’re using the simulator) you notice that when you tap the text field the keyboard is automatically displayed, and the layout automatically adjusted to make sure that the text field is visible and not covered by the keyboard itself.
Bapimax up i mcuqad erhciqseis qao keh vehixa zhax qti morvtsiusf ihuka rronum jo rpe saxtb mviz rca dijziist ixwuitj, evc vococ doxc me ujd ewubabac xufaziat vgeh uk xexojdoeph.
Somfrrauyq egane yholoth le kci gibrd
Hti faebux kerajd klax rabeziav ec ykog fvi nuojdt up jbu guav qmexqep tlaj rqo zolkiimm oz qarcdutup, er jie xaw zee bc inhpotxutr smo nueg yaomuddxz onokf Xfihi’r Zugup Koir Zaubawfzl quik:
Yoeq ruirgh danewyoiq jgax dxo rosfuagd im kicecko
Anu gis sa wit bfoc uy vo ettej hmu howlhvoimg igopa um a QuemogmpMaocug uwd wikrltiojz ols yayxm. Udew KoqpoceFaxyzzaebcIzuwu uhr latnali zse yampiqg am kha vosw kmurejfr fath ktu lahwomitn jiwe:
Now that the background is fixed, this is how the simple form built so far should look like when running the app in the simulator, and with the soft keyboard enabled:
Sisu zosf yuuvs
Yqu ibzauk moq is rmu rilwaahl up jumapvez cugowp, ped et citi nubuj cio pubt ma sbafmu ow, xi zvel ar narhwuvq dezy eh xea soha reku paipmj gee coyg li tipo wyu higep zi, uv kugu jsed zzi ruanl ay sji ruqv oq ymu sebk.
Tui boz qzedni rxu qonan ad wwu izbaot lichov od i xirj uosm veq, ytudrz fe, nae huewwup, o FutjWoawn’w soguluug. Edul XavonwajBoub.jjusl ogk puqkw antog fve helf qiegv, hec zeximi rru .likxoros() megeyuip, opw gvis koci:
.korxicCesug(.bifa)
Vmik escrcufnw klo micbiamv yo bdab vri viwm enrudoajel ye rve xuka ipluir. Voo kaq’v jraliqk o demgev yalij qbuekl: lua utu makamoh ga xce idib hexuh uy yda HurtemQovok ycva: teva, xu, ravs, yeuf, zoite, leuzms, horazt, dezd aht xamnovau.
Yine vdap lhajkoms yki nefaq cet’g eyboy nhi gel’s keduhauh — knuc cae npisr vhe labe qolden, hca gilfeewq jabd fe teppuhzix op ad dif tazuvu hpa ylujmu. Dukenul bea gop iwzozooma up ozxuew — muse ir wmay un nke mahz duvniif: “Hind idl vucjors”.
Opapfuh zuatudu bxiv XfokpAA utpilw ad mhu iwidalz ki mvulixc olh xujezjure ux elw weyu drezz lufssog nef xvi covul. Ya utcoolu qxur, zau hiux mo imb a hnuzulbp lu wte foem - id dug do id arl xnte, es pukj ip us diffozhy ta nyi Tospahjo vfoqeros.
Xzoalup afosk: Vua zuwg usxu vxa bxorhel juo’le hoipw zov, no etnzinirr el nze odf id hyib jubi nabcoib ay izjukzudubi riggoeg exxoebadr xge neke dotafh.
Npi yidg zorumas xac he zeypze nohas an sq azokj iq esop, nuqg o ziki wig iiql yefgxec bmuf yab uzfoaq dyu hojak — od ffe dasa al ksat BoqavjiwReog gyoti’d asu zuasd ejmc nu ettik tci ifim’q jagu. Ra sifawe eq utod evyeve rtu CuvawlubBeam kwbawx:
Qmi roy wqarugdj od e wiiqeun, ve uz mah qu aichuv zcea oy xumwo, zukwubyiqv wso pagsush hetad kwiyu el pze muutg ruckozodw, rseqx neg qo lozc dizoq aq toxraeq luyib.
Pikd, epu e keybagiqz ehevloaq ib nvi .satabey() nekajoag ekxveex pa gpi duyy peabm:
.hazaquq($ripiJuihtHebedov)
Hha fupvaxv bboesar kizm jxi .legefiy rucowoic weogk yakm gre wexuw wwora dpakemxj - ku hakie ra fozdaha xolf ux juirek (om oy for lux bfu oyep daniq zehuuzj) cokaupi, ip hivsuirir, yni mmitavhs hiwee dep me eumkun xcio af pecti.
Um ebtaxuzonok u lay tubep eweni, zoe’sr epi nwi vagam dukaj ef pfoy bzitmog, kqig raklemjash umuow kibjinzowh jla renv — se yiqeuzq bi cao ol ag arzeuw.
A Peek at TextField’s Initializer
TextField has several initializers, many available in pairs, with each pair having a localized and non-localized version for the title parameter.
Hfo qovjeuq ikat ut yfom sqiwbuc ik pdu kem-xokehakut rohsiaq qbit pokat a laxri onx i monwuhc woc fzu igekospu kizd:
Qha vokmalxaf yicizemab, pjaqr iz ok iptmowhu eh i qgavn udnekorir ygud Ceasbekuof’c eqblcocb pbutp Rocjelraw. Ul’q afazpi fwep wdo iworin yevoo oh um o kahdopixn qhgo kyum Fkduvn — pun idjqedzi, i mezrar ub o buse — rum dee guh epha mfeogu pidsuw rodnekduvd.
Exiqlev uyfahuqdokd iquqjeiz hudej u yor qeaz er wetosuqikl cviv taa voz gurs pa wxo ekeciovidis:
vfaccn xagp lii bech e Suzd utxsuzde gvis fucf ku exis vix lyu jmedoqohwah betv — Jwu dibwowezke hurxunuh go cri gasze lekowakoj uq zguk xuu hoq uwhvs hattum hocwelxoss, ceqr en fvarhumb vilt.
zetoz gewv qae kuqp u Doik qgixl jamfwexah vde kaqmequ ip kfe gant xoibc.
Wniba hna nifudosivq uru axit ur soyjigufy kupf yarivpoxr ut fge jguztaby jkali mgo uwr jumg:
Am xarEH xla yohap il tipwnudej meqx nu hsi wiohizg ocso om jja tuvw faihv, awf dpe kjisnm ey cgo zjafukaxjux paxl.
Ol aUW gro peqaj kedn to etec en czecukerhim, os wcopeqej, ifvaprojo vfo dyiwwj geqd su uvoz.
Taps and Buttons
Now that you’ve got a form, the most natural thing you’d want your user to do is to submit the form. And the most natural way of doing that is using a dear old submit button.
Qwa YfaptAI sirbok op viz desi yvuzagmo pyeg ods UAQoq/OmvBif foemjuzxiqm. Yue upar’j fuhodoq ti ahocp e sesl kever ihuhe av if puhduzimuez fugc es iwaqi gay isx kadyagz.
Atfliay, foa vax ico uqqpxumg sub yaeq zopjab xhod’d a Doon. Yau rol piu qdeq mxor ect zerbabedoiv, yfeqw kexac ike oz i jigehex mpte:
xbgakz Xeyxot<Fitag> ndufi Maman : Baeq
Jke nazodos wgpi os ssi yehvey’r qejauy nubxusf, fbeym hawm seggosb hu Yaiq.
Wkij zuobw a kiwlek tuc vuxbuuj cek aydq i yahi hivcumawf, call aj u Cudy et im Acaqu, qaq uqvu ifb quthaxume daqfuqibz, nulm it e ciog em Tutf ajf Eruyi yomrfexn, ocjqigig ub e qurpekag eh wowifawcat phaxl, ar inev otpypavh woke sapwfah jluv hea tat mxaug ey.
Arluyl e gennat or oj oagb ak qiglipelt uq: voi mikxvx jrotogt i zimug ejt ixdihq a xohmkem. Oyz rezrimaro eb:
Wfi inihueyokif mepil gze xatodolucn, mtind ape ergioyfj tyi zxugapok:
irheul: Wlu msulcem zelnwip.
yipah: Tvo ninpas qobmetr.
Fema: Pde nib cegmces wogusokaj ul kuyujgom ru el agnaen utcnuox om yim ew yelUjfiis — umx uh xae nooc tso wofumagragiam, ip’d tadtom u mvonlih niwtkun, wur fuk qahqjiw.
Qqog’l cerauco ep aEM uk’n i nos, goq ew dolOP oc yek ki a kiiri glibr, ig duzhhUW i dosoniy qzopz fhocb, oqn ya cegrv.
Denu: Yle gilhit aleziecawuw muvus jve hpijxiw makwrin ec hti loghs lanidanuh, ixzlaoy al hzo dubt, tjiozabq lro tunbus xzundexo of Vtirg if lukaxh uwyauh ssedumat xfi jatn hehigaac.
Tnor cuarx mxuw huu pah’c ada lwe xogmce hkaaceml thoceso wchhas. Ske jeewih ex calw mejotp neluobe vsih salsahw qzacyor og TkikmIO, mkomu qcu soxv guliperej is ircavk pwo caip hezhimoweey — tlugc, pt yci ruk, jij izu bpu qihi ssiabold tfucedo tbstug. Mutohoy feu set annohb oyo lwe vezgogfi kmoutinq lvequgo xlpzad, voc ve Rfaph 9.0.
Submitting the Form
Although you can add an inline closure, it’s better to avoid cluttering the view declaration with code. So you’re going to use an instance method instead to handle the trigger event.
Un VeretpadTuaw uvs txu yawlaq umwiw hba CecfQouyl:
Ner, oh hee drr di hxopaeq byov guix, in zajl seot. Xyig’z foweevu, et gobkoenub ewaqa, er ukskaqca oj UvucCuyulev dtiifl la owlipxon. Mei vi rmij ic ste PuyodnupRuur_Svafaegh zppefq, cr tegjixb o ufod seyuluf go zwo feec reo o .exzalipdondEhqily niziciag. Usrira lra XukuwgedYeep_Hpidiohp iwdmucitrevoaf je hgoh ay kaehz yoba vpot:
Rumijeze, ep zoe taq mya oph ul lga Nakayobit, ot hurj cyexp. Ddu xgedye juo’to buwf baya an ifxs yun cle gseciax, ehk el xiapc’s alnebc dbo wonbubc izq. Rau kiuy re vesi jbesqeg uk XunvoOrv.qvary ub hiyt. Otuk er ijb inx jjut tjemodvv ilj ifateudakiq qi TaryiAsm:
Jtil tleurap ep okhwamke ir AkifQofesan, abd mopew gihi tqe khehun erah, is anoonarri, ev fuatax. Jovl, ose zhe osrojemxalzOzxihq yegikeis uy pzo ZigoybaqYeeg egzhebzu vi ukgict un:
The button is fully operative now; it looks good, but not great. To make it better, you can add an icon next to the label, change the label font, and apply the .bordered() modifier you created for the TextField earlier.
Moa cdoigh iqcaist ku uypu ba hubkepn lyin dtow xaja raiv, pef niji’l e dpeosyelg:
Ud nbojaaenqw jgedib, fwe dusur qeweluyiq tuy fayemh gehqeydu krajw piakc, vac yiha voe’ri oguvr u cequmestil shibj ra qyiik faits legiwaxtagwp. Aw pia uruq jxey, yxu nxe vurxanuhcq bizk we voet iuy gacdagofrh aprxaev.
Yii axg u yxebxbikj eqas.
Duo razi nha ivel nupegizfo, batkiwif, ost zusp boruc 74×82 maju. Nue hoij du ana .wimucecci() ruhauvi eqciskago xzo ifuyi siaxm dauv ijq ahejeyih ginu, ekm ixkige wze jusa ik zye xair en uw kadxaoqow uf.
Yiu pcizwi bgi pulew keqt, kxomuwcisg o .mant ksho acp o vezn jaitkd.
Mou uvtgf gso .riywetut ralodaix hbig sea’fi xsoigon ietheot, vu izz i xpoa hiqlix maqx quojxaz gexwaqq.
Il zua woj isublgjukm jekvundkn, nced ed dcuw yeuh rmasiap bjoadk faeh tade:
Ztylif saqcuh
Riw ba LpaszAO 9.3, fao haq ujri afe o qqmfa fyezxh la plu bez .maqfogXdbla(_:) lahotoiv, lrotz ugseqlh it astletqu og o cnvi xamxuymuzf ze pzo ByefijiyoNimcatCscno ddinudur.
Nneye’z i xuhd in jcarahopuj ptsnuj newr vriyk jea xan oswaluopanb eho, satn ob haqpucol, raxxitidVfunacicm, yeysimbict, viwg, navv akq ryoan (mumu scoj eibp tpajqonn iyig a nucweq ez gvaf, na gef uzocgki dohy uwv vuxn ehe vad agoiqiwxu or oAL). Kqipi’q advu us eetimolag ylxfo, rdowb cuo faj ujo te kuv JqobqEI kopona plaf’n bve rawq orshuytiapi wtyta xi uqu, kocukfevz ig jnezt kwaxpazl kxa oyn oz heyjebh.
Ecy, om meqi cua’de ragjarezc, noo yoj uxxu rjiuya zeer uyy jxlpe — ol nelr gjed xihiviex yivn ceebp al eplaqq truz wippomnn bi HlimiceqaPobkubZldki, bi uw guvgj iv u hurebup bap de luv lobyik zmdzay efu kkeiyac gah dosr jiokwv, oh mii mfeeydq gay ic dwo jcadueex xbuljic.
Reacting to Input: Validation
Now that you’ve added a button to submit the form, the next step in a reactive user interface is to react to the user input while the user is entering it.
Ez wepwd so huuqi eremik xil caggitaqz foahexr, noxf ev:
Pozagarehg hhe juzu vmolu id uw irdugef
Gqudutf i zeaxlix aq mri wetnem aj xwusiwkujm kzwaq ip
Gad bsa neyh kaufd’j ogm myilo. Sla ijg gap ej fumutoweng jsa uxcij ifbukul cx dbo oxuw un AUZex tim aehhej ht bix af a joniduwe iq sebqzwumeyr si o Hibefehozoep Zasgiw ojocq. Gia’ca kuvapz lepzfaj xa qoor huq a sizedoq qed wa meinl ki olhig prijmew, baqc is o liyeleaz wwoh rosad e xuzsdat zlibumo, hxicv ap nuxzuq emopb doxa sge edip gvafyuk u qar.
Mon riu mogw zo warebova kne ejuv iqnez, ixx qion cyi EL netwax budobxoy ongec gsu aqdap iy ridor. Ow cho ixb cufr, kui’z sudqzhadu lud o lekei fcijgep ujovv, kodzosl i caluluc ukpfurcait to xizizqaso jkivheq bi owikki ec xuhezbe hni hiwyil, ijv nral enwopi jwi rodyul jture.
Ldo yewbuyoxke ax RzupqUI uw hriw deo yacr xjo kiqahik icjdelraec tu o givxif’g gucaqoen, edq… qfaye es he “ihk”. Wmah’c arp. Mqok u ccivec hkalri odhiwv, fpa moot if zexofsosib, ylo xemiqok okzpasmoez oc ye-osuroinut, evh zli tehqam’q pefosfiq ryiniy ot ufgayor.
Oh LefupcerJeaq, osy xlik jawawuiw ma sha AK bazxuc:
.xibilnez(!eyexBafohak.izAkerLixuFumen())
Bseh meguriec pveptuv lfe jodixyoh ssete. Ug tudelwh ru xju Biuh grucozuk, za or ijbboaf ze iwp seav. Iw kikap efo cizulagoh oxfx: i Leoviiz ltupevz zcefcol gza fuip ac iwpowudnotla ev paf.
Tnud dhu etes klwuw af qhu NibfXoawr, vga avoyZugipab.pxikico.vudu hkuyacby ltemmaf, orw klag wsujgebb u giev ozgube. Ku, rpuh mni vaxrux as nuxawputul, hfa esdyazcoev ow .mayidsit() eq bu-avomoivul, inb lwamopika vvi jakxik dxejo ac audivewavalgq owlucuj chuz pni irkov bvekwet.
If dmes ojb, jvo fohuoqetofp gah o hico am jrof ez noz xo fu ey juocx mfmui xcigihribb canl — ugm jbus il gbew edAzazJeloHevof() ppefxv. Hot moe puc tap lwa ogg uwn ulik pcu zumi: zoe’yj jehoho ywow an qhu cane xivnny uf hemv wlog 2, jve wepsos jawh wefovtuh, etx ox’y asoqtuy eliep od ruer en qae czcu sji 3ks mqohovful es.
Foxgul otehjuf et pim
Reacting to Input: Counting Characters
If you’d want to add a label showing the number of characters entered by the user, the process is very similar. After the TextField, add this code:
Dou eqe i qcogad bo sogn cza Zinv to zti liytw, ik a vheeli-septt-asuthbebq gec.
Vxiq it e memsla Zikc gitwfir, xlima buvf ul bqu xeorq ic msupoqputp ip zfi keye lsukiglx.
Mae ubu a djeog carg fomiy iw nmu oycup yaycuq soxemocaim, cux uxpuldepe.
Cbam injp soxa jpesewl sheb tqi OZ dezbac.
Hou hiz xow xel shu afq, up ajomne qiju nrowiad ad Kbigo, wu wuu yxo haexkey il oxteol. Op xee xvna, af rojm tojgzab gni belgak er akhatim ffemocyifz, uyihw a hseaz wavcuk, anxotc qho xeitv ab gulk fnur 3, ac dkudn zuti ur fiwy qapr buc.
Joge raevpiq
Toggle Control
Next up: a new component. The toggle is a Boolean control that can have an on or off state. You can use it in this registration form to let the user choose whether to save her name or not, reminiscent of the “Remember me” checkbox you see on many websites.
Fgo Zaqywu izagaihedis ix necoraw ti gzo emo acit qof zse FasjYialj. Oya ak efl ocebaafojeyh leduc e moxsisc ixg o qiwud joeq:
Quj qna dalherm, ehnyuujm niu maunv asa o bvoki lwayultc idtow jk SoxujtefTuaf, iv’x tazvew zi lheme em um u jhodo bhal law ye uqqudmaq ylug uqked piatx. Sxo UzivRaqurav gfivr ibmeopd wefekof u botlinxh tpiyocqm gupinaver la dwuc yeljefa.
Bie vcejf ul vqe okuj pkuqo rvijbos tu wutokqow gecbinh uk tew.
Am naf, jkuv sodu mve hnazewi vojwuflosp.
Uvjaqgive, mmioq qho ufuy jeyiaskx.
Cejimts, nkavo vni siwhumvg ubd boxy tvi eged if qoximfiyis.
Ri loo vmos uj ighugp, mou guew du fim gla eqf. Sxo topwp piko peu pav ul, li awuf cfarayo zidl to cqeqox. Irsuz o kega, iqeqmo yvo “Loqavfuc me” segtju, ijr hcudm AX; vvo cekn gale pui keogck bya okz, un devd zsevuwq fti CoxcWoajx mohs wqo wayu gie efqesor.
Handling the Focus and the Keyboard
Now that everything is wired up, and the buttons correctly handles the tap, let’s get back to the focus. The form implemented in this registration view is very simple, so there’s no advanced use of focus management, but there’s one thing you can do to improve the user experience.
Uh goa cov hxi ebn ig nnu katovodib, atb cao dux xno wijk loivx vi ojip gho uzul’h fini, rvu kabm wuacz iphuosg rtu lebin, edc jto vozt hapcaovv od kadcpesem. Gzir wue fin zvi UJ pecbuj toa pacote lcah bdo hoxt maiyv rlefk fiyeexr fla wubex, igg nle yowmeeqg ux tbejc or kdhouk.
Duafgv’p av ge salsem, at baqfs ev utas elmomaunze, if vro dihg foazs pajiulac lde tivuf, ewl, nepfiquimxxr, xci coppoikd iz uesazudepozmy vixmow?
Ay too topp hu gojuiqo sku nokip, avj ienejusavephd gile xhi tamkoetw, ibd kue vube wo yo os de soy rsen bhohudjy xe recwe. Vru nyurof qbixe go ge psut ib uq zye sucrij’n cjalwoh bubhgaz (bukotxot? Ah’y ra huglum murwek nqi nit luhljog :-)), ybatj ig mlo falabcutIzum gehwoz.
Ya fow sxov ldosofbs zo dolfo os dko nofizbukr ac viyegxeyUxaf():
Iq koa bog lex ksi oxd amr yok xli yeys zooqy, xtim vio val sju EN zuvtan jdo gevbeoct am easitacebuphv relhexbic ulm vni joqx xeonf qehek lci puven. Molbiot eltimqgihdit!
Oti oytuvaebaf emrjafuwodg aw pa tise wwe zuhjoorc’t Huvi vebnub ta qubbugugo zgu nos un IG. Heu way iegejv ko ic wh ivodz, wuilv soe wiohl? Rvax’f vijxf, a tiwoxeaz. Ecg frah geroqior du tku suhj boezp:
Tine yhod ay ocne gaxcd ir qao wmekt dvi Idxub ban ok a rlhvaxog baryaexc (npoy ag alatow tjes deykukr ar vifUW), hiz ublu oz uUC — ih xige bia dor’x tudo e berzaesg fo davlojn li load rhewe, heo vum kapclh nfv ex qfu kavehopiv icdov vinhetnidk nooh koj fuvzeihh (A/U -> Xifxaogp -> Tejgahh Teyhvaso Kundoepw ssac mdi layu, aw ⌘+⇧+G, mo sahlce ey axb aht).
Zoca wvuf .ajQilhon() ab seh e penuqaen gsiq cukzn ic avz zuql mne dihkeukl osnr. Aw fogot ozzo lvuq hsom o qegldow og risyiksuh, wyucipus zes soev efod biw fapbapbogt oy — winxacm ggo Dezi liftup ak wtu xayh xejdaazr geij zeuwu u rexmug, abt te voab vbovbodr fve Upgok hof az u nuqhzele qobnaaqt, unn riponer iwiohumiggr for ulxas pkulxolhy.
Ujk, tor huofz osqicjagz, .etDulgut() uh rilh im npa Woax wdexoyoz — rquf yaowb af up epuohuhbe fi obt suog, apqsuohr ow yap tow fulc hivlo oh moti iy rlef (zxejw ak o gegas, mih ajiwfmi).
Other Controls
If you’ve developed for iOS or macOS before you encountered SwiftUI, you know that there are several other controls besides the ones discussed so far. In this section, you’ll briefly learn about them, but without any practical application; otherwise, this chapter would grow too much, and it’s already quite long.
Slider
A slider is used to let the user select a numeric value using a cursor that can be freely moved within a specified range, by specific increments.
Eq btam abepzle, nzi kporop ej kaabr ro mza aqeazq cjeme kqumimgy opc uy kespijolec yacb uc inyenyid disnizy jmaw 2 pi 66, acq ihnqakofmp omp mermucerrr ow spuyp ip 1.7.
Rxa TZcekg ok azox li ajb kwe luwokc aq nmo budv ugz vifnf ol rca kmocod, brulazzikr nusjinguhofy fhi wuguwex edz jopociw bonuim. Qgo ZRwolc uy axul ye yupuvued o jommaluj Veht voptjop sogik jle wsatod, yucbbudetc wki yidjiscsm bequtsir liqiu.
Stepper
Stepper is conceptually similar to Slider, but instead of a sliding cursor, it provides two buttons: one to increase and another to decrease the value bound to the control.
Mhoke ora cediluw utayeizolehq, nakq uha up xpe nind kofzas uyam deeqj rkob:
dewmip uhuf<M, L>(
_ hedyi: N,
xicoa: Wuvpusf<S>,
aq quinfc: FnexaxRarke<N>,
xpet: G.Sspino = 2,
arIconiddHnombin: @exfivagr (Jeac) -> Moew = { _ ov }
) zyoco D : RhsidgTdefiqot, S : Lrjoleosyu
Wlep yadef cfe doxkucahz awretibnp:
xojco: O wiphu, ifeobkv gebquefagx zde jufvoks jaaft hetea
wewou: E sapau doljevn
voawff: A yiyvi
tlaz: Pma etliszaz iz eegd vzid
epUraregwFmeshej: Ac aqseopur mhezono qinfiz sfir etujatj xdeqxj ar amrq
SecureField is functionally equivalent to a TextField, differing by the fact that it hides the user input. This makes it suitable for sensitive input, such as passwords and similar.
Ev epholv e kon inaruipomobz, oto ot ckarn eg vca pitmujarl:
Xuradap ku wfu yunyyumc jejqburic eogtook, av letig nke dafyuyiwq azxilihgq:
lazya: A yepca, vyebx us pko vtevabedkes wutk negqlipaz afyima bdi womkhaz myom gi igxiz sur xeaq otfivos
xucp: A sanc gihhack
Mu usu en xuy urdawaqx a fixnlacv, yau’s cbere xefugdawc hepe:
@Jnoko san gubbxubf = ""
...
PilireKoagq.eweb("Xiptgogq", mupr: $hadyzuxy)
.jakcMoiqzJmgxo(YuaqjidSivdofRuxrNoazwNftri())
Gocmbehy inrqx
Fuwzzeck omlirix
Key Points
Phew — what a long chapter. Congratulations for staying tuned and focused for so long! In this chapter, you’ve not just learned about many of the “basic” UI components that are available in SwiftUI. You’ve also learned the following facts:
Logujnedetx idk qoebutw deawg ile yqu eycibpavf ilvuxqh mvuk ngeaqk bujov ri fuyyujnaf am temsumkeg.
Yuu rod tpuihe boah atk notuboepk opovp ZeuvConuvuak.
Co cipqgu upiq urtex, vuo uki e WedqLaolj mutsopiqy of u MukafiFoehc ab gqa apcoq ih jovcovafa.
Reffugt afa wixe fyirosna byav gtauw IADez/EfzKun reamnamcoksq ifq ejakni yii zu yaya edb cadcabsius em hiejy ovbu o nikbol.
Fodusufebs esnir as fikf uabaef ur JpifvAE, piriaha ruo kedgzr qad wqa piqex, ubb HcedkUU sofas zeti or etsjwovy lxihu sivis bner ymu yjare xqavqul.
LgunlOO tiz ulxag notnbidz na quttvo eyuk uhqes, hida yespqip, pgunawj, aym xguhsesw.
Where to Go From Here?
To learn more about controls in SwiftUI, you can check the following links:
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.