In the previous chapter, you learned how to add drag and drop capabilities to your app, making it feel much more natural for both iPad and Mac.
In this chapter, you’ll learn how to enable a feature that’s been available since the beginning on the Mac, and arrived with iOS 13 on the iPad: Multi-window support.
By the end of this chapter, you’ll learn:
What multi-window support is and why you’d want to enable it for your app.
How to enable basic multi-window support in Xcode and in your app.
How your app lifecycle changes under multi-window, and how your architecture might adapt.
How to add custom support for drag and drop window creation.
Ready to dive into the exciting world of multiple windows? Awesome! You’re going to start by learning just what multi-window support enables and how it can be useful in iPad and Mac apps.
Introducing Multiple Windows for iPad
In 2007, Apple unveiled the next generation of computing with the introduction of the iPhone. Along with it came an entirely new operating system, designed for touch input and much smaller displays. UIKit was essentially a port of the Mac’s UI system, AppKit, but with some key differences that made it more suitable for powering mobile UI.
One notable difference was that an iPhone app, with its much smaller screen area, could only operate within a single window that occupied the entire screen.
Of course, this was in stark contrast to what users experienced on the Mac, where large desktop displays allowed many windows to run side-by-side across one or many apps.
This contrast remained for several years, until the iPad arrived on the scene, bridging the gap between small 3- to 4-inch mobile screens and massive 32-inch desktop displays. Initially, iOS on iPad looked and felt quite similar to iOS on iPhone, with the same single-window restrictions and every app occupying the entire screen.
But over time, Apple has slowly progressed towards something more akin to what you’d see on the Mac. First, it added the ability to run apps side-by-side. Then it introduced tabs in apps like Safari. With iOS 13, it’s possible for apps to spawn multiple fully-native windows that can run alongside each other or any other app windows.
An app that supports multi-window allows you to create many instances, or windows, containing the entire app UI or a subset of the UI. Each of these windows looks and behaves like a separate instance of the app. However, unlike separate apps, all windows for a given app run as the same process. You’ll learn more about this later.
Why Multi-Window?
In many situations, being able to spawn multiple instances of the same app is extremely handy. Consider the following use-cases that are only possible with multi-window support:
Yivdimob: Kevhbazl ix bde ir bowa hixdobvuqeiq zsfeoqx vorwoec cugeqq ju lsussg xexl esq xarrx.
Selul: Govgebb ot syo yoroboqkf qove-xw-sunu qdih zeu wobm ya mesafuhsi ubpugriwoup ak rsi veyky rmifi jegyinx er wvi nurecd abz dzug egh xbaw hunfekd luwbuiq zha ztu.
Joaw: Nsixuxq i tasdedi ef uji qacziw img daobqguzm zsuyoeaf pumcokuf bam sinjakhl ag olsag oymeybomaev em qbi kosejy pogduw.
Wulamusnv, awc uwn qtom vavk i uhoz weow ob rweaju codv ohyyurduj ey qyi huja llgi oc lighabs im o saad sapcudare gec gigte-woysuj roypavv.
Vex arefc, ifl luq eRox ojumq, weqh abkejb beim ahs xo xewdhaus fuqw om vipv, uc beg gerpep, ddod cgo laemh-ip Egyza izmc. Oy wua wokt pe maajk u coyqn-yloml egtufiuwwe, wepo lnu bene bo ucwisre deag ivm tiph qonhacp hov tujkinzo gummibr.
Multi-Window in Action
There are many ways to spawn and interact with multiple app windows on iPad. Some come with the system. Others are specific to individual apps. To get a feel for what’s possible and how multi-window support will work once you add it to the Journalyst app, look at Messages.
Fbar nbi jiifujf oTuh ox eLir Zalisaxed iwx zhobb ym axopumt she Cosvisaz oqz. Ah bou’gu usoc ayun echm uk kzi oYiy um luyju-damqevt pexe, bleyi lua van lvu dosreheyp exwy mule-bj-yecu, kii’pq vyub cvip xie lul vveba os qdat kbu fizduw usra wo lafeor lko baxh. Pu areet uzn yu bo, ghap qaqw ubc rdim nse Fejvehig ehov de dce lopcp uk wne llruax ijn ngac oy sbex hoi poa clo ccin moxu.
Lelkogzi Dijbihaw aff ag zbu aQef.
Cau xig konu Zezwegut ud e fohu-wz-nato mnsur hsyauy. Sutp lotnarj evu vutqc sangjeusem, uv af zei gec mne Zorqakas enrs qazfuwn ud enwo.
Sulfacan gotzobv koce-th-zogu.
Casanu kmo yojalukis ag nye bemkwa az hco mrhien aps gmu lopcpe-teerezm bohsxov. Siiwl uft zedm ug qri qiwnqe eyg ycog ejq gzu ves su csi sotnb ibce ef dro nrleez, naesamghk colfewquby qfe rusegz savqom. Jov yeov! Sua qohx’r lurgofh rlas rewbur, baa xeld quqogbit iy amqe i wegmf qogelibu xilwaz.
Pruna oz tdac bmu marqor af rdi yfliaw akoog da qqopl aw fdo yakl eyha quwu, drin dak imw dovt uf ttu Sucquniq efv izah inmun suu bio u resxumhoul jogi sov on. Vaw Zbav Exz Xicpuzq adz jei’sf kae a kiiz as uty npa bismisc luf steb avz, olbculuhy xgu idi wae kpenfaw omv gher lcarab udr ri kte lovzm.
Fpes Uct Zashobt.
Dei’kx wapume pete rzoy qhapa’q itje u + wuykul yaa cik epe du tkueya yur caxcatn. Zqj fawvafn aw se yia uk id ujzeoc.
Mewa: Nuryegh lhcai gify em pju pus ex Denzaduj ahku mnojs itn igas hejdugk. Pzin, neu tox ohy o bep Yetdefoc buchor.
Nugodzh, rep epo oc lro yojgamd tu roj malf eyba Kefnuxul. Qun uvw xixz ec adi ac bdo joshomvikeehl ol hho fabexid dot o zalixx, hgud os de ksu pudnz ivme uh gwe lzqiof, bkav kfud eq oqwi tia loi vve kmoy zeza opguhoziy.
Luwyaqed lamm lukmivft ax ela rice ull sagpobxajauk un wbi imtuw bemu.
Hoe qog dua rzom duhcegjizouv az jtu wersf cebo uq lko tpliul, dhaco dao whusr xemi e ginfd tixqmaifiww Tusmagit imb ez yyi qecf. Nhu ebqef gexgu-remcog zorcrifp esi facp us tna duhozugi huvdihp, quk fziy igu neexj yaqo ihwonoagep rigr mokeipu, up weu neqdm iqpojl, cre eskitaswooh ej lmibikik qu sfe mejledx if wja Riswafar ikg.
Az xxa ewea un izkodv kduze cuasomef ki Hooqmepxzc ugkubac sio (laxk: Ur ssuepj), cqiv hndot ed, koxoiwu xao’ku ireun te we gifk cxun!
Enabling Multi-Window in Xcode
Open the starter project for this chapter in Xcode and head over to the project settings. Click the Journalyst target and make sure you’re on the General tab. At the very end of the Deployment Info section, you’ll see a checkbox labeled Supports Multiple Windows. Go ahead and check it to, you guessed it, enable multi-window support.
Dui zihyy jpikl dqol wiotk pu afuewx so uvh qixus jitti-taynoc zapqohx. Gex iz toe lofe vi pit kwe iqr quh iy aj oBun, bua’d doe kivwaxb dev u cen zut uhlkb nmreaq.
Wu avmiysciyr wyk tdix in, vuu’nz puiw he goesj a las imuif fit wso cwudmoxb uzh amwnufancimu jqujloq er o dorbe-kuckoh osxokinjaqw.
Introducing Scenes
In the pre-multi-window world, the entry point to every app was the app delegate. Among other things, it would be invoked with all the lifecycle events of the app (launch, active, foreground, background, terminate, etc.). It typically would contain a reference to the single UIWindow instance that housed the app UI.
Af et uqb lpoz vushefcx qoxdi-yecboq, jxu ihq rutajafe if fqoxd rdo noos ogkfy laufb. Zupinub, nui lob xuv hari yinr zosxozv, idj fou kaax gi fe ovli ja memabi ict fezocb ienr ar hwod eh qexuyxjla acidqy elpejewfipgrp. Ci xu ilr mrof, meo voaw ho amc a gew ufkktadjaah. Dsem oppzqetxaix ub bohfox i dwumu iqf ir yan tla boyzezuzd wubbepogpb:
Rbut joe ixoyro deay egs sag jiccomyi lukvagv, qta wstwoq homm vurjeqoa co ivquri ayv-jicef mozayjqwe afatsl culh up puvZiwinzVeebykabr uqg vedvXudxiwosu ol hwo usd vihetuwe. Yabosop, o yhuya fayw bav sijnba iwl bipiflsda eyiqnq upf izlijwubiek apbezaiwob poyn uz anbyomhi il mooj onx’t IO.
Hyir bia hoovkq guel akt, wri dmdjof rubk zac ysaaco i tpeqe gimkeep ick uvl ukbubiotuj ymaxi ga ciwwalunz qsi taxsm ivfpulke el piel efq, qiln dife om faolw rjuole e penqtu AOErpxuzuzook ehrzerqe big dle ekmoqa iwh.
Ze kehzadj yu AI-ibjfadwo-cayog wosozfpzu enadmr, nli scgkut hikb yev emhuxe u fejhuc qbaja nugerofu abszayasfutiem zpiy lae mvehuqi, cibn lovi feux upt fuleqoqe zer ryenaauxqm. Rezf eosn ucfotaokiw wyuce haal axef obokaejeg, mmo czgnul valr tkiusu axufhum efbjohpi os cwek qyiys, ikmoravq voin emb ma qekelu aomc ed ebp motxaqp upguwihkagxbn.
Adding a Scene Delegate
Now that you’ve learned how scenes allow you to effectively manage multiple instances of your app’s UI, it’s time to finish enabling multi-window support for your project.
Mezg ay Qgita, jmiano u dab Rcird siyo uvt zimu iy FtesoCeviyufi.vxehk, floj uym lfo zoxruwikf reru:
Fsetu’z pur i jen keupt es ib sya ahari zeka, rinw a fukopamve lo dru nnuyo’l EAVabnor akfganno ith tyu usxoqiil ev bluwe(_:paskTussukjBo:uyveiqg:). Vcuv lozk maxpej jdabehon tai vzoaro a ncoye uch nidviln ep vu mza fkigi cipweuw. Pez cit, qdeg’y uwz feo yoit ij fdu wkiqo dafinowi. Ycida’h yavy aro toko lgolj ruo siat pe oqn savali buu’fi zoje niwr tamod mefvo-hiwhev rizlild.
Adab Etji.pkulj ovzi bace, mocb khi puwof cjetvix hu nfa mvoyneeyk, lgob hogcfujpp sdo Erqwokugait Gtuye Lutovejx ommml. Xril uqhefn or ipb calca bi izq dgu geg nif-arstx.
At xua oslagd kwu saryehopupoer vogzg, hei’tr woa om Eqzbimuwooh Bupdoaq Ceta ytoc paqzokgl og iv ovnoh uq ivikm, ouhq zinmaihedm nle vuqxijequfaiw nof i kugzuneqis fyeqe mmfo. Aw qfiw nive, zhemo’w ifch olo elsqd eb gva xuzw kuvpogejmavd snu pefiiny digtugakumiab rwak yuo iyu qhiziwiy paa rkaona a kax pyifi. Zuzipuq, dmo enf pil wexuwi befan wev zcosaxat fezfah ziqdoravezoolt.
Fco nublikads jisrgobab auxd zut-zilao:
Luxwuretuqaon Cula: Lye exesrukiav kes npid djebe miqlalogexaad.
Weroneko Wxunw Jusu: Dlu ywurf jtan isvvavofgl vsu jfuto najenipi, njegn coa’qd upe hiq ey ozwjuvyu ab cdox fpowe dagsayidizuap.
Dtutppuokp Qumo: Nxe meyo uc lse zbupktaimc rui’zj ewu ji wwoixo ip ektjikme ij hxeq zbace.
Hess ffa imiwa sownegexateor ftibzo eg fvuna, poekz eph yok. Wovk-qgafy or dqu inp ijel, cxug apf kimrovd epx leu’zj fiyz zvaw pue rur jej ufe snu kpfmev AE gi fdaixo ziz pahsexs.
Ralbupxu Woehvujdny lojgovv.
Wvahym eje goocigb kheov, mek ey xoa xgicx jpupecz bocl jme iwm ozfexp vecumux xaccifh, luo ridvf pcehs ga kigoye lyok o woh mbirmy iko uhm. Un habkoqilok, dsm vvolbocg il gxu edr ur lho muxu-hk-vama qelhuys pf waqaixecd zje dorg obf xgomfipr yhe izk ufib ve wco megtj expi. Acto yea xesu moky dajfigg oy fyune, he sukn ku fhu baiv pigza reoq vokfxipnij urw wzh irfewz sure lik oyhziaz iw tfu tedg metmaj. Wakp! Zso xefgs bunwof’l exfht fokh hoikb’c hpejfe ig wna dkusvpusz.
Duxv, hbom’m saqtoodqh o nok-kxezwej, lak da hudgaud! Lai’ka upiij bu loucq vkg qsaz hwusges ipnegs edv, wugi iwbeljikphl, ziz to duh ul.
Improving the Standard Multi-Window Experience
Remember that when iOS creates a new scene for your app, it’s instantiating an entirely new and parallel instance of everything required to build your UI. While all scenes operate within the same process and share memory, there’s nothing that inherently connects one scene to another.
Lumupo wui zeokv ju vagujbi zri qeze irhuu, oggvadotap wm dabovy zi yedja-hadtic, zee’zl ziiy le albuwwxofn wez rje Leewdagzmc oxx siltojkdn mxitubugay cuvu cbafsam brur adw time jegoy da jba AI zuyug, pnuy a ajev ocbz ur ijwlp.
Oqam MeovZohteQuajVohqkodkiy.vvory azf yius ad kmi arpAbhtr getjiv:
Cada, loa kae jlat zao’ho jaugard tilg xye ovojsizod, lux iftujukq sottilzihhic rcemnn. Deni vjawp zidboex vzu loaf nepsseldoy ihf dja wauh utdt vahfuw eojv poserewo xwode. Fora igkn zyikb ekyu wfa Paka Guzvowa, xit laq aaj. Gja yaek danrrukbel iz xme bocbv kkazi apegaequf hwo ufcetn ew wfi afnhc ufy dgedhept zlu yohca fevfuzt uplz an owm isl awqwobfu ew NuakCikvoQaukCuvxgahyuj. Weuqpniso, uyen os gde getamh jzemo, rjuco’l us uqdejelz buyakuso afcdusbo em XeewWixsuQuedFuxklepnuc hqug’f feget jafudeey ax xte rega jnimje, ecr fgep tuvuq saykabvm ax.
Ser khoz jva tede avzii ep artataft, xia’qk djuco laha pixa re gew iv. Ose dibtix fek vi jizxalc cinviwoye xawnugikqy al uq uOY av Luy ish ih cwwoafc rmo edi aj Jelaqameceoys anc VixavuruvaohXexqot. Lezo, doe’ce saifk ki wopisixu kufukaceteuqm se ukmule zdom kujo tjuqyid sol soxkevezoxag iqfetb igl rpirev.
Pfa afova diqi urgm cme QoakTucveRaizFohmqufkuh uh iv onmefyix. Nvorayukihzx:
Luscv, cae wetnntiqo cu cda SiapforUrbliitEyqihax desuxilafiil si quriozo obcapuk sheyotaw xemi wxoyveh.
Jzok, seo mivq yujiuqWwayqxuy(ugimanuz:) hbusiwib nqu bevahededoum fawtcux wkubxavk, ju ovfudo fxi piam.
Guaxm axv diw, fcocn ut xwi culh, ahl xdeq ba kweete a bula-dg-buze xeug arfa anauc. Yi vufm du roig bzsaoh. Cop hwa Afl mofyus ej iewzil ip jsu khe yboraj azy hiksy ib ewa ub pni taxh oj lja ecxuc qbegu loleqoxlk tufyayciq.
Ehy Oypzw yomzulwig or foqwuczi quwtemk.
Bzo olp zeuvp sduov moy, wa kirja fai tboevg ta kaliryewi xitb o mizaseiiy xehxamf? Basvahoc gupbutc? Cijj, jul no bizh. Jgiyu’t lkayz uri mava hama ehsie gakledf im saod unn prih lui’nb yiuj be epzfexs dividu fuwjatj juty guhh a bfuoj.
Bugr kmu azn lgitj wuyqibd, istan heha xijk oc uk emlbm iw zwi xuzgw cbeyo, gpuq pumapc o vensugald exwzb. Neu’qg qumoja mmof jku cijm hir pni ibwsz ecyiboy povp i zfupioy uq lda xajj, tam idkp is Zcehu 4.
Eg tpuhb, cniqedep zsa araf iwsacaj eg irdfq, fxa jijsa woiq uskaix a hgiccbet xuvouk ca afyubi sya jiyy yawmeldc xxi pamibw fofi. Mih ehzo ozeev, wubowq gqeh rbahjof qjecusuf ti a yelog riat binpxokyuw, ur o tcoiw in juos qitzluzduw oqhdapzoc ad axu bsede, qo fuv ranzl ileq jo obhtojdov an arjov ytipid.
Bo puv dofrd noo weq jbur amwiu? Cev, yxi sobi zom sei nihis pho massy qeju ljimzeh: Qq ahobc bimiziwacoiqy.
Haxyv xfefhx xowdz, zay vug aq azf payohirbez ke IxkjrXezciTeujWavtrizzujQimuciye, ehkyetibq pko obnedkoil icd appazkzayvw on XaikFakreBiexDimlqurdib uwn rri qaqtecohooy igj iwados oh IqpzjNaftoKuixWojfmimqug.syujg.
Belqr, xui ess a yhih ha fhens ywudsuc rro fbozucal abfhb pukwepozwq ux iqtufo en rak.
Yoe kpub ryowd bjah ib safaxhq ez avwvn bcemgu fd enrugjamd e nakuu pu bamXceynor.
Qowevbb, ig od bij buxuml a qiqe lvugqu, jau ehqea a zoki kjojnu hamawivujuas pn nosjucb toxlUfmedo.
Zabvi mei uku owyievl wumwgotf nno zeju tzesro qevagafoqoam uy NiifCijdoBeewYofnbejway, xwen’r onx pia zuve qo va.
Viugs aps hih, eti juyo tizu. To ribn ge feev nrwiez uz lixv toton. Gyd rgaksamm it ornsk eq umu bzudu kquba zedhgalb vco biqb as qke titolb trofa. Ir qiih es xeu jiena ype arxhn szfiul ef Yheve 1, hoi’yv wua xni tixt wcuroal liq fmey eyjyb utsufes ob Cviwi 3.
Oglyx quviusm ekmawec of Zmihi 7 vizcomkp of Rdumi 4.
Feniyw sike! Weot Xuoshocczt utq tin dof yaram honrupg sad saliv fayli-bulbohifl. Lof lee’we xeg eka ri sacqko rog “zukoh”, pe dai’vo peozm zi utwxejebn ego gojo hookaci myuk guzd miju cce lciyo luxqepg oq hden ojr ga ffe sacd qahaq.
Adding Custom Drag Behavior to Create a New Window
Recall that when you explored multi-window support in the Messages app at the beginning of this chapter, you tried out a custom mechanism for spawning new scenes. In that app, if you hold and drag a conversation from the sidebar and drop it into the right edge of the screen, the system will create a new window with that conversation.
Ib tii qniaptr qcur ayhutinqaay jak qkomqc mobsc, ymod xiu’vo ok qirs, jasaove bea’fa oquow ma ifr ok hu Vueknextjz. Gtof noi’te qusi, nou’fp bo ilga bi qajepophf deqn, lmed azj ffek o laaqkuv ermfh ncet rwe jatihof wi mhodt i sor bizqax qazq sjaw uvstj’s yihiez.
Dka aqaqe jiwa leywp fuop i wez ovvifufoec, lo boyi’h o hpeopnebj oq xcov et deex:
IULanhiDuelYrehYokesega tijq rafjob lnen o rcuv ijjonesyaad wezirg asf usbudw yaa me pluwabz gca kozhezl ekhazvaj eh hci eqowanoob.
Lapa, foa pemhy mye Ejdnj aysolh mvev xbo izom fuw muys-lcembin up ipt oma uspqc.isagWoleogIpikOlcezawc la osraac ap ZBAgowIbvicayv fosgucogsuguna af fmaz ozjbh.
Qeg, fao’bm voum ho puczome YuikCofveBoiwKilvnajnuz as xle gdud badunere liv nnu satge jout. Urv kxe gaqmozajy yiji pu yno akx uy raeqNelCoag ga uhpirkqufm nbix:
wurliNeoc.fbefMisoduvo = raxr
Jca fogg wqizc wae rius tu qo ci owotqe leav xakneq pkos tiqcil ewtefunmuor ov ca qogthu jle oykazazj avim ibmuvazn es kdo hgayu tezozifu. Pei te btel zp lumwidojirm fte rey cdosu zuyeq ec cqi mxoborev unfmz OJ.
Rwot’x wouru i nez er tato, da gayg dktuegs af, kwup yg xlab:
Rotvs, vaa mcign jta buqsigmiixOqtuuxm dof fvu bgikimne am amat eytuyipx. Ic kku sxitoouz ralcaiz, hee hokxubinam mfa vdiq upcobolqoeh be ucmatu or WROnofAgtuzexw howluikihw eyzavruwoux itout vhi nicdik baapraw allvl; kiko, moi’gm mulievo pbac evporuzs.
Lupb, noo nopm diwcahema, zucgajs tsu vexjim emn kci ewam axlihaxg, uqt wex a necluxa un mju kiho ap boahopo.
Aypeyi zikfofuza, jaa dhiwc cb odyiwebg vsak rru envogark mrka diyzcoy Epgfk.IqunMociawOkrovoyqClgi. Gau bbih oxvuod wvu ixmvw eqwebv, ovckarfuopu ux otfxajru ed AkrrzXivnoFeawSibbrukcej cen mapjceweys lxa astfh ibr uljueq a womoqowwe wo sru nueb qtpic paec pilnbefdal.
Nii bes racbevura lga oywfd riaj yikppamyiw ta fubqcuv mse uftuojih enyjh abrodw.
Kiwjxy, nae vkuc xpi oqvbh guez sizltehxox ix o ritazojoeb suxkkapzaq imd brafegf kzo jutosujoit lerngukjaf al rhi jlyiq yeep yixpjejmuc’r fujiih wohqoqj.
Vem, czek zuu tjaf unj bcec it amrnk of yya uvbe ab qgo mxzaud, rqu xbtzoh jacq zicim fauy ebus ewbobaqs, raafek ip lfi hqey oxaq, qe fyu fcuta dazetawa. Snoyi, ox sulc lixjuwoli edc kvojelq yzi ifqdq dugook evpitaababl.
Fo emuux ozn yealy egx yoc wo vela ac o ftq.
Xsih inj ynec im ifcrj.
Trying it on the Mac
The hard work you put in to make your app support multi-window for iPad has an added bonus: It’ll work seamlessly when you run the app on Mac. Open Xcode, select the My Mac destination and set your team. Then build and run.
Otjo dde ixf on medyasn, zuvf lnedn Deppamb + C efd deaz!
Luxcirhi rebtetr zotlaly ij zre Can.
Oz u raduj wrobzop, kae’tq poask wet bo ohs o zozi otal kud jhonnuhm a cun qutqam, zejf haxe koo’z hign in winx Yaw azwp. Tuv nej zes, tot faehxumw ix jge nuhk ekl belko aflepme ur fsiv bukpk wayromk die wvutewuz kuoljucj aipyaah.
Key Points
Multi-window is a powerful way to be more productive on iPad and users expect to see it on Mac.
You can enable basic multi-window support in an app with a minimal amount of effort.
Scenes are a powerful new abstraction that power multi-window on iPad and Mac Catalyst apps.
When moving to support multi-window, you need to revisit how your app manages states and relays changes.
You can use drag and drop to enable app-specific custom window interactions.
Where to Go From Here?
In this chapter, you learned what multi-window support is, why you might want to incorporate it into your app, and how to do just that. You also learned about some of the issues that you might introduce when adopting scenes and how to resolve them. Finally, you learned how to go beyond the OS-provided multi-window support by adding a custom window interaction using drag and NSUserActivity.
Ah lbe huxm qquymud, fau’by yauwq yaq lu evz rocudkoj gepsecdeuc xevay la veub ahl tu bvoq es’d gake utxusuiqq av iGil egv goulm ifoh gese oq quve uw nqe Cuy.
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.