The Missing Manual
for Swift Development
The Guide I Wish I Have When I Started Out
Join 20,000+ Developers Learning About Swift Development
Download Your Free Copy
A Photos projekt kizárólag storyboardokat használ a nézetvezérlők tervezéséhez és létrehozásához. Ebben az epizódban megmutatom, hogy a koordinátor minta nem korlátozódik a storyboardokra. Akkor is használhatja a koordinátor mintát, ha a storyboardok helyett az XIB fájlokat részesíti előnyben. Ha inkább egyiket sem szeretné használni, akkor az is lehetséges. Nem számít, hogyan tervezi meg és hozza létre a projektje nézetvezérlőit.
Starter Project
A jelen epizód induló projektje funkcionálisan megegyezik az előző epizód kész projektjével. Van azonban néhány különbség, amire szeretnék rámutatni. Az TermsViewController
osztály már nem felel meg a Storyboardable
protokollnak, és most már három alosztálya van: TermsViewControllerStoryboard
, TermsViewControllerXIB
és TermsViewControllerCode
.
A TermsViewControllerStoryboard
osztály azonos az előző epizód TermsViewController
osztályával. A TermsViewControllerStoryboard
osztály felhasználói felülete a Main.storyboardban van definiálva. Az osztály példányát a Storyboardable
protokoll instantiate()
metódusának meghívásával tudjuk példányosítani.
A TermsViewControllerXIB
osztály felhasználói felületét a TermsViewControllerXIB.xib-ben definiáljuk. A TermsViewControllerXIB
osztály definiál egy statikus, változó tulajdonságot, a nibName
-t, a string literálok használatának elkerülése érdekében. Ez hasonló a Storyboardable.swiftben definiált storyboardIdentifier
tulajdonsághoz.
Amint a neve is mutatja, a TermsViewControllerCode
osztálynak nincs kapcsolata egy storyboardhoz vagy egy XIB fájlhoz. A felhasználói felület a kódban jön létre. Ez nyilvánvalóan jóval több kódot eredményez. Nézzük meg az egyes nézetvezérlőket, és vizsgáljuk meg, hogyan illeszkednek a koordinátormintába.
Storyboardok
A storyboardok már évek óta léteznek, és az Apple ösztönzi a fejlesztőket a használatukra. Én a legtöbb projektben, amin dolgozom, storyboardokat használok. Az Xcode automatikusan létrehoz egy storyboardot, amikor egy teljesen új projektet hoz létre, de erősen ajánlom, hogy egyetlen nagy storyboard helyett több kisebb storyboardot használjon. Több kisebb storyboard használatával könnyebben elkerülhetők az egyesítési konfliktusok, és a kisebb storyboardokkal való munka gyorsabb és kevésbé bonyolult.
A szekvenciák a storyboardok egyik legfontosabb jellemzője, de én soha nem használom őket a koordinátor mintával együtt. Bár lehetséges a szegue-ok használata a koordinátor mintával kombinálva, egy szegue bevonja a nézetvezérlőt az alkalmazás áramlásába, és ezt szeretnénk elkerülni. Ne feledjük, hogy a projekt koordinátorai kezelik az alkalmazásfolyamot. A nézetvezérlőnek nem kell tudnia semmit az alkalmazásfolyamról, és nem kell tudnia más nézetvezérlőkről.
A storyboardoknak még szegue-k nélkül is megvan a maguk értéke. A közepes és nagy projekteket mindig modulokra bontom. Minden modulnak van egy storyboardja, amely tartalmazza a modul nézetvezérlőit.
Nyissuk meg a TermsCoordinator.swift fájlt, és navigáljunk a showTerms()
metódushoz. Az implementáció megegyezik az előző epizód kész projektjével. Az egyetlen különbség a nézetvezérlő osztály neve. A Terms Coordinator a TermsViewController
osztály helyett a TermsViewControllerStoryboard
osztályt példányosítja.
// 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
XIB fájlok már a Cocoa fejlesztés kezdete óta léteznek. Néhány funkció hiányzik belőlük a storyboardokhoz képest, de még mindig megvan az értékük. A XIB-eket elsősorban újrafelhasználható komponensekhez használom, például a táblázatnézeti cellákhoz és a gyűjteménynézeti cellákhoz.
Open TermsViewControllerXIB.xib. A TermsViewControllerXIB
osztály felhasználói felülete megegyezik a Main.storyboard TermsViewControllerStoryboard
osztályéval. Nyissa meg a TermsCoordinator.swift fájlt, és nézze meg újra a showTerms()
metódust. A TermsViewControllerXIB
osztály példányának létrehozásához hívjuk meg a init(nibName:bundle:)
inicializálót, átadva az XIB fájl nevét és egy hivatkozást az XIB fájlt tartalmazó csomagra.
// 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)}
Code
A projekt nézetvezérlőinek felhasználói felületét is létrehozhatjuk kódban. Ha nem szereted a storyboardokat vagy az XIB fájlokat, akkor ez az egyetlen lehetőséged. A storyboardok bevezetése óta nem nagyon használom ezt a lehetőséget, de időről időre hasznos lehet.
A nézetvezérlő kódban történő létrehozása és inicializálása akkor hasznos, ha a nézetvezérlőnek összetett vagy dinamikus felhasználói felülete van. A nézetvezérlők kódban történő létrehozása és inicializálása egy másik meggyőző előnnyel is jár. Lehetővé teszi az inicializáló injektálást, a függőségi injektálás egy formáját. A függőségi injektálást a következő epizódban tárgyalom.
A TermsViewControllerCode
osztály egy példányának létrehozásához meghívjuk a init()
inicializálót. Ez egyenértékű a init(nibName:bundle:)
inicializáló meghívásával és a nil
átadásával mindkét argumentumként.
// 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)}
Mi következik?
A koordinátor minta egy rugalmas minta. Nem számít, hogy storyboardokat, XIB fájlokat vagy egyiket sem használjuk. Használhatsz szegue-okat, de ne feledd, hogy ezzel megsérted a koordinátor-minta egyik alapelvét. Egy nézetvezérlőnek nem kell tudnia az alkalmazás áramlásáról, és nem szabad tudnia más nézetvezérlőkről.