Chybějící příručka
pro vývoj ve Swiftu
Příručka, kterou bych si přál mít, když jsem začínal
Přidejte se k 20,000+ Vývojáři, kteří se učí o vývoji ve Swiftu
Stáhněte si bezplatnou kopii
Projekt Fotografie používá k návrhu a tvorbě řadičů zobrazení výhradně storyboardy. V této epizodě vám ukážu, že vzor koordinátoru není omezen na storyboardy. Vzor koordinátoru můžete použít i v případě, že dáváte přednost souborům XIB před storyboardy. Pokud raději nepoužíváte ani jedno, pak je to také možné. Nezáleží na tom, jakým způsobem navrhnete a vytvoříte řadiče pohledů svého projektu.
Začáteční projekt
Začáteční projekt z tohoto dílu je funkčně totožný s hotovým projektem z předchozího dílu. Existuje však několik rozdílů, na které chci upozornit. Třída TermsViewController
již nevyhovuje protokolu Storyboardable
a má nyní tři podtřídy: TermsViewControllerStoryboard
, TermsViewControllerXIB
a TermsViewControllerCode
.
Třída TermsViewControllerStoryboard
je totožná s třídou TermsViewController
z předchozího dílu. Uživatelské rozhraní třídy TermsViewControllerStoryboard
je definováno v souboru Main.storyboard. Instanci třídy můžeme vytvořit voláním metody instantiate()
protokolu Storyboardable
.
Uživatelské rozhraní třídy TermsViewControllerXIB
je definováno v souboru TermsViewControllerXIB.xib. Třída TermsViewControllerXIB
definuje statickou, proměnnou vlastnost nibName
, aby se zabránilo používání řetězcových literálů. To je podobné vlastnosti storyboardIdentifier
definované ve Storyboardable.swift.
Jak název napovídá, třída TermsViewControllerCode
nemá vazbu na storyboard nebo soubor XIB. Uživatelské rozhraní je vytvořeno v kódu. To má samozřejmě za následek poměrně velké množství kódu. Podívejme se na každý z těchto řadičů zobrazení a prozkoumejme, jak zapadají do vzoru koordinátor.
Storyboardy
Storyboardy existují již několik let a společnost Apple podporuje vývojáře v jejich používání. Storyboardy používám ve většině projektů, na kterých pracuji. Xcode automaticky vytvoří storyboard při vytvoření zcela nového projektu, ale důrazně doporučuji používat několik menších storyboardů místo jednoho velkého storyboardu. Použitím několika menších storyboardů se snáze vyhnete konfliktům při slučování a práce s menšími storyboardy je rychlejší a méně složitá.
Segmenty jsou klíčovou vlastností storyboardů, ale nikdy je nepoužívám v kombinaci se vzorem koordinátor. Segues je sice možné použít v kombinaci se vzorem koordinátor, ale segue zapojuje do toku aplikace řadič zobrazení a tomu se chceme vyhnout. Nezapomeňte, že o tok aplikace se starají koordinátory projektu. Kontrolér pohledu nemusí o toku aplikace nic vědět a nemusí vědět ani o jiných kontrolérech pohledu.
I bez segmentů mají storyboardy svou hodnotu. Středně velké až velké projekty vždy rozděluji na moduly. Každý modul má storyboard, který obsahuje řadiče pohledů daného modulu.
Otevřete soubor TermsCoordinator.swift a přejděte na metodu showTerms()
. Implementace je totožná s implementací hotového projektu z předchozího dílu. Jediným rozdílem je název třídy view controller. Koordinátor termínů instancuje třídu TermsViewControllerStoryboard
místo třídy TermsViewController
.
// MARK: - Helper Methodsprivate func showTerms() { // Initialize Terms View Controller let termsViewController = TermsViewControllerStoryboard.instantiate() // Install Handlers termsViewController.didCancel = { in self?.finish() } // Present Terms View Controller presentingViewController.present(termsViewController, animated: true)}
XIBs
Soubory XIB existují již od počátků vývoje Cocoa. Ve srovnání se storyboardy jim chybí několik funkcí, ale stále mají svou hodnotu. Soubory XIB používám především pro opakovaně použitelné komponenty, jako jsou buňky zobrazení tabulky a buňky zobrazení kolekce.
Otevřít podmínkyViewControllerXIB.xib. Uživatelské rozhraní třídy TermsViewControllerXIB
je totožné s uživatelským rozhraním třídy TermsViewControllerStoryboard
v Main.storyboard. Otevřete soubor TermsCoordinator.swift a znovu si prohlédněte metodu showTerms()
. Pro vytvoření instance třídy TermsViewControllerXIB
zavoláme inicializátor init(nibName:bundle:)
, kterému předáme název souboru XIB a odkaz na svazek obsahující soubor XIB.
// MARK: - Helper Methodsprivate func showTerms() { // Initialize Terms View Controller let termsViewController = TermsViewControllerXIB(nibName: TermsViewControllerXIB.nibName, bundle: .main) // Install Handlers termsViewController.didCancel = { in self?.finish() } // Present Terms View Controller presentingViewController.present(termsViewController, animated: true)}
Kód
Je také možné vytvořit uživatelské rozhraní řadičů zobrazení projektu v kódu. Pokud nemáte rádi storyboardy nebo soubory XIB, pak je to vaše jediná možnost. Od zavedení storyboardů jsem tuto možnost příliš nepoužíval, ale čas od času může být užitečná.
Vytvoření a inicializace řadiče zobrazení v kódu je užitečné, pokud má tento řadič zobrazení složité nebo dynamické uživatelské rozhraní. Vytváření a inicializace řadičů zobrazení v kódu má ještě jednu přesvědčivou výhodu. Umožňuje inicializační injekci, což je forma injekce závislostí. Injektování závislostí proberu v příštím díle.
Pro vytvoření instance třídy TermsViewControllerCode
vyvoláme inicializátor init()
. To je ekvivalentní volání inicializátoru init(nibName:bundle:)
a předání nil
pro oba argumenty.
// MARK: - Helper Methodsprivate func showTerms() { // Initialize Terms View Controller let termsViewController = TermsViewControllerCode() // Install Handlers termsViewController.didCancel = { in self?.finish() } // Present Terms View Controller presentingViewController.present(termsViewController, animated: true)}
Co dál?
Vzor koordinátor je flexibilní vzor. Nezáleží na tom, zda používáte storyboardy, soubory XIB nebo ani jedno z toho. Můžete používat segmenty, ale nezapomeňte, že pokud tak učiníte, porušíte základní princip vzoru koordinátor. Řadič zobrazení nemusí vědět o toku aplikace a neměl by vědět o jiných řadičích zobrazení.
.