Cómo crear una aplicación vacía en Xcode sin Storyboard

Respuestas:

270

No hay una opción en las XCode6versiones y superiores para crear directamente una aplicación vacía como en XCode5y antes. Pero aún podemos crear una aplicación sin Storyboardseguir estos pasos:

  1. Crea a Single View Application.
  2. Eliminar Main.storyboardy LaunchScreen.xib(selecciónelos, haga clic con el botón derecho y elija eliminarlos del proyecto o eliminarlos por completo).
  3. Elimine las entradas "Nombre base del archivo de guión gráfico principal" y "Nombre base del archivo de interfaz de pantalla de inicio" en Info.plist archivo.
  4. Abra AppDelegate.m y edite applicationDidFinishLaunchingWithOptions para que se vea así:

Swift 3 y superior:

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool 
    {
        self.window = UIWindow(frame: UIScreen.main.bounds)
        self.window?.backgroundColor = UIColor.white
        self.window?.makeKeyAndVisible()
        return true
    }

Swift 2.x:

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool 
    {
        self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
        self.window?.backgroundColor = UIColor.whiteColor()
        self.window?.makeKeyAndVisible()
        return true
    }

C objetivo:

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
        // Override point for customization after application launch.
        self.window.rootViewController = [[ViewController alloc] init];
        self.window.backgroundColor = [UIColor whiteColor];
        [self.window makeKeyAndVisible];
        return YES;
    }
Akhil KC
fuente
22
Me gusta guardar LaunchScreen.xiby la Info.plistentrada correspondiente . Sin él, la aplicación no ocupará todo el tamaño de la pantalla en iPhones más grandes, lo cual es feo.
tboyce12
2
Me gusta mantener el Storyboard, yo mismo. Es conveniente para crear varias cosas, pero necesito hacer la configuración inicial sin depender de guiones gráficos.
Mazyod
Tal vez un error en Xcode 7 no pude eliminar Main.storyboard en absoluto de la pantalla de configuración de información del proyecto. Usé la plantilla de aplicación vacía Xcode 5 como mencionó @Silentwarrior.
GoodSp33d
3
A menos que instale manualmente un ViewController raíz, esta respuesta genera un error de tiempo de ejecución en XCode7: 'NSInternalInconsistencyException', razón: 'Se espera que las ventanas de la aplicación tengan un controlador de vista raíz al final del inicio de la aplicación'
11
Agregue también este Código: self.window.rootViewController = [[ViewController alloc] init]; en su AppDelegate.m bajo el método didFinishLaunchingWithOptions. O bien, recibirá el siguiente error: 'Se espera que las ventanas de la aplicación tengan un controlador de vista raíz al final del lanzamiento de la aplicación'
Rizwan Ahmed
32

Un enfoque simple sería copiar el XCode 5's Empty Applicationplantilla para XCode' s plantillas de directorio.

Puede descargar XCode 5la Empty Applicationplantilla desde aquí , luego descomprimirla y copiarla al /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/Project Templates/iOS/Applicationdirectorio.

PD: este enfoque también funciona con Swift.

Editar
Según lo sugerido por @harrisg en un comentario a continuación, puede colocar la plantilla mencionada anteriormente en la ~/Library/Developer/Xcode/Templates/Project Templates/iOS/Application/carpeta para que esté disponible incluso si se actualiza Xcode.
Y si no hay tal directorio presente, entonces es posible que deba crear esta estructura de directorio: Templates/Project Templates/iOS/Application/en~/Library/Developer/Xcode/

El uso de este enfoque simple que soy capaz de crear una Empty Applicationen XCode 6. (Captura de pantalla adjunta a continuación)

Plantilla de aplicación vacía de Xcode ¡Espero que esto ayude!

SOLDADO GUERRERO
fuente
Gracias. Como nota, deberá reemplazar esta plantilla después de las actualizaciones de Xcode.
elliotrock
1
Si lo coloca en ~ / Library / Developer / Xcode / Templates / Project Templates / iOS / Application / no tendrá que ser reemplazado cada vez que Xcode se actualice
harrisg
@harrisg no pudo encontrar este directorio en Yosemite. ¿Puedes confirmar su presencia? Gracias
S1LENT WARRIOR
1
Este enfoque funciona con Xcode 7.1, sin embargo, se crea LaunchScreen.storyboard que algunos pueden no querer. Terminé usándolo, ya que no interfiere con mis vistas creadas manualmente.
bitsand
1
Recuerde descomprimir el archivo en el directorio, la copia no es suficiente.
Balaban Mario
17

Hay algunos pasos más que debe seguir:

  1. Para agregar un archivo de prefijo. (Si lo necesitas)
  2. Para agregar una imagen de inicio predeterminada, de lo contrario, el tamaño de la aplicación será 320x480 en el iPhone 5.

Así que aquí hay un tutorial completo:

  1. eliminar el archivo Main.storyboard
  2. eliminar el archivo LaunchScreen.xib
  3. eliminar la propiedad "Nombre base del archivo del guión gráfico principal" en Info.plist
  4. eliminar la propiedad "Iniciar el nombre base del archivo de interfaz de pantalla" en Info.plist
  5. agregue el archivo "[nombre de la aplicación] -Prefix.pch" a los archivos de soporte con contenido:

    #import <Availability.h>
    
    #ifndef __IPHONE_3_0
    #warning "This project uses features only available in iOS SDK 3.0 and later."
    #endif
    
    #ifdef __OBJC__
    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>
    #endif
  6. agregue "$ SRCROOT / $ PROJECT_NAME / [pch file name]" a la configuración del proyecto -> Configuración de compilación -> Apple LLVM 6.0 - Idioma -> "Encabezado de prefijo"

  7. agregue "SÍ" a la configuración del proyecto -> Configuración de compilación -> Apple LLVM 6.0 - Idioma -> "Encabezado de prefijo de precompilación"
  8. abra "Image.xcassets" y agregue LaunchImage
  9. compila el proyecto, luego aparecerá una advertencia sobre la falta de imagen de inicio predeterminada, solo presiona la advertencia y selecciona para agregar la predeterminada, esto agregará "Default-568h @ 2x" O - Si quieres usar imágenes de bienvenida de "Imágenes .xcassets ", vaya a la configuración del proyecto -> OBJETIVOS -> General -> en" Iniciar fuente de imágenes "elija usar el catálogo de activos, creará uno nuevo, puede elegir luego, que usará como catálogo de activos del existente .
  10. application:didFinishLaunchingWithOptions:método de implementación :

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    //Override point for customization after application launch.
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    
    return YES;
Nikita
fuente
16

La respuesta de Akhils es totalmente correcta. Para aquellos de nosotros que usamos Swift, sería así:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
    self.window?.backgroundColor = UIColor.whiteColor()
    self.window?.makeKeyAndVisible()
    return true
}
Nils Hott
fuente
12

Xcode 9.3.1 y Swift 4

  1. En primer lugar, debe eliminar Main.storyboard en el menú del navegador de proyectos .
  2. Luego elimine el nombre base del archivo de guión gráfico principal de la fila en Info.plist .
  3. Y no olvide eliminar la interfaz principal de la celda (solo elimine Principal ) en su Objetivo de proyecto - General - Información de implementación .
  4. Después de esos pasos, vaya a AppDelegate.swift y en la función didFinishLaunchingWithOptions escriba lo siguiente:

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
    
        window = UIWindow(frame: UIScreen.main.bounds)
        window?.makeKeyAndVisible()
        window?.rootViewController = UINavigationController(rootViewController: ViewController())
    
        return true
    }

Xcode 11.2.1 y Swift 5

  1. En primer lugar, debe eliminar Main.storyboard en el menú del navegador de proyectos .
  2. Luego elimine el nombre base del archivo de guión gráfico principal de la fila en Info.plist .
  3. Y no olvide eliminar la interfaz principal de la celda (solo elimine Principal ) en su Objetivo de proyecto - General - Información de implementación .
  4. Este paso es importante y no estaba en versiones anteriores de Xcode y Swift. En Info.plist, vaya a: Manifiesto de escena de aplicaciónConfiguración de escena Rol de sesión de aplicaciónElemento 0 y elimine aquí la fila Storyboard.name .
  5. Después de esos pasos, vaya a SceneDelegate y en la escena de función escriba lo siguiente:

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
        // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
        // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
        guard let windowScene = (scene as? UIWindowScene) else { return }
    
        window = UIWindow(frame: windowScene.coordinateSpace.bounds)
        window?.windowScene = windowScene
        window?.rootViewController = ViewController()
        window?.makeKeyAndVisible()
    }
iAleksandr
fuente
10

Hay un paso más que debes hacer:

1) eliminar el nombre base del archivo del guión gráfico principal en el archivo plist

//AppDelegate.h


@property (strong, nonatomic) UIViewController *viewController;
@property (strong, nonatomic) UINavigationController *nav;

//AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {`enter code here`
    // Override point for customization after application launch.

    CGRect screenBounds = [[UIScreen mainScreen] bounds];

    UIWindow *window = [[UIWindow alloc] initWithFrame:screenBounds];


    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];



    self.viewController = [[UIViewController alloc] initWithNibName:@"ViewController" bundle:nil];

    self.nav = [[UINavigationController alloc] initWithRootViewController:self.viewController];

    [window setRootViewController:  self.nav];

    [window makeKeyAndVisible];

    [self setWindow:window];

    return YES;
}
Bhushan_pawar
fuente
2
hay un problema de límites, UIScreen.mainScreen (). límites se está imprimiendo: (0.0,0.0,320.0,480.0). ¿porqué es eso?
Esqarrouth
9

Actualización: Swift 5 y iOS 13:

  1. Crear una aplicación de vista única.
  2. Eliminar Main.storyboard (clic derecho y eliminar).
  3. Elimine "Nombre del guión gráfico" de la configuración de escena predeterminada en el archivo Info.plist: ingrese la descripción de la imagen aquí
  4. Abrir SceneDelegate.swifty cambiar func scenedesde:
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
    // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
    // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
    guard let _ = (scene as? UIWindowScene) else { return }
}

a

 func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
    // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
    // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).x

    if let windowScene = scene as? UIWindowScene {
        let window = UIWindow(windowScene: windowScene)
        window.rootViewController = ViewController()
        self.window = window
        window.makeKeyAndVisible()
    }
}
Eric Wiener
fuente
2
También debe eliminar "Nombre base del archivo del guión gráfico principal" de Info.plist, de lo contrario obtendrá el error "No se pudo encontrar un guión gráfico llamado 'Principal'"
Ziad Hilal
6

Tengo la plantilla de aplicación vacía original que se usó en las versiones de Xcode anteriores a Xcode 6. La he subido aquí .

Puede descargarlo y pegarlo en el directorio de plantillas de Xcode manualmente o instalarlo usando el administrador de paquetes para Xcode, Alcatraz . Simplemente busque Xcode Empty Application .

Isuru
fuente
5

Eliminar el archivo Main.storyboard

Esto simplemente se puede eliminar.

Actualice el archivo ProjectName-Info.plist

Retirar la Main storyboard base file namellave.

Cree un archivo plumín y enlace al controlador de vista del proyecto

1.Cree un archivo plumín (Archivo -> Nuevo -> Archivo -> Ver)

2. Actualice la File's Owner'sclase a lo que se llama el controlador de vista del proyecto

3.Enlace la File's Owner's viewsalida al viewobjeto en el archivo plumín

Actualiza el delegado de la aplicación

1.Importar el archivo de encabezado del controlador de vista del proyecto

2. Actualice el :didFinishLaunchingWithOptions:método de aplicación :

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    MyViewController *viewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];
    self.window.rootViewController = viewController;
    [self.window makeKeyAndVisible];
    return YES;
}
Bhargav
fuente
5

Para Xcode 8y Swift 3. Simplemente elimine el .storyboardarchivo, eliminará automáticamente la referencia correspondiente de usted .plisty en su AppDelegate.swiftagregará el siguiente código.

    let initialViewController = UIViewController()
    initialViewController.view.backgroundColor = .white
    window = UIWindow(frame: UIScreen.main.bounds)
    window?.rootViewController = initialViewController
    window?.makeKeyAndVisible()

Puede escribir su propio ViewCountroller personalizado y usarlo AppDelegate.swiftcomo su self.window?.rootViewController, simplemente reemplace el UIViewController con su propio ViewController en el código anterior.

Vakas
fuente
1
Usando Xcode 9.1 y Swift 4 si simplemente elimino el archivo del guión gráfico sin eliminar manualmente la referencia correspondiente de .plist, aparece el error "No se pudo encontrar un guión gráfico llamado 'Principal' en el paquete". Parece que debo eliminar la referencia manualmente.
paz
3

Estoy usando XCode6 Beta y busqué otra solución de este problema agregando una plantilla vacía de XCode5.xx a XCode6 Beta.

Para esto, haga clic derecho en XCode5.xx en Aplicaciones, haga clic en 'Mostrar contenido del paquete' y copie 'Empty Application.xctemplate' de la ruta dada

Contenidos / Desarrollador / Plataformas / iPhoneOS.platform / Desarrollador / Biblioteca / Xcode / Plantillas / Plantillas de proyectos / Aplicación

Ahora salga de la ventana y abra la ruta dada para XCode6

Contenido / Desarrollador / Plataformas / iPhoneOS.platform / Desarrollador / Biblioteca / Xcode / Plantillas / Plantillas de proyectos / iOS / Aplicación /

Pegue 'Empty Application.xctemplate' dentro de la carpeta de la aplicación. Ahora reinicie XCode6 al salir y crear un nuevo proyecto. Obtendrá la opción 'Aplicación vacía'.

Ahora, cuando estoy creando un nuevo proyecto vacío, se agrega automáticamente un archivo .pch en el proyecto (que tenemos que agregar manualmente en XCode6)

Espero que funcione

Gagan_iOS
fuente
1

Sí, o simplemente use una de las versiones beta anteriores para crearla, y continúe con la última versión después.

P1kachu
fuente
1

Otros ya han explicado cómo deshacerse del guión gráfico, por lo que omitiré ese aquí. Así es como prefiero hacerlo en mi código con menos encadenamiento opcional (escrito en Swift 3.1):

func application(_ application: UIApplication,
                 didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    let window = UIWindow(frame: UIScreen.main.bounds)
    window.backgroundColor = .white
    window.rootViewController = MyRootViewController()
    window.makeKeyAndVisible()
    self.window = window

    return true
}
DevAndArtist
fuente
1

actualizar en Xcode 11 y ios 13. Después de configurar todo pero aún ver una pantalla en negro, es porque el ciclo de vida lo maneja UISceneDelegate y cuando crea un nuevo proyecto, generará automáticamente UISceneDelegate.m y UISceneDelegate.h. Para volver a los viejos tiempos antes de acostumbrarnos a UISceneDelegate. Los siguientes pasos podrían ayudar:

  1. eliminar el Manifiesto de escena de aplicación en plist.

  2. eliminar Application Scene Manifest.h y Application Scene Manifest.m

  3. eliminar código bajo la marca #pragma - Ciclo de vida UISceneSession en APPdelegate.m

  4. agregue la ventana UIWindow * de @property (strong, nonatomic); en APPdelegate.h

Xiaofeng Zhou
fuente