Nejlepší odpověď
UIWindow je třída v UIKit, UI framework pro iOS (a tvOS a watchOS).
Když spustíte aplikaci, obvyklým postupem k zobrazení něčeho je vytvoření UIWindow, vytvoření UIViewController se zobrazením, které chcete zobrazit, a pak nastavte „root view controller“ UIWindow na UIViewController.
Pokud vytváříte aplikaci založenou na scénáři, je to pro vás hotové. Můžete nastavit „hlavní rozhraní“ a tento soubor .storyboard se načte jako řadič kořenového zobrazení. K tomuto UIWindow můžete přistupovat v AppDelegate.
Pokud nepoužíváte scénáře, potřebujete něco jako tento kus kódu
var window: UIWindow?
func application(\_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
window = UIWindow(frame: UIScreen.main.bounds)
let vc = CustomViewController()
window?.rootViewController = vc
window?.makeKeyAndVisible()
}
ve funkci didFinishLaunching AppDelegate vytvořte UIWindow a nastavte jeho řadič kořenového pohledu na vaši aplikaci. Všimněte si, že aby bylo UIWindow viditelné na obrazovce, stačí jej nastavit jako viditelné, na rozdíl od přidání jako subview nebo umístění do jiné hierarchie.
Obvykle se zobrazí více řadičů zobrazení jiné než řadič kořenového zobrazení, můžete je prezentovat modálně nebo použít ovladač navigace / karty, takže ve skutečnosti není spousta důvodů k vytvoření více oken ve vaší aplikaci.
Jedním z důvodů může být zobrazení upozornění nebo máte systém upozornění v aplikaci, kde chcete zobrazit prvek uživatelského rozhraní nad všemi ostatními ve vaší aplikaci (nad klávesnicí a některými systémovými výstrahami, kterým věřím).
Nebo pokud vaše aplikace skutečně využívá dvě obrazovky (tj. přes AirPlay), budete muset vytvořit nový UIWindow, nastavit jeho obrazovku na obrazovku sekundární, nastavit jeho řadič kořenového zobrazení a nastavit jej jako viditelný.
Chcete-li přímo adresovat vaše druhá otázka, předpokládám, že byste mohli přidat více UIWindows jako subviews pohledu řadiče pohledu (jako UIWindow dělá podtřídu UIView), ale to rozhodně není způsob, jakým se obvykle používají, a já opravdu nevím, jak by to vypadalo.
Odpověď
Za prvé, UIWindow nemá nic dělat se Swiftem. V žádném případě není součástí jazyka Swift. Je součástí rámce UIKit společnosti Apple, který je aktuálně výchozím rámcem uživatelského rozhraní pro iOS (a který brzy bude výchozím rámcem uživatelského rozhraní pro MacOS). UIViewController je také součástí UIKit.
UIWindow je to, co obsahuje uživatelské rozhraní vaší aplikace. Právě to odesílá události interakce uživatele do vašich zobrazení. Typická aplikace pro iOS má jediné UIWindow.
UIViewController neobsahuje žádný UIWindow objekty a bylo by to špatné designové rozhodnutí, pokud by se to stalo.
Doporučuji přečíst si dokumentaci: UIKit | Dokumentace pro vývojáře Apple