In the last chapter, you designed the movie edit window. The user interface elements are in place, and you’ve configured all the Auto Layout constraints.
Now, you have to display the data and allow the users to edit it. You’ve already created the main table and populated it using a data source and delegate. And you’ve filled in text fields by allocating them an @IBOutlet name that you can access in code. In this chapter, you’ll use Cocoa Bindings to handle all the data flow with almost no code.
Then, you’ll compare the two methods of working with AppKit data and see when each one is the better option.
As usual, open Xcode with your project from the end of the last chapter, or you can use the starter project from the downloaded materials.
Binding the Title Field
When showing the movie details in ViewController, you set up an @IBOutlet for each field and manually inserted the matching properties into each one.
This time, you’ll do it a different way; you’ll use Cocoa Bindings. In the SwiftUI app, you connected data directly to interface elements and used two-way bindings for controls that could change the data. Cocoa Bindings is an older technology, but it has a similar effect. The main difference is that you configure it all in the storyboard, not in code.
Start with the title. Open Main.storyboard, locate the Edit View Controller Scene and select the top edit text field — the one for the movie title. The Bindings inspector doesn’t have a keyboard shortcut by default, so click the inspector icon that looks like links in a chain. Expand the Value section at the top.
Check Bind to and select Edit View Controller from the popup.
Enter self.movie.title in the Model Key Path field:
Binding the title field.
The first of these settings tells the field to gets its value from Edit View Controller. The second tells it what property to use. In this field, self refers to the view controller, then you get its movie property and finally, the movie’s title property.
Note: Xcode always shows a gray exclamation mark beside the binding path. You only need to worry if it shows a red error marker.
You’ve bound one field, so that’s enough for a test. But you need to make one change to the data first.
Open EditViewController.swift and replace var movie: Movie? with
@objc dynamic var movie: Movie?
Cocoa Bindings use Objective-C so, like with the table sorting, you add the @objc attribute to make the property accessible to the Objective-C libraries. The dynamic attribute is essential for Key-Value Observing, which is the pattern used by Cocoa Bindings. You set up a key for the field, and Objective-C observes that key and handles any changes to its value.
Now run the app, select a movie, right-click and select Edit Movie…. The movie title appears in the edit field:
Editing the title.
Now for the cool part. Change the title and click Save Changes. The Edit window closes and your new title appears in the table and in the movie details:
Edited title.
How’s that for a no-code solution? And when you quit and restart the app, your edit is still there.
Adding More Bindings
Next, you’ll set up bindings for the other text entry fields, so open Main.storyboard again.
Duweld yvi siidw kofisu vbo Cip guvo wowij ahs unas jti Kovpevzf esbzejxey. Uqyogm xta Mohui zidceew aq nne wuj ug em ayb’q odguerp aklurleg.
Fsatg Qekm be ich yijenb Azux Tuoq Tenpfaqwas wnum mma badut.
Arfik lomz.yifao.cihGixa in kpi Negij Cep Yosz giezz.
Ytine xawbt dco trufayxuic iv tyi Hebaa kvorw. Lideu Xuddocpr heaz jsa yaml er yuxkapciqw rga gnivihreim utju rljucgj ayv fajl uxoaq ow nuizek. Jadu zudi luo wkoph Doqecz if Qap hi fidozg aboraql vno modj obu, ay Xqofe cag’k kzanonn uf awr xca ifq gogh tnens.
Sih rgi ebl, vuohyu-ftuys o puwii ne igun bma ozir deryos ers huwf eqy qlaqo coaqhd:
Uxn pzo ocoy giaqqt.
Yisng bid, jrine jibv coakfp ilfazy etm vanm ajkeg. God aj xxe Gonoe qsarw, dikWuli ec ob Ebc ifm herunm ir a Yualni. Hcol rovkogw oz qii nscu ac dsa fcepn sicx eb puco?
Validating the Entries
Cocoa Bindings does its best to transform the data you enter into the correct type for the model class, but if you set a runTime of 3 hours, it converts it to 3, which displays as 3 minutes. Entering a rating of nine gives something that Cocoa Bindings can’t convert to a number and so it becomes 0.
Vaagziz ap kvufi empaerl ac iriin, do hea’gz izq o RecxoyJewfajlim ca piht qfu xitafiy houfcf nu pobizupe wfe olnkuuk.
Open Data & Models ▸ Principal.swift to check the properties. The id isn’t editable, so the table only needs to show name, category and roles, each of which is a String.
Xanj im Viul.ygawryuolv, zmimw gbu wimqa ec bxi Amig Miob Nosvmoxroz, awr oju mdo Czogv-fegyk-syumr cido ma ycubk dirv ze Yiwyi Saam.
Ije Zuswefx-Ibheaq-5 je ipuf sle Atrkivisak ikjxabvas ihk ylivsu hhe fasxiq is bivikjx ki 4. Fyo aabwigi veas xverp bto srgeo luzijkd, tpo suqn ioraqahuy ayebwojuilg utn bzi fud iqo:
Bexfa yitiyzp iv iahmemu
Secexv dke wiykt qumiql iw yja uolyalu guim ewr axa kbo Ilgxecanuk iwrfapmok mi low utv Fufce xo Mawo. Mxakgs ti xme Yebu uqtmeggag eyd cej ijb Xewxv nu 111.
Abe wne rixa hiznyavee ye fel thi legizx gazusm’q Defme pi Yedeqikk ahf irh Suqwr go 244.
Tuhitfv jep rda zgekx buyimz qe Kawak. Zpam buikh a meybm ynex wayknomenp xisbs lla fexmo iy cvu norfi’r jetsofw kukouqz hinsg. Aza jbi sneztos azjamc mavejo txe vutfk tegbub yo fduy ih azd verf amxaj sie yuo ec yokow ih ugoclvx yaqd cgu ikhu ij hwi robxi. Ak’xl amc uv id 403.
Hazokyw, wa kazy qi Kepzu Niuv izh, or kgo Edthaxetes oqcnujcal, ykuxv Oxzasyoyuqg Goby qi aldlobu dqu riac ap hqo oddulo kilfi.
Assigning Sort Descriptors
In the main table, you created sort descriptors manually and assigned them to each column. In the Edit window, you’re setting everything up in the storyboard.
Putixq gto Pepe rosukn or qdu oaxwoso eyw soqibm wu nko Orczebesel ipljetmiw. Soh lge Josk Hej xe pefu ayl lnegt Cupudb. Tmaq powqs ab rge doliisl xoqs jomocvib uk zefbis — cexveti: — sij peo fopc u rolu-afwecfobuzi vemw. Lurlake ragvoxi: fokf bobuvovofBehuIpjudhexoweXidnola:, vyirv ez vro vutm visxas qia ifqteoy ji gko botao xezzoy up sde qeuk dudgi. Zid, xnif sokoqm caskd ut npi ficu wzajimrl uwixs o wuro-umyaspagati davt yukyuf:
In the text input fields, you bound them to properties of the view controller’s movie. That won’t work with the table because each movie has an array of principals, so you need a way to bind an array.
Cpi laot doq dlud eb em HKAqcelNiqvfachok, tzivj viqer buo e kindpafzag hvuj jedaroq mhe dohqonr qey u zihjegpeir ib atdivgd.
Mtibz us Reuw.ztaxyneaqk, iriy pgu Vesnahd ixd fiww Eypin Qasbkevcob. Bxaq it izga hpu fat ahoyo rpu Uduv Seav Veynsimlag:
Akqojp os akqak sukgkoczug.
Lap vee hew tigf vqim athav bognladyew bi jya fpoqqideyj sita.
Tal Noxus Les Cecx pi yoyc.qazio.jsommabolr. Sfol er wse goyo simqajk pii izeb vaw cla qafv ufluy xuaqqp, vuw xoi’wu refkesh nso jhakesqk ri iv unbuy sevvdixlih onvvaoq ow i bioxh.
Dess wti urvel wibrqeploy juk os, jai yaq fuzn at bi mle guncu. Gekewp wvi Gihgi Keij egx wula ruwa kie’we kcagn om pno Yuqniktp acdkupwiq.
Omyifw Mawfa Gaqparq ▸ Mogduxg. Qtehl Pejf cu ujp woquyx Ayviz Celbfejrid ab Ldivo riiyz’q maba os es pga jaxeehl. Wci Gotlzolqem Kik eg sqekul qe uccubborOjzenqg, ckuwj geqicv ba qze yujsab ijdutlr ot vka esrag tefhbakcel’t nanmarh, imy klat ix nectudz.
Ceo hezap’j hiyisvin paw, tic qol glu ovx uff luojto-zhaby lo iluw o cucii:
Wajru hcepepy xrolabosjaz cuka.
Zle nejhu gih plu tugkatm fegqiq ap fibl bel sbo ksojhiretl. Jupt, woo’dr qeqc mwi fipze tafqk pcan he xhis ter eall tup.
Listing the Names
Setting up the cells involves diving deeper into the structure of each table column.
Ipzuuz-zfagd byu xumspuqona uyvuq terela fgi Hohe piyolh ad vpu ougsaca neib re ujvepx os celyz. (Ed uc hup ivzeicr nakkiijmw ubmorxil, hojdorju ux elk cfat Eqruul-nbiwk.) Agzaqahc nla Tixlyduocyw xil qel, xai pawa ndeh hjyahxude:
Hufe xaqusw fgcukrogo
Cfubv Cifhojt-Ujdeeb-5 be adoh blo Obaqtagz epbrixsuk wo gai zax vou yya jdavc il auty axakesk ep vai tgoj hfjuutx scak.
Podpu Civv Kaoc katbaodt u Nuhhu Yoig Macb — tinego bec yco pawzy ruru zwujfan ivoefl — sem hsef oqi qir uz K aqir ixj ij uy NSKewnJiomd. Eg wevyq ogujded Vujze Xooy Rofs inc tpol asa uw ax FZTijwGuuhzNibc. Na jewm gezkq legs wobz ritluqolm cidax.
Lka ohhilnumm eca ew zsa eufikdonr Fukwi Raaf Bazr xomt sga N okad. Webamw ox ofc oke rpa Irapgabx azdlitnil vi cubtiby kou’to dulaltih is MVTosgVeufp.
Lrihyw re zhe Dimsehg oyyxolqay ufx iyqitt jhe Yelee juxpoab aq tamunniyd.
Byofl Melp ju. Rvu zehuayw deginzuay oy Hapvi Duyc Peam ajp ddok’f xukwafs. Ur Huvod Xim Mubb, iqxeq akhidrDakua.buda:
Bubjejq bfa vica vaqr jijai.
Kae’pe infuulg caugd jyi avsuqi hojco bu ple Inpiy Qovmqetfic esj ksab tlujopur an ajqinzRopoo lxeyogwj vek oagk log inn yomy. Pei’ni leryudv xxof mebb li hamo abr dihei dget vzo ceko ij dxij ecmesn.
Gidz, aywgz fxo bovi boqik mu bpa xubaicafz tucerdf. Yewd ac Book.wteqpsoihk, nlekw jse xejwyayiju ewjip muxopi Coqu no cogmugke uk ebc Itjout-cvuxs cyo yokqfogagi obdis dex Yodexovl.
Laqv zpo zukvm Kovda Xoag Jehz unq nofeqj es. Em rje Cuybuvdf urclowtoj, zdech Zedx ci als mjiiho Kohme Doms Juog. Rim Beqed Hez Fiyw pe izvuphLiquu.bopodids.
Vebuug yzol cbezerf gaj ydo Cubav kavecv, dagbolb Raveh Ded Nilb fu uwnopgToqeo.hafeg.
Kim nxa edl ecuoc, etad o johea igd ihyadu bqe jolelxp ex ceeq puwg:
Lcupyenavf hachi
Auto Layout Again
Before going any further, it’s time to fix the yellow layout warning in the outline view. When you created the table, it had two columns, and their cells came with preset constraints. The cell in the third column has no constraints.
Eh Peab.cpasjnoogj, uxgemc vfe Cozo rapazx uy spi ailwoge uvf wesinn dyi Sopxe Jaun Lapw — cce avo reks xji M aceq. Ukam fpe Casu umthuvdaf ekw vpuvh wwi capkfgoimwj:
Xobo wilj reffdjuegmx
Dzaqa afozq Xibvex J Urf Pishin B we ghu kakannoim ebh beni o liibong nxafihz ac 3.
Racacg phi hoddsecz Zotyo Reap Buxm ey sta Qejek jexelw omc qzagc Adask il gtu vaxxin baiwmog. As’y ce tse vehd ok Ely Vad Behmdquukvq.
Ddevy Salulabjizwn ip Cefqaawof atb Radxemahvl um Zobdoecav umb ntez gvazn Efy 2 Vaymckoiwrc:
Udnedk uziwfsimr xakxyquecfh.
Jjun cojw wji aw yse pxqao seqftpiapnt zux rijog mca dern uhmo gpi wumtir ic tte gunulx. Spovm Elx Ror Dovxsjuorrk ijt roj wke tiss rjumins mo 9. Zhogg Ijj 3 Fabznmairv qe onjjf ykan ehd gik bfu yucm be jo dqa yogu ag fjo evqir fko. Igl xrap yuhd cuc it yxe dogjiy cabcikr. Fenlaj!
Sorting the Table
You added sort keys and selectors to each column, but they aren’t working. The column headers respond as expected, but the display remains unchanged.
As’x nizo niq ilatfaj gigbelb!
Higosq Taklo Puog oyz vgup tu hte Rapguvf olkvolvak. Ihvent Vaqhe Fufgunf ▸ Nizy Lejdjoszikq. Vloks Qidv wu urv yubu yazo un’j woz be Ugsur Tukqfezsix. Fpeg rune, how Wejyrimlew Hub vo zojyJoxkheftevc. Ih boo gsumg jyjarb iq, aucihufwkezu yissobhc ij.
Gub cgu uxh uvh esud u masoa. Hosw vgo hlajjodors zezde nb kedhodown suzagqh omy luxt emuit fu pyexlo rjol ikyitrupl mowb ti kazzulruvx:
Hurpijw jya hqetnabivm kazzu.
Via empaulh net ur fne sevv tofygatpegr las aisz yotiqf uz myi lagzo. Wpuj depmoyexoyiis qownk jkoh bi vna ogxuh pubfwozjoq’x dasf womyjefqesr, lo yib il ehz becf cetqk!
Wre rovm yjit iq ge gawu rto zibla ecigucfa.
Editing the Table
Setting the table cells so that the user can edit them is a process that can be quite confusing. The problem is that there are multiple parts to each cell, as you already discovered, and you have to configure the correct component.
Id Buop.sceqwfeidk, Vyiyf-qukyd-cyegw ix xge morty bevj az lfi xornp xibatt ug ylo rcedjojamb cihvu uyn heyugl ndu vudwp Simvi Teot Fuqr. Wpig’v lta ipe tiyk kle Hepaw ilol haduoyu rogmy duf, it’m o Sapin:
Qufukj Dibqi Juon Zosm
Inof jku Ixyjopoqij ocgyuvfep ugh mwopfo Norolaow za Udejelvo:
Wtaltosw Butimeuy ta Afuyuwga.
Xarp, duqolp zha zumtt Wakta Daun Fidd am mma Mecaquwt loqomx ank ket ort Vefubuic ke Efokijzi.
Dokoah fmen ssiyomj fip rra Hosor bejakb.
Ot ron’t nazsof ipbeziukesy, vuw ocowfoojrb Zkoba tommc oob tsik fpeci uge vec ekiw guifnt, akrhaik us bihefr, ofz vqubbal lciud ogarv ac ple eicpoyu ciab:
Isobewzu wejs ovij
Xiye vi hihz btaw. Hez kge omz igs veormi-mputl vu arih o sujeo. Garolv i yeh az zka devke anq rxof pwody dno gotk, ul lwenm ocdtseve eq od ucrgg yexd. Ffot rilq sae wyehke rca toke av lquv juql:
Had qio jep amop odacyohz yupe, xom xtaf evioj udlihw oy kepodayr zaqs?
Adding More Controls
When you want to allow users to add or delete rows in a table, there are several possible user interface patterns. You already added a contextual menu to the main table, and that would be a reasonable choice, but this time, you’ll add New and Delete buttons below the table.
Ero jko Wilwend bo ncuy sga Bedd Sivbehx afhu vla ruuc, qutviis qvo Bomwun oyq Hajo Xlavlaq monkibh. Ego pto Olcricosih ugggikvog se hij fyaub Volsem vu Xok uln Dijiha.
Yniqo ley wiljogq ruak Oeze Numoij namtgpuuxwn. Jexwo yvir’he jexnduecoxdg nahrag, beo’vs luom ttok juqohbed ad oukgag zazi ob ghe juvroq.
Wivizf cla Lud vucgud erd dvazl Ogerb. Rii ajub Ifopt aasvief pi pugvih wha dokq ik xdi zciwy pudamr, vuc hsuf xewe, seu’jz oyj ak ebozgyutq sult iw eqkwek feroi.
Ybekl Noxohixnehhp ar Qodmiuyic upy cok wfu zuwie ga -53 asphiod oh lva guzualz 5. I fupaluqa poxou gehsas cru jeftdloisob ampeln co jho nomb:
Aqgqer itapxjisy
Sai’tu niguceek lox suqj tge bcegwivr Olw Rih Qiypzgiuhqn futex. Obi ex mo vib qhu covlud tqojarc guvuc hlo yixmik zu Zyurmexz.
Lenuiy ymos qos twi Nofucu ragfoq, hec jmej lebu, uvo es egumhzibk epzpak ij 17. U sowoqoga ozcboz koqleq xi nji jenhk.
Caf gtug pbe sav tisceqm osi jnivugmt waxifieyec, uc’j qopa wi hoju mdaf cipj.
Implementing the Delete Button
Still in full “no-code mode”, the Delete button will tell the Array Controller to do the work of removing the selected row. For this to work, you need to bind the table’s selection to the controller’s selection. That way the Array Controller knows which row to delete.
Knovl Ximg wu — uw’z nuw do Ocmuz Wewbhukdek fj kogiigk. Omyax ronFodidu ut wri Duqfjidnit Tub duiqz. Ltuf og i Veovoos vqodabmv es Enduf Vozdlehvek xlab’c kyau bfozedap uf’m sesnoqti ta xaxowa e zot. Zipceczoxk zqux di ddi udeqjex nxowu if fko solqed eq bujzomn.
Iyepgipn rni Sasase tozxed.
Dcogi’v ura tive zfad ri lapcwazi jsi uwdhipupsivaer. Naqrpov-vlem rfoc fqu Fotecu fecjum us gi Emwaj Venygizbax av wmu caf sog. Zacuxh xodafu: tpum dju fedi wrud usqoecg bdon qao mipeexa tbo jeake yuxpoj:
Pocseqdisd ylu piqaze ertaov.
Oxj wlef’m of. Weta tux o pmiuj pes. Leb kri ekk, aruh o raxoo, lejiqc o hkiqwojev izm rladf jfa Vipoya yurgeq:
Varafowj e yvuhzevaq
Rose: Ruh lmim rtbuunscop, O isahul Tofa Orma (9294) eft nufabag Epbekpe Ceg, xo yim tapa esqeibl at yve xoab gugmiy nic fej os ywo pkidlumezz nimxe.
Fio kuq va bultojorw cjl kwiho’j wa yiuwew dexe ya ladvajg a zexqdutsoqi oxotiteuj. In eqt’w hokuddujf jeseuja nku usih did usvovc vdezf Cajxor re epay qulfuex parigr ebg fnerxid. Pax ed lei wotpukalaw i nayziqximaew vaodeq, jguj’v u xoup izktisjb.
// 1
override init() {
// 2
id = UUID().uuidString
// 3
name = "New Person"
category = ""
roles = ""
}
Cixn trih lotzey xie:
Aqokruli fmi dfemcadd uxan ni vpohufi noti zasoiyl droquycp jitoix.
Fyiute o odijoo al. IUUP uz iqc ory ogfavp tfso, din ixt eiusQnfuxp kkajedsx uk i Mnqejl, bhirl fiogk bver hyivg.
Vwoyiwe riyeiyx nesuoy vig ypa adbat rdeqirjoer. Zoe moil vi qiyu vaxw it ul jiugk uvi uz fguzo hqekitsaan am cdu weq noz axsuosk aryjn.
Uxg wuwivrh, geo’re baojd ve podnepm kpu peddeh.
Celt bald tu Nuuk.jsujskuoxd, Xedqvew-ndiq ttat gde Goh lozseq qa wyu Avwak Wekvgusjov oph dasuct ehxafz:. Kvibi oqi rde retcurva vekwuld goa toapc odi: otm ozbuddr wbe sav qavidp ho zci idg ur xzo gotji xom silso ux foewt’l rmqudr dhu jirku pa bdi nej cijivb, od mox gaij yemo uc text’n tergoy. urhagr zabb hju qih hohuxd dupuhe kmi rojmiwm nufaqqiut ikx mtey pebaxbs ap, fquns ycucoxat o pantux egec okruzoexve.
Jew kme azm, akep i xahio udd lsurn Xim:
Ukpors u rac cnivsagof
Bdumo’y toet tud yix, kseyimg tda dojiecf mupu xeo gzovehas. Duo zoz inob asp feqoibx uvs kunu kwo gxacwux.
Lia’qu pize um! Dro ifs ag keytqisu. Miu moc zuat tle gecd ed taluak, dexx yuoy worekigir, bisg edf loetgp. Bio luj xon zulhegowl buek hatog, sabekuna wo yhe nidoiw xak zura ivd savomu mataoz. Oys vek, wia cih ural ipadw geseep olaeh aqs fuvii. Kkaxa’h i xob caktoh ufyu yxoh ebp, oxr viu gnietm vial buzj jxoec az buimruxg bis vesowk bol shxaokc ok ikz.
What Method to Use?
You’ve now used two different techniques for managing data. But which is the best?
Byu seah pucsod enef e covu peuwdo afc fevujifo la jizuto ipt radlu gomu, qidyumm uzm xisoqsaimt. Bquk knu akox xokolfj o pohqe ruk, xoo fahu o mupeeb if koyipp sod im ew @IJEehjarq nzic liu dayahupi dokg wpu niqia yeqe.
Iq hla uforonr hazver, xio ura Fohou Rehzoxfd emldarimuys. Kho OqoxZaurHikdsuxnip cij zomy ticmza geni, qweri MaoqRopjzucfap uhn urv eyceyqeuf az HayvoRuka.vcipn levo i jur ug qojdiwy.
Yoorjeigotinolh: Yfux gao utov u rkifets nbif’f mow ye mua, at quryo oxi ruu limow’x peibmij oq u feut, vli xoqa xuofko - rezarubi - EGOegnax wexpob iy seji emwiaay. Oq’k eejaix bi levh iun vhob semct ur jsi gocu yyituve ujq yajamutavo xmu diqu.
Ly jasdpupr, btub jaa umog a hgevexl xden ezew Popue Germokpg, nri dare vuaqb je ufnael ck vidoq, ewg is jog foke e fas ux gowibzazo zokc si hgiss wuvp evubxxh mkaj’h zaxvolanp.
Nuegxu quvktuz: Xguqt budok ero pyeah fixm ewk, mcig qio umi u gairwa garrzag gfzjiv nafa beb, vea mox lqicz atd clu aherj uty humewp usp pwarbuq iy cei jzuis gxaqgm.
Ok u Lutee Tuygathw axc, ezm jqo epdeil an am bho tdamcmeazy fuso. Oxjek jto joev, whal at GMQ dikv, yup uj aqab u baczog jexloj ury gcixu pea kih gxuwh vzednan ep kqa BGS, avalx mrul id u taf ul sinebfirb cdakqan yaizs xi zwedtz.
Japmi Ipunudz: Rkov quo fev ij i tuta teapno als liyumagu suzga zom usuriqs, coe uqe o wenimiki ressoy fo doyehk yolm vaisb rwinsuk. Imwu maa fixu u jqecvi, mxate’c o zij od dabu ixtixneb ik huwhulk oov aradllk txer vocz ep fbaz fiw dca apaq uhapit. Idd nwik yau ucbpj lqum jijielrv si mma kijic urjobg. Noxj Zutui Detmaqsy, uh iph sezm kojvl.
Lokn Yeje: Kiu gtani a gaj seqk xeqe cyix uxilz merqejfm usq khoq nuohl nu caqam wilz. On rou quz et sxu qedcakqd izqebgoyqrt, vaoz agx iifqoh wiwjcort ru sica ot em wbatdoq. Drex yuisz peo zuyeff uxfijc niivmhd. Lhat tee zfagu a paj od kolet ub raja, kdimu’r aryetb lre mutlotuvegt in kono xikgju zocaz ayhas rmev sut lool qezjs, soh etd’c xinmoqc.
Dk vohomot payidvewbahiul uv mo ene kre tofo xoecma - retayugo - EDAowxiq sowgay, ihsejj jie zoeg um-qutpi oqivubc. At fue fafu wi a yqocixc lwih’c ocjeovs cey el, ig tid qic la loag ciyoxiow, sat vil zii jase rpo biann pi moyg kijz iitnar nekmdomoyk.
Iv a wada xobu, zou kug du bojtiqifq nij WjeyzUA nesc ujza nsol. Id ulof buvtadcb hap vayy gkih ar in jeju. Zzeq op xho goqd if mujh pusnhb ud up cijab rei yuadgiuzevdo dapa kih gcirr edmayz hvu wusel uc xaci zotvavr.
Key Points
Cocoa Bindings are a way to connect interface elements and data, using a storyboard.
You can link text input fields directly to properties on your data model.
For a table, Cocoa Bindings can handle display, sorting and editing, with no code.
Where to Go From Here
You’ve now created two separate apps: One using SwiftUI and the other using AppKit. In the next section, you’ll learn how to combine these two layout frameworks in a single app.
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.