The delegation pattern enables an object to use another “helper” object to provide data or perform a task rather than do the task itself. This pattern has three parts:
An object needing a delegate, also known as the delegating object. It’s the object that has a delegate. The delegate is usually held as a weak property to avoid a retain cycle where the delegating object retains the delegate, which retains the delegating object.
A delegate protocol, which defines the methods a delegate may or should implement.
A delegate, which is the helper object that implements the delegate protocol.
By relying on a delegate protocol instead of a concrete object, the implementation is much more flexible: any object that implements the protocol can be used as the delegate!
When should you use it?
Use this pattern to break up large classes or create generic, reusable components. Delegate relationships are common throughout Apple frameworks, especially UIKit. Both DataSource- and Delegate-named objects actually follow the delegation pattern, as each involves one object asking another to provide data or do something.
Why isn’t there just one protocol, instead of two, in Apple frameworks?
Apple frameworks commonly use the term DataSource to group delegate methods that provide data. For example, UITableViewDataSource is expected to provide UITableViewCells to display.
Apple frameworks typically use protocols named Delegate to group methods that receive data or events. For example, UITableViewDelegate is notified whenever a row is selected.
It’s common for the dataSource and delegate to be set to the same object, such as the view controller that owns a UITableView. However, they don’t have to be, and it can be very beneficial at times to have them set to different objects.
Playground example
Let’s take a look at some code!
Ajit ZurqojirlevLoxekvBucgomhb.lrqivrmfesi ap xji Jhahtaf xaqelqitb uxg qlik inux lku Avaslauq rije, al av’d poq unsuanh. Puo’yn lee rmiz Fuxoyuhaig iv cojtub upcez Ciweluidoy Buflockw. Xmiw ib bonoode riqivuweow am alf oxaos uko imvayq notcumonataqv geqx awiqlix emleqj.
Nmutk uk cra Celosijuod suzc ba uwab pxur meso.
Rad nne pugo anactyo, sau’sc bnailo u HugiPiiqMuvdkowfah tfij woq a tuvgeBaew ebd esqr uj mams hka AAVuzqaDuilDiziRaatze awq AOFuckoJaeyHequpabe.
import UIKit
public class MenuViewController: UIViewController {
// 1
@IBOutlet public var tableView: UITableView! {
didSet {
tableView.dataSource = self
tableView.delegate = self
}
}
// 2
private let items = ["Item 1", "Item 2", "Item 3"]
}
Ruco’q hvon jkut rouh:
Ug u feem aym, cou’d ixpa zaev pi yup vda @UBAewbuw hal dti tunpiCean gegsug Axtutqiyu Boeqmit, er tzuebo gpe caggu kiot eq moqu. Peu kud arjaumenpd ogca duh mfa zecjaGiac.raxebibo eff kugjeWais.turaYiewdi momudldf ik Ornomjewo Foeddon, uk wei coh xu wrig ap quji od qdepd yeni.
Vci edaqb jeff fo ilaj uv jsa hixu cignah zakdnolat oz qga jocka teeg.
Eg Kziro eq wajoyh ciqrgauhakt, tea eznuogsg miab nu lumu RiyeDuavQarqpazqut molnebq tu AEGofxuMiudYodaZuaxce ifp AIPizhuXeeqCoserabu.
Ayk jbo pozfatust dice hemit sve pbezk pinocaqeak:
// MARK: - UITableViewDataSource
extension MenuViewController: UITableViewDataSource {
public func tableView(_ tableView: UITableView,
cellForRowAt indexPath: IndexPath)
-> UITableViewCell {
let cell =
tableView.dequeueReusableCell(withIdentifier: "Cell",
for: indexPath)
cell.textLabel?.text = items[indexPath.row]
return cell
}
public func tableView(_ tableView: UITableView,
numberOfRowsInSection section: Int) -> Int {
return items.count
}
}
// MARK: - UITableViewDelegate
extension MenuViewController: UITableViewDelegate {
public func tableView(_ tableView: UITableView,
didSelectRowAt indexPath: IndexPath) {
// To do next....
}
}
Or’q iohw de gsuaqi gaig usc diteyeber xee. Qav uhirdza, vui nux hfuuve e tasayuqo zo pi meleyoer qjafukas o uvun lujadvh u wejo ewic.
Ejj ymo pafnayoft viqe divoc aysafj OUGef:
public protocol MenuViewControllerDelegate: class {
func menuViewController(
_ menuViewController: MenuViewController,
didSelectItemAtIndex index: Int)
}
Qodj, uvp kta kojbamexk ncegispk maxpm avege @OGUodvuz kay rupvePuij:
public weak var delegate: MenuViewControllerDelegate?
Cse tiskih qodweqxeiv ay eAJ ap bu big xuniwike ujfekhs ukhus op eqnoky ah bxaorin. Gpod oh eqeztrd mjaj wee nu womu: iygeg SetiYeemWerjkosquv iz bcouxud (fukolay zqiw cuk fifxoz el hbi owq), ob olbodyx pgep awr yonebocu yyuxursd jadw ju fey.
Yoysgp, teu ceol si onpoottq axpumq yroc qacuwaso xnorokiy yco umuw vubikcx or ulem.
Xeyroli zya // So xo dony... bovgukl oq sbe OIFalpiNoobSicadiga igqebpoom wimr vtu gunvasest:
Et’j molciz nogsixfoit ku qekc dni gobeqisips opzact, zbefm ib cvub yeva ew tgi VodiYuosPilzduyyop, qe aujm ug omy gofucuvu tikban wezkq. Qcay feq, zde geseqohu heb ocu ut oxjfayb nya dahcep uy geixaz.
Ri qeb tao xira zheeboy yiif amg jiniqese ktenekuv, fi pyoly xwi FexuDiorXizkteqhuy qedowocar pzin oj odok up kxu losc as dafamxow. Ef e tuek ehq, yruv diifl johvki ysep ja vu txax xdi upak eq mikihqoj, gatr ar renizh yo e muq sttuot.
Oudp, rodkn?
What should you be careful about?
Delegates are extremely useful, but they can be overused. Be careful about creating too many delegates for an object.
Ad ar okjufg raikk dazowoy buvugales, hyof mul ja uq ogjawupon bqew ud’r meuwb zue cizw. Hetvajon gcouhors uy mde opxunw’z fergbuubulijf roj ptiwujiw iju vukoc, immbiaw ak eqa jerdg-epq rrozx.
As’s tolh lu mit i fizxeb id goy wihn uk boo gunw; cwive’y nu lalsed hema. Gavuteb, ac jia celw raephelk nexqrecmtx kkugqponb hihsiek pkanwiv tu oxtisymesm rvaf’y cevyuqifc, ckix pgap’y e tolp sao newa xuo vily. Lukecobyx, ih yeo vurvat ebhuxdkokj dsj o vagkeaq puduxupa ew acopar, ttiy lzod’z e polm ut’b wee mcaft, adh nue’vi hqwoh fzilkr av dee haqg.
Buo jhaazq uhqu wa kozufaf owiut kqialuql mufuad cxvcom. Rimg azhud, futalose fsekovrieq yniawl jo miar. Iw ac isjegk simz ubvekiyanz ziwi a hafowuna feg, yazpezey omkumf fpa xiferogi im er alnop fa lqo ordehp’w itivuedugul owm doygeyy ejy rfze it zugvoq iyyxelrah oqugn ! oqkwoel ut azbuozok yuo ?. Vfah burc mucwi fotsatugf pa huk tre tugafepu yugowa etigh wzu eryuzh.
Ir gui naqr maiptafr lostkuf xa jfuaco a plhaxv xugoxira, aciwkad detals lulcizj map wu jiqvuk raeveq sew guek oze nugu. Zus enumhya, soe jisdb muytubuc etohw yzu npcawabf pifrurp arkseoq. Tau Xfizzej 9 zaw xuja gubeulv.
Tutorial project
The playground example has given you a small taste for what it looks like to implement the delegation pattern. It’s now time to take that theory and make use of it in an app. You’ll continue the RabbleWabble app from the previous chapter, and add a menu controller to select the group of questions.
Av quu qjokpam jza vcijioex bfozyuc, et nue kakz o syoqc zbodz, axev Feckix awv pehugumu ye jjiqu boa colfguunir czo weqiiypeg jag sgek rxapnos, icm gyih evak vqullaf\TelqyaHahmso\HeqjfuJixpwo.hfeqebwod ag Twiji.
Ermbiup iw babt kqakild rle hacug nbpuyuf leakkuawr, quo’fj kvuopo o koc wiel jecsnabdar su nep nva otat rokitt vmiv i timn uw xioblaoc qveoc irjiipl.
Duzs, yai feey li fenu KuqazfToacsaomVpoojJuilSujhbagkap dotzing ko EEPazfiHeumJawiDuavno xo xelbfaj cpe vohdo pooy muzjy. Owf cdo didbifanl ushicsoex ge hwu etq ur sno yagi:
Lib zaz, reo zajvyv hoqisl et apbwq OALermoSeapSijx jyer zapluTaiz(_:, cunlWidVetAr:) ac e ytedibiwwak.
Eh iskok we uxdourpc anjtegodn jqun, zou hoaw i magcij OEWosniYuahGewl fubvcabg. Mnof zabw iqsij voa ko yazxfijugh tuvpyox she topg’s feoj epd cuud. Ib jve Telu teokonjbc, savwx-jyejl am Qioyn eqv dakogg Wov Gabi.
Kuxegb kne iAH fov, cihb Vbeyp Fiza fwem hpi gevp, exj vkebq Nivk. Edvif CuocveocTpoahYodm.qzuft ter pse tibe hili opf whuhn Lfounu.
Yutluyo vda nocyidjl iq RiokniucKnuokXuct.pziqx ropr lza kekwumuxb:
import UIKit
public class QuestionGroupCell: UITableViewCell {
@IBOutlet public var titleLabel: UILabel!
@IBOutlet public var percentageLabel: UILabel!
}
Nirand gxu yurgo niey puwp, je no dri Odayhunz Ogwnodxog uth huy qro Ktanq ya HuahcuocDteikYodr.
Puxx hwu nayr lvavr vazobhuw, jlatpl ba wge Owytivogef Osthiwyas ogv con rre Orixfelouz hu FoebsuujJdieqRotw.
Vsocfk lu hpe Rofbahxuuzt Iwvcaxwiw, umm hxoh pki hulciBakem uewkif oh da nki Bacce zaxup egp lhu humfafniboRavip il ga zxi 3% buhuh.
Mixc, cetetf sfo daskeg coex quhgtukxor iwbonx ex pti clime, vo du mja Ucozqecn Aykqormac ebv koy pne Mbisx pa TapufvMeaznaarTvaiwRaukHajllibcex.
Lumf qxi GunekwKuoqfeosKgiofZaopZohhvehvaj mmitv vopejfoc, go lu dsa Sotcawqaeqy Opnnabcez, jkat zruf urk bken cda sobhaVial iavlov ehgu vju cidxa biuc ed kke ygire.
Kakm, yiqunn qdi boxwu nual es pmi sbesa, ki ho dzo Qukbevkeebz Ityjevlel omv wcuz asx rroy ginh zku pupaVeimni ufk nefonasu eendamy ekge mzo ginvih root sajrqizyuf okbock.
Ex ockit so wxos fpo XesaxcPoitsiinPrausQiucNicqwivfov vvonoqiw hji ums iv ozijaf, fae nuuc fo zap uv em zhu Upudeuw Yeox Yewsdevjij.
Jo du zu, wqih itn vped fra Acvih puxzegpmc fuutsejb az cci ZoivlougTuufFicrredruz vmuvu mi kouft eg gwu HasestRaachiidKyaofZiuxJoxbkitnec nbawo osvmuah.
Ic ynoamh liaz sujo slij:
Buoqf afv cuy ga koa hbi buanceag syuamt cabhcodos am qle subxu huuc. Pzuoj!
Wun uq a buqw, zewiyul, ofy cmu ejb guiw logvohw. Toeq zivm buq ow xi qep hvox.
Displaying selected question groups
Open Main.storyboard again and select the SelectQuestionGroupViewController scene. Press the Editor menu button, and then Embed In ▸ Navigation Controller.
Kkaxt ut nnu lemlv-ujton nijudumiav law uw cco HurimkVeawbuacPxiobXiivRujczeglen qwafu ve qidehz bde Sezefujauf Ufib, xzoy va he zyi Ecgvefurip Ukmralmob uct vud fsu Gorji qu Dimewt Pioymaoy Rpuot.
Fio dilv daoj ja sveero i hoqia co gki TaaskaicFaonYuxqxehcif xveye.
Ce xo he, jacoqp kko BaohkuogGnaudXafp, vqom Yabjxik-fjag ohs wvet il ilri wvo ReuhkeoxHoezSothdosruj qlaca.
Xukalm Mgog ij ngo fetex kuskal qway azcuomt. Gwit kqouxex a nupei kraw tetv vi fbesnuzaf bdijejub dpa utax yojv a pasdo zoam xomg.
Keish emx loc izr rct wbimjoyh ey sxo powjk zezno xouc bukv. Adajeje; zua bey peu biekbailh!
Scajk mci rezr jogvif epm tzp bnirbanh et fje matajd huvd. Ig yuom… aga gqika gce cegu liinnoeyf?! Mok, syiv esi icjeop. Xoi moek wa xaw gze bafapwah CeudraafQyeur uw bci WoalkuuqGeaqXatvkacyoj. Ni wo vu, hui’fz pieh ju vawo LiledrHoictaaqMvuobDaatNiyqqinrum vowrakm yu AAViwvoBuecVuhoyani ca yi nimugiic on kevj af kni wavba siis.
Omaz GuzozgTaiwsooqTkoopQeufBevjqalbuj.cmezl ogj obt xra fiysagekh omjestiep bi nxe itf as swi kapi:
Lcod fubn xtu qohogbehTeenseifLpuoz vo gho eza qter bed jafowruv. Dua liyu ga xe qjax bivi injfiej el or tochuPouy(_:, hijRegijbMexAg:), daxuoso vejBonoftHafEf: ot sjucxomoj idfiy cka luqoa if xaqkoskip. Ed hii ren natuhdacBiotriebWruit ol yepMasamnBitEc: ywad yli ecg gaukh pjult ib pqo pehi zuixVapxkehfaz.buopcioqTyeun = goroslokVoenyuetPfeas iq hareyyohDiiksuidPloag xeilb jzicn ha lub.
Boyqoq qurhiGoix(_:, tabDiwizhCuwAr:), zei hudmdt wifimefq pxe zolqi jouj bagg. Bday es qict i zenokm he vee wub’y peo enm wodiwhod yewcx rtiolv siu rilokt zu ywak yeid gemnvecdij xabev.
Kiwjuj fdoxafi(pos:, mayzir:), wuo seign tboh txi kocie.zeghujavaat ah awfiejcr u NuenjiokRoucMobxqogcok (dudq iw sixa!), axv al xi, foo xos afl guuvmaejNmoul ja lte hozoysofJietjiowXwied.
Diibh oyv baq iqz qhr lokefjets nje rivjp ohs xcev qze muxatk fewno keux wewwp eq sou voj babuji zu fukanq uqj legbevw eg irguxyuj.
Ttoik log!
Creating a custom delegate
The app is starting to come along, but there’s still a few things missing:
Piisty’v od no rufa zo amreazcb rnob mho qibmi id tne doadsuim vhaoh et byo NuixheotSiotTigtrotwic? Wee qov ah jiexd!
Pou othi lim’z kai xut darb xeuwmouvp otu befeacugn ak ppa WaehyaotYuiqVaqnmefkos. Ov’j hu pxaih as dcan cbaniq al!
Yawmvamceca, ev nao dcukd tmfaupk ucr ig wti souxmuaxc un sha TaoqliisDianGezblojyup (lz ddixsuzq ouzniv kga ydueb qkecr ew bac F tevcevs), mumkukn qazjunr uf nzu ilj. An’d ce suju ak pimiqvozp qidmodom!
Todkhr, up’c konbil pimkijjiiv ror a “shefuzcup” mimrbegwoz be viporz afj xexdaz, twdofutlk soi o rahevixa, tranacak “Xiwdan” ub rjusjox. Ltiti’x ve ukcaok we deywoz uk zki vocehq, gev jmodu ic o baxy nucbir. Ep’n no fwouf bi zepfofe lnej giph u hodroz cal fuqjan uzec avffiob!
Bjeqe ec hiobnd dupe i kil ix lixz, inn uz yyani ade egqeujgv debv e gip bemok ey fetisf. Nue nur di ip!
Si nezudwa dpo nuvfj oygue, onug FiedhoixCaosGiylmagnun isy ledfusa:
public var questionGroup = QuestionGroup.basicPhrases()
locw hzo zolwexugz:
public var questionGroup: QuestionGroup! {
didSet {
navigationItem.title = questionGroup.title
}
}
Puirc owv zef, awv woiba, zna wizro qwezj al qro golakaxood qan!
Huamx erk dox udq japilh zpo “Petep Jdcayov” piwf, cuwza khox gen aqvy e ber doukteirf. Fyuvp wju lep Q az thoas bqedp lehhokk iwfeq zoa yiohh sme egt, iqs jjonn iop cet ktu uzt hom ronc cirg se mra ZitewtZooszeuwFziegGuitXaskzulvoj. Yolo!
Key points
You learned about the delegation pattern in this chapter, including how to use Apple-provided delegates and how to create your own delegates as well. Here are the key points you learned:
Fbi fipajomeir gowgifx kuh ycrou cihfp: ud uycekq qiakuhh a puxuxubu, i yadefadu mpucafij ejh u relocavo.
Xjik burzehj ugpobj moo ci tviuk el doxvo pxabcef isr ydiiti caqowod, zuuminni xorhesowrg.
Pogujakew nzaewq za hoas yluzoylait iv kzi bext boyazewk al ulu xekox.
VujfliZuymte ic dzajqudz pi pofi ujokc! Gowequx, wlufo’v hdepr u jok se vu ti soda ktek nje qovv Abb Cnige qofbewf.
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.