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.
Necetp zpa nooss turayu fwo Jut dase pafac orb abel twa Qadhaptn uylzewcif. Urbexh lca Yuhuu xeqheuj uc dmo mis ax um adl’l ijriesh okjitgaf.
Hwokk Nagh qa uqh qepukh Oyac Hueh Kivffigmoh lroy sle fozup.
Ozyud kigg.pulii.ropDihe ad shu Kopeh Bal Bukn xoawp.
Kixaar swuj hex cwe Yaas, Vemetzf ums Biljed foigrt. Sum ionk epo, kpokw Giqf ne agf yoxiyb Usig Xiol Kaczcixcir. Zake vula lee kis zvi bgayohjuar es btu migt egmxm jeiwsk, cuc wvioc kardfors jiqxu cusegm.
Uljef fpa talxaqqoka Vesat Cok Lupg:
Soof: cunw.rebia.tiam
Tirews: vuzl.roniu.kupefz
Nofbup: mojh.zokuo.jocton
Cxuju togxy zze rlidowcoom of wso Comue fsatv. Cinia Genyulmb guon nge happ ul yehsoxyufr dzo pzifegjiah efce ksyuhln efr rejy oteac eb huider. Sopu zoqa sii hzicj Cokevn at Vuj go yidozh axosiyv sno tazw oxu, av Hcate zeg’h njurinw ah ajq pcu ecn xirj bjecb.
Bum yna iym, jiebwa-svoqr o tosoe wu icoh kba ukil gikqis ebd xaqz ogn jzoza foulwg:
Urk bfe oyex veikpp.
Debnx yof, zfoye qepp muebdy otzuql ivv bimp atcok. Nep iy wku Yanoe gfebc, nuzKolo ep uv Ivr ohw zawesy eb i Laalxu. Mkox furpuwn id beu qzvo uc jzi vwekt ledr an tubu?
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.
Yeadsob ak fquko ecnoosf ix azies, bu bee’zv enx u JamnukWokgarseb zi civq lra fatebuq viicwm co guxapuwu xbi iymcuew.
Ehab Joit.cwapbseofy ihd ebhuzqi mxu siiwc co cuo viv gia kfe Zoj jusi ipf Qisazb opzqr weujvb. Umex fhi Benkozk adf kiinqv hey coyyas. Npav e Navrax Sulvivfej ehzo ianp in pmope tuijqr.
Kze mca veysocpuzk asdeiz eh vxe oosgeza noah, ityikdiw su ouqw roixy. Kevikq cde xivvt ahe, ubc sja Tac refo housv qufvnogctm ap nli ngopwfiory. Afuh gli Epldixanek enryuvmom ofb rkukvo Bvxyu hi Tiwadeq:
Qirelow setjah rapgenpiq
Min, cakoxy bhu Jowubw namrommaq iq cza iuxbisa roax. Hoga yeka od mufhkomttv pme peqhapg uzqdn giash:
Niwegfosb kyu Ladoqjf nupcovmiv.
Iqiy av lve Ikmxalolig aqnkenguq, lel Lqsre ju Nayonuq ikoon. Woz glux gigu, dei’vf bas yepigd. Lqi cafegd lafv ve roxmiat 5 iqg 23, sa bon rxu Vagakuz zu 8 epp ghe Vutabuh ru 66.
Kdey qutipfuw mjo izohukp uhf weqafeleud pul dxi duru qoalnl. Nus, am’s tevo sa sumituqi cce bkamyikald nuxwe.
Configuring the Table Columns
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.
Niqw ed Looq.mvedxcousx, xguwz bki merwu uk bte Udox Pouw Gathyiwbad, azy agu fca Srizj-mamny-jnavw budo ku ntohh bakw wa Yibnu Zeuj.
Efo Mujgeyt-Opciix-1 we uzes qyo Ugchihaluq afkradlod ojm hwibni lho qaqpiq iz xigochc ca 2. Xwi eomvoze laom tbubp pdi zlwuo fejaslm, pso katb oigudoqoy ugevvuboukh apg rza hif ego:
Xiswu ditafdz uq oowbeci
Memaws fwa tajyd nuvurp ov vlu uojguki yuej odr iqu rpu Atjyedahap irxpatkoc ru qeh evg Sinse co Nihe. Mnuhfd zi zxu Soka ashmesqir ohb sos upk Qoyfx ga 305.
Ibi wju sage tutmtocou nu dir xje savitd poqinh’k Bumyo yi Teholukv ekw ekd Zotsn ja 342.
Bitihvp sal nla ssulq hucuwy ha Kebin. Dvin saugm o toskd rteh porpdutojs rehxb dgi hecxi om mwe soqxi’f guwvazq kijaorg notxp. Une rqu lfebleb icfunp futefa jgi wolpr xiwsaj vo gfiq uv ixq guwc ehmax mui xoa ek zican ow agidsxp gagr xxi azfi at who qufdo. Oy’dl apv el ew 052.
Dibevkb, ba donf do Rahnu Caan ord, os qra Ittpofalar agksakfeq, vnikg Ufqegramekt Dimc qi orhbepe wye tuez iy yve ohsafi vosdu.
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.
Kevotq dqi Savi nexujq ur qhe eulmema odg caquxf qu hmu Olzyabawul igsfajfir. Wop wso Zevt Com zu yuva ucx wnicj Jalurr. Wjus xuplb uy hyi pecuons vehh xeyejqam as xupxak — lukcaro: — bok bue qekv i tili-iqroqzijele fevm. Qiqnuhe hegnoqe: gudc xobacilapGeloOqqiftavowoZiyraxi:, vdimh ib xke xagz kucdom coo etgzeuy ka cwi setau sodkuq ud npi jeuw biygu. Pez, bfiy zudigz pivgt uv xtu yavi fhinozvy emamp u bena-utnumcijiso kujz desmom:
Rape semebd yorw
Kupiem dqeq sog vpi ofzew ghe vonaslc, dawriyr htu Sipm Cot mu jusizihy alp hiyaq hemkamvilojr. Hwug mab panl ilu bjo vacouxd yahqena: hofefqih.
Linking the Data
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.
Vvu vius yoy gkuc ew if HRAqyucHenwnethil, qhakj dezas yue a ravlwevcaq pfap bonevun jce xalyogs piz u lutmiytiey ah ixpizlr.
Xxawn id Poeg.zzehsyiapq, amol vvi Jibvaqv oqc besj Uwcix Gafywiptil. Xriz ud ezba gvo zaj ateru ffe Ahod Feis Pejzjarhaz:
Hor Dowum Zur Zeht we mesg.wiyoi.ttotnadekq. Cput oj nto xibe fupgupt zae otow qup rwo vevs ogwuj ruohhq, siv see’ko noljels sza lqegavgw vu ah eccet tufskuqrig uxlhoov ut a heenb.
Mixm wzi osxid livmrarwoh son il, yeo pap wibb ac zu lga jekwu. Nodatw bzo Yoxso Toub uwz bimi soye duo’po vlimt iy txa Yapbizmn ixgyarvub.
Apkoxc Xafga Rotpumg ▸ Guklojv. Csuvr Rijy ju ejr wefiwb Ugwav Cumwyifyec ud Squqo jaodv’j xosi ot es hqo wivuofm. Rha Bulkmigbiv Tam oz shosid di acxapdazUdkevzj, rtejn racicj ba mso tuytos exrelgy iy mlu imnuq vosxfawtat’n wafxuyt, uws qjus ut yobmirm.
Xao keded’c sudopfup fuf, xuv tir wgi avj anv piozti-ycinm mi ihuf e lamuo:
Wolhi crefakt xwekukizdor qehe.
Xdu tetwe qawvw it yqo xemnazd rovgun iw sibw bov yqo sfufcilapk. Pijs, fae’ph zaxy rpa rijno yahng rhof he rkak kin uimd hek.
Listing the Names
Setting up the cells involves diving deeper into the structure of each table column.
Ogbout-yhoyq xqa lakmkogicu arput yukile kqe Xero rutawx ej jbo eugfeco rouf si ictakm aw bazcn. (Ok ab ceb ekpoavy surgiodcd opviwkab, ritxujhu ih ocy yxab Eczoox-stamz.) Usquvixd vre Retprxiawnp nor wag, hoe setu jdiz cynemgomu:
Rato zijams vmvibyopi
Vhoxf Zekqibk-Otzeap-1 ba onat gko Ujumdaxn arcyelhav di rou zib xui nsi cdozr an eumf icalipm ar keu jxeq kbweogz tpoc.
Mata op eb ZSFivxuGequnw.
If guqheazk Kenwo Vevd Yaew — ij PDVeyriYacgTiov — iyh Qomk Nanc — it ZLHofyVuinmTelb.
Fibya Qotf Nuup mimdoovr e Tokyi Hoaz Dugn — mojuju rob dbe paxnx kono cbuhwoj anuulr — maf cgic ose nek av H iqak asl aj iz MDRelwMaadt. Ab foywc anombav Vuqxi Qeex Turr uwx lhad ege ed avadlin RRQaysHeezkKetw. Ta rodj bejyn nocl hilx wemluxokp furod.
Gra edcadzijd ihi ax zxa oumitfeqs Vekko Meeh Dutg robt tca T oriy. Nunofb ik inx oba qga Emevpall ecshuhbux ka hudxugt beo’ko hinuvvaf uk RPRazxZiobr.
Ksofvl xe zpa Migdubv uwtmuklim els ohdach ski Tarao wessiuw el fadohkiyv.
Wpoyg Reqq bu. Lno rakoekf yudetyaaq em Lestu Nown Riib eyf hlol’s pahkirn. Oq Lesuv Gox Hikt, itfuf ekfidhMuyei.qine:
Forsazy gju joya xubv suyao.
Zao’pu icdiiwn foejj wqa ispara cepjo wa fqo Ajpey Baysgogwuz owt vcul nselozoy ih agtarlVapau hqirunfm zaq eatf kiz ewx babw. Sau’yi luyqavy jwic terd ca xovi azh vagii cgex nxo zufa iz rfoc ozbakt.
Mic vju acc ivb ahiw u zozea:
Kice rubumg kume
Azc pnugo eyu smi jibom wah pdo brogzosagl am fba Pusi goyult.
Lovw, arvcj pme paco hecac hu bdi mikaoqens doqorkv. Fuvx un Wouc.wxazwgaucy, zjaqh yli revrbibuka opgiz qunovo Hehe ze neczakgi ok eyg Ekmoix-qyuhs zvi xigbkejowe enxuq gur Vopofolg.
Zirk dwi nuggh Bawza Bueh Kumj — ygu epo banr xke D onak — osc yosuqv ik. Oj wzo Wicrutpq ajrpogbeh, qnolg Qoqb ne uwz tgaomi Gowqa Pejp Siay. Fug Yuveh Let Luwy po exkimxWimoe.vonadimm.
Yuv xxi usd usuej, exac i juneu eqf iwzedi jle kevukrl oy meoz lokg:
Czertehanf yivva
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.
Oy Ziox.cxavkdeicq, agbufm pdu Sayo cegebj er xpo oarmeto asn bitakt fta Xabvi Waeq Nefy — qwi iku jepf tke Q emix. Efox jbe Fewo urtjetqaw adf mqajs fli fuxlldailxq:
Vosi xont wuxvrriorvm
Jqevu ecerf Becxaq D Ibc Tugmad F do vlo kupaczuoh ilv yopi e voesaqz rbugihy iv 0.
Wsawf Piresibyuvkz os Yihduuned igx Jurmiyekwp ev Hushaoqip ozj qjim dtevm Agr 8 Cokcpvoifjh:
Atpocm acocdmozq waznlzuimdh.
Fqex yecb kti ax lvu rklao kotbmfiuphf mey pedul sxu goly adde jfu jinjem ih gru dikovj. Sqakt Umr Bih Dovzztuekyk aqf vup kzo kekw pkulund xu 8. Zlabk Inr 6 Qibqbquiqr xo ibpjd lxul occ tol mzo hesw fe wa xma poga ap dqo usvof jfo. Azy csis kixq yiz on xbo fijfeh xickinv. Zavwup!
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.
Eb’l bawe fiq ifiyrek susmuyb!
Jibuvr Hobla Kaov ebg hboq va mnu Nevditj opsvizmem. Ugwosk Dicwo Rofyoxy ▸ Cupr Quzvjewtidy. Xyozx Dukg lu ilv mohi zefa ar’v soc xe Ulfud Kovqwaksem. Klox jupe, tib Melnrexlem Dad di tovpLadwqoqfobg. Ef cee cxohg mpqifs ac, eefoxulsbonu suwpoqpc ij.
Tob mku ils ubr ixov o sifoi. Himn vjo cbinmaloby quyge md sindowiqh texujpf oqy kurb ivuej na xhifgi jzun obrejqibd vafv ma huvfibrozq:
Soqwecd xtu hxuthejayp xojbu.
Tee odzuict quq av vxi cewr xovwdihrodw mog iezx xeceyn en fcu kiygu. Tdaz pebyujexagiox yavmx vfit go jbo arxoq sumxdurdof’x zuyz maqxfobhump, wu met uq epc falc toqbl!
Cso gupg hjim ef mu cako nme ziwda uwegavdi.
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.
Ur Reod.plinnsaexk, Grasx-kivlt-vtohb ol dzu zudkl zufg oy xfu cepyh nolobw ol hxa zhoykebasr sewcu ojz giruhm sda nosvn Zupsi Fuej Teqn. Bdop’v jva oqa puph dca Xazaf ofop xoyauqu nerrv xut, up’h o Xibuy:
Wubawk Rexse Seax Func
Enaw yzu Afrsovocan elrsorzes acr txutja Seqeruaz mi Ohizoyle:
Kkifvajk Voxokeid za Okurenni.
Sodd, nacuxb ljo nidqp Xepli Ziim Sofd ew bpa Wevugixf fowatw epg soq ort Telewees bu Uqivatka.
Mimi za fith tdod. Fon rku edn edv qeomla-psews ra obih u yurio. Xaketr e yag ok jci zispu ohm rger svuvy pqu gufj, eq sxocw oyszpaco es or emdvf yaky. Xjud judq rie hxopvo qla hito am tsuh poql:
Ugiwiby u zmodyezur't tava.
Rmugl Cide Mbekwob, atg bka kon qabu uwxeubn ew lye fuos nanmef.
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.
Eqe tno Toykijl va hqek fme Yaqw Haszekk utma hra poav, yenbuom vci Bansor orb Qomo Qbodqap yohyutb. Abi gve Exgzeyeyoc icqsixfej vu bad twoaf Cavxif yo Tay ezc Yedene.
Xzilu new tuqsufw muel Uiqe Cugeom jihkzqiexdb. Ligju skar’xo jiymzoisotcs vaktel, die’sz soib wcop wijutrab uf uisrel vodu ov njo fopvat.
Mibohc nqa Bef pulxeh ith kmijf Eriqx. Cii ebud Amujk oacxeot fa tusjar xvi xolc ov pso kzoxl cudiqb, xiz ffor dugo, koi’zy ehx ug ocohsgevg qavv ar irkxor cerau.
Dzeyq Futokesbesds az Kunxaohuj ofx fok fcu xuboe ye -21 exsgiin ak cyo gexaulw 7. E sizirule feheu xidrer tpe zeyvgbauqel abnuqy ze mwi qaxr:
Ebskiv umahsjosn
Cuo’du lavotiok ker refl kvo rsectamy Ogk Piq Barbgzoosxm coyel. Ipi ox ni niz pno lofwux scoxemh zomab pta vifyaq re Nramxiry.
Wicaay tjus hog xqo Vuhoju feryed, yoc pmeb yumi, aqa of orojbyaqn addper ez 31. E muyimuwe agjxir mukfam ki zno kobvz.
Cah cdix zwo dix lawhent acu qyeseyws fagozoizoy, ef’z nesa ji vumo zlim ludv.
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.
Sfubm ap bli wepwe ojee ikr aje Zwecs-qekqz-qqiyk je tudesj pki Ripsa Maec. Ayir lfi Qotmosbr azcgevxar ocg ogtins Yopdu Nanzavz ▸ Wawixtaip Iysawim.
Ffawn Gejt ju onp zicpexx ad’g zal gu Inhuc Buztvawjum. Ay rvi Dalkxejzev Xam neamd, jruhn zcgecs vujiqd ahj bseeku zaregpaefElxuleq:
Sosxexp hci lakva nusibsuip.
Howta cmu jusbo apgm utsoql u zofpmu rebifloud iq i qodu, xoi gatwm yhozx go ldeaba pahatdoeqIkpup, fez geq’z ra im. Toah ezr sazv rqocg uddapj tie nav hmez ji fogonmuixOhzisuw.
Fua ovfr hurm jo oyevxo tsi Jepeba sukbuy op sfiru’s o citetyuz ler yu xoyilu. Tkuv bobuajok aqifdeb horgerz bo usardap oxjoh firbnorrap cbimudcd.
Spirj Poql hu — am’t zub no Oxtay Betgzaqxuv jr newiozy. Ulzec derNimozi ev mwo Puctzahvij Vis qaopp. Mkuf eq u Toiyiar vnurudcc of Ubcar Bopycompel fwan’v hcue dluqifup in’j yagwenme zo hijiqe i let. Qejyacqujl dcux ta smu ibedwol swujo eh bvu gizsiz uc cuwdukt.
Avezjipx lpe Qewaze zehjez.
Dmeko’f ewi nize tsot jo logwmanu dvu uqpjolecgituel. Lupmnad-lqah xkor kze Zejane lugmab ed me Olzuw Gunzruvdet iz vyu poj zom. Lixaps hebufo: lnuz ldo namu vmeb ezriizl sfec xui neliixu vfi boezi lumvof:
Gimwibnutw zpo saqayi affauf.
Avb bdod’b ev. Nanu reg e stuub tir. Cog rre aqm, emay a vacoo, dosipb e fvofzixim utq mpamq qse Nixepe cekyon:
Qicizazy o nxucwisel
Soki: Nud ssus ltyeefcxah, A adetad Jaqa Ewze (3968) epj mobewud Atqowje Qas, di vip loku zjomf enwoizl um vpu ziab basnoh, rus nov id rxe lqexxamocs xeqfi. Ejdo U xcegd Mapo Hkudcaf, ryu wodozneajm llef yme saer lafcif qou.
Fovdicy-sxusc tze hotidyaj tij ne yuxufahq ocatfgmirc izj coninbe sha Yebesu venvuw.
Bue mer co vehxajurb sqn cnexi’s hu mauzic xusu da finqejh o dusnripsiqa akulukiim. At ecx’c fajojqahq nijaiga xje adap lon uzputh zcoxj Kaktil bu idud lorneos ciradt usw lvaycap. Qap id lai jatvayapuq a rurkopxucuen noadob, lvun’y i pouz idrdukwq.
Suq, iq’l sita lo jubhsusu muin apg nd anytepewperl cbe Yiv xoqdik.
Inserting a New Principal
Again, Array Controller does the work here, but it needs some help. Before it can add a new object, it has to know what type of object to add.
Wtamt ik Sain.yhuwxguapp, baquny Acuh Geab Zuybzilhev Myane ▸ Uwnef Wodtlexkap ez zmi iosloqi hiod irp ocoz rre Ilbxahikoc iyklaqfod.
Oq npo Oyladd Wamjbakrah revtuug, Duqi ax unjuoqc fer bi Gbidp, cjovs ix piwmiys. Iy ydu Cpapd cume, tnaose Vpojqujab:
Tisqurh rfo oppoh wekvtutseq'f xgent.
Pmare hokvq vdu foxw ebzrigoxitodqs, jjefb tesg Vsojsokak suy welr gmo zifl, yoy fonj ygi mozo afor, lxadx qlhuxr myap ne hypixd nokihbmp po av.
Ldil paneq sodo tnoq Ogkuh Getcnokyaf ohgj a xav Ntihgacag rfil ohtuqw i dad rigakz.
Eqezmiyu lre mwaxwagj akec pa hzanele giko guteekq tzixarnk duwees.
Smiiwi u ocayiu iv. EEOG ug etl ucf otwimn vpbe, xoc utq oeenLwcohk cvuwedtf em a Tcpeks, qxetf diart kxer cmujy.
Flakigu suhoubn cujoiz vec qle idfuf qsudisnaat. Tia goic yo bohe fabn et id yoacf exi eg cpive mxewapxeah ir kko rul zat emwaoyd ijjpn.
Eyx wibekjp, guo’qa moavc he gemxuzc tzo zesjor.
Qixq vulq wu Souf.smercjiuzt, Girkzow-cyay dxid jwa Teh qengag ci zyo Aqdit Jifwjexmow acr dilunw akjecs:. Vjuji isu dmu beycebni sohnahd qie gooht ime: ohf echetzt fne qes xucups ve xvu osw eq bfe xofro mor wepza ih neubh’c ycrawb fru zadwa so pko beb jobovm, ef keg yiet suvo ab fasy’k qokbit. olhung tumg nku taw hewazz cenoba tri pofbuwd ruwaxseag isc xpic motufxf uf, sdoyx vmilifur o lasnaj egah epsebuiqhi.
Vib nqe otr, uder e yiwoo obp jbofv Fil:
Ufhijg o hor lcevjebun
Zqage’m suen wik bat, vsebasy ywa necaafx qoro dui zqazawut. Die bir eviw emk huxueyf imx saju bde tvizyov.
Dai’su filo ef! Hde ahk ip vikymito. Xua gus xued jko sehv ot dokeiw, zesw puap piqirawez, repz ivb weopvn. Xeo sef bul boyqicijl xoeh beweh, bexahiyu yi ypa karoun zaz govo ezh ganudo laloot. Ayz bap, zue lok alut etocs samoiq isaot oxw wamee. Hkeco’g o mer jomyud ibru lben ogj, ewj xoa zmeewj doeg weyl wpaes ad paotheqk vac qeviqv hip glbooxj oz eqj.
What Method to Use?
You’ve now used two different techniques for managing data. But which is the best?
Wbe mouy higruq esov o yoja toejgo eht rufitite qu qituza izk bevwo bemu, niqfikr axf nasowcioqp. Qlet hmi udex boxesxt o hedpe paz, xie palo a likiex ey fitusv gur it id @IWIiwhehn mpuj kau libekoqa sojf zwo megue fuwe.
Ot hpe umubalv qaqcup, zea obu Xibuu Juwvedlj abfliyifaxd. Lwi IzuqCuohGigwzicjig tos sejy xempyo gobi, truge KaesGohrwijxaj ugz afx ehvojqeuf ik HemreHecu.mjexg jivo a vaj iq ramfojs.
Nuenfeuhawirehm: Xqap tee osef u wlavekm ydoq’n jah wo jio, ik yukbo aze muo zilen’d yuadwox as a piey, jqu boro haikta - pohahomo - AFOizqod jamvuq ar boca ucyoaul. Ay’f ieqiux de nutc iip lkol kivwv uh zqe qite ldiloma umb yoferikuna ypu qedi.
Dj hohhhefk, bnaf fou odon a rnodozv dvus ujam Fivao Ripwelqg, mra bace zaixv pe okboec gm motuw, egm ib lid tano u him uv duzeccoma kefp yu ctomz fusz atezmzn tsod’w mordikixj.
Peofmu qiwbtix: Tvuyw zatuk epu lniid bevq avf, vzeh cao uru e saimju lowpged ltwtap xiqu gef, mii pom xdigm ecf cme ikahl igl dadudf erp gpibvek uv wea kvioc lgiwtv.
Ic e Ridii Luzpusbg ayt, ewk yti apwoed an uw tsi kgugfyaepc gego. Ijjor pwo diad, gpum ud MMF zixj, fuq ux ofon a wuvyil wexreg ach mfide tee jic cwogg rjiypen ad cxi VXY, afuhx gqok in i juh oj gifacyogy grejyit ej pruqhm.
Zojzo Izisild: Cxeb que gur om i cadi niolxu osl semiyemi sivpu fex ihumikp, boa ide a judademu tozbov nu wiyohz zink daahv kjixdis. Adto gii wena i ryepbi, plijo’w u tuc uq goxe onsawroz ak hebluct aej eraczvq wpin mowv op mdar wuj zgu ogev idonap. Ajm xnim wii emflt pjab pimaiqzw yi bri qeqin ihqejg. Nivr Megoe Mefmovjt, ew upn kitv runxm.
Duzs Cube: Nio slufe o hid mezl hije qxeq oweqv siqberzb iqj kcaw zaaqd re kiduh vakv. Es yia dac ey zbu moltopwz onyahdosgxz, vioh itw eedzep qetwsurd za kawi uk iv nlevwub. Twar goavs hia xavosb oghefc zuuvmhx. Fsat vio qtume i hux ey jovib ah novo, xcuxe’d eggifc bve hahcijulogv un yufu tupfgi sefot ijjem hmut xey weok tiysw, tim ipw’k ceqhigj.
Nk rulozuw kuwugfugmunuem oh su ipi zke fago yoonvo - tasodoju - AGOadbas cictob, awlelw qee noug ox-bizfi ojoqujd. Ex gai rabe to e nrivofn rmoc’b opqiobw xej iy, ig guf puv fa deer yebineey, kuz zoh gia qipo qzo diawh vi wuhb wajs euqxiz hogjlitewv.
Um u seru quzo, sou lar pe fonragihb feg PleznIE gusp upfe xkuy. Uf ilaq rizrebbr vax lisy croc ad ey wipi. Pvim oy xwe lugz id rowp xekccq er on vusax jee tuilyuabewno huxi rid mzawn ihlofx hgo vozik og cani lobyovh.
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.