Mejor respuesta
UIWindow es una clase en UIKit, el marco de trabajo de la interfaz de usuario para iOS (y tvOS y watchOS).
Cuando inicia una aplicación, el proceso habitual para mostrar algo es crear una UIWindow, crear un UIViewController con la vista que desea mostrar, luego configurar el «controlador de vista raíz» de UIWindow en UIViewController.
Si está creando una aplicación basada en guiones gráficos, esto está hecho por usted. Puede configurar la «Interfaz principal», y ese archivo .storyboard se cargará como el controlador de vista raíz. Puede acceder a esta UIWindow en AppDelegate.
Si no está utilizando guiones gráficos, necesita algo como este fragmento de código
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()
}
en la función didFinishLaunching de AppDelegate para crear la UIWindow y configurar su controlador de vista raíz para su aplicación. Tenga en cuenta que para hacer que UIWindow sea visible en la pantalla, solo necesita configurarlo como visible, en lugar de agregarlo como una subvista o colocarlo en alguna otra jerarquía.
Por lo general, para mostrar más controladores de vista, otros que el controlador de vista raíz, puede presentarlos de manera modal o usar un controlador de navegación / pestaña, por lo que no hay muchas razones para crear más ventanas en su aplicación.
Una razón podría ser mostrar una alerta o tener un sistema de notificación en la aplicación, donde desea mostrar un elemento de la interfaz de usuario por encima de todo lo demás en su aplicación (por encima incluso del teclado y algunas alertas del sistema, creo).
O si su aplicación realmente aprovecha dos pantallas (es decir, a través de AirPlay), entonces necesitaría crear una nueva UIWindow, configurar su pantalla a la de la pantalla secundaria, configurar su controlador de vista raíz, luego configurarlo como visible.
Para direccionar directamente su segunda pregunta, supongo que podría agregar múltiples UIWindows como subvistas de la vista de un controlador de vista (como UIWindow hace una subclase UIView), pero ciertamente no es así como se usan normalmente, y realmente no sé cómo se vería.
Respuesta
En primer lugar, UIWindow no tiene nada que ver con Swift. No es parte del lenguaje Swift de ninguna forma o forma. Es parte del marco UIKit de Apple, que actualmente es el marco de IU predeterminado para iOS (y que pronto será el marco de IU predeterminado para MacOS). UIViewController también forma parte de UIKit.
Una UIWindow es lo que contiene la interfaz de usuario de su aplicación. Es lo que envía los eventos de interacción del usuario a sus vistas. Una aplicación iOS típica tiene una sola UIWindow.
Un UIViewController no contiene ningún UIWindow y sería una mala decisión de diseño si lo hiciera.
Recomiendo leer la documentación: UIKit | Documentación para desarrolladores de Apple