Comment créer une application vide dans Xcode sans Storyboard


146

Xcode6a supprimé le Empty Applicationmodèle lors de la création d'un nouveau projet. Comment créer une application vide (sans Storyboard) dans Xcode6et au-dessus, comme dans les versions antérieures?


3
codefromabove.com/2014/09/… , un très bon tutoriel pour cela
Anurag Bhakuni


Tutoriel à jour avec iOS9 et Xcode 7: medium.com/frozen-fire-studios/…
Ryan Poolos

Réponses:


270

Il n'y a pas d'option dans XCode6et au-dessus des versions pour créer directement une application vide comme dans XCode5et plus tôt. Mais nous pouvons toujours créer une application sans Storyboarden suivant ces étapes:

  1. Créez un Single View Application.
  2. Supprimez Main.storyboardet LaunchScreen.xib(sélectionnez-les, cliquez avec le bouton droit de la souris et choisissez de les supprimer du projet ou de les supprimer complètement).
  3. Supprimez les entrées «Nom de base du fichier de storyboard principal» et «Nom de base du fichier d'interface de l'écran de lancement» du Info.plistfichier.
  4. Ouvrez AppDelegate.m et modifiez applicationDidFinishLaunchingWithOptions pour qu'il ressemble à ceci:

Swift 3 et supérieur:

    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
    }

Objectif c:

    - (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;
    }

22
J'aime garder LaunchScreen.xibet l' Info.plistentrée correspondante . Sans cela, l'application ne prendra pas toute la taille de l'écran sur les iPhones plus grands, ce qui est moche.
tboyce12

2
J'aime garder le Storyboard moi-même. C'est pratique pour créer diverses choses, mais je dois faire la configuration initiale sans compter sur les storyboards.
Mazyod

Peut-être un bogue dans Xcode 7 je n'ai pas pu supprimer du tout Main.storyboard de l'écran des paramètres d'informations du projet. J'ai utilisé le modèle d'application vide Xcode 5 comme mentionné par @Silentwarrior.
GoodSp33d

3
Sauf si vous installez manuellement un ViewController racine, cette réponse génère une erreur d'exécution dans XCode7: `` NSInternalInconsistencyException '', raison: `` Les fenêtres d'application devraient avoir un contrôleur de vue racine à la fin du lancement de l'application ''

11
Veuillez également ajouter ce code: self.window.rootViewController = [[ViewController alloc] init]; dans votre AppDelegate.m sous la méthode didFinishLaunchingWithOptions. Sinon, vous obtiendrez l'erreur suivante: `` Les fenêtres d'application devraient avoir un contrôleur de vue racine à la fin du lancement de l'application ''
Rizwan Ahmed

32

Une approche simple serait de copier le XCode 5« s Empty Applicationmodèle à XCode» s modèles répertoire.

Vous pouvez télécharger XCode 5le Empty Applicationmodèle de ici , puis le décompresser et le copier dans le /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/Project Templates/iOS/Applicationrépertoire.

PS cette approche fonctionne également avec Swift!

Modifier
Comme suggéré par @harrisg dans un commentaire ci-dessous, vous pouvez placer le modèle mentionné ci-dessus dans un ~/Library/Developer/Xcode/Templates/Project Templates/iOS/Application/dossier afin qu'il soit disponible même si Xcode est mis à jour.
Et s'il n'y a pas de répertoire de ce type, vous devrez peut-être créer cette structure de répertoires: Templates/Project Templates/iOS/Application/dans~/Library/Developer/Xcode/

En utilisant cette approche simple, je suis capable de créer un fichier Empty Applicationin XCode 6. (Capture d'écran ci-dessous)

Modèle d'application vide Xcode J'espère que cela t'aides!


Merci. En guise de note, vous devrez remplacer ce modèle après les mises à jour de Xcode.
elliotrock

1
Si vous le mettez dans ~ / Library / Developer / Xcode / Templates / Project Templates / iOS / Application / il ne devra pas être remplacé à chaque mise à jour de Xcode
harrisg

@harrisg n'a pas pu trouver ce répertoire dans Yosemite. Pouvez-vous confirmer sa présence? Merci
S1LENT WARRIOR

1
Cette approche fonctionne avec Xcode 7.1, mais le LaunchScreen.storyboard est créé que certains peuvent ne pas vouloir. J'ai fini par l'utiliser car il n'interfère pas avec mes vues créées manuellement.
bitsand

1
N'oubliez pas de décompresser le fichier dans le répertoire, la copie ne suffit pas.
Balaban Mario

17

Vous devez suivre quelques étapes supplémentaires:

  1. Pour ajouter un fichier de préfixe. (Si tu en as besoin)
  2. Pour ajouter une image de lancement par défaut, sinon la taille de l'application sera de 320x480 sur iPhone 5.

Voici donc un tutoriel complet:

  1. supprimer le fichier Main.storyboard
  2. supprimer le fichier LaunchScreen.xib
  3. supprimer la propriété "Nom de base du fichier storyboard principal" dans Info.plist
  4. supprimer la propriété "Nom de base du fichier d'interface de l'écran de lancement" dans Info.plist
  5. ajoutez le fichier "[nom de l'application] -Prefix.pch" aux fichiers de support avec le contenu:

    #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. ajoutez «$ SRCROOT / $ PROJECT_NAME / [nom de fichier pch]» aux paramètres du projet -> Paramètres de construction -> Apple LLVM 6.0 - Langue -> «En-tête de préfixe»

  7. ajouter "OUI" aux paramètres du projet -> Paramètres de construction -> Apple LLVM 6.0 - Langue -> "En-tête de préfixe de précompilation"
  8. ouvrez "Image.xcassets" et ajoutez LaunchImage
  9. construire le projet, puis il y aura un avertissement concernant l'image de lancement par défaut manquante, appuyez simplement sur l'avertissement et sélectionnez pour ajouter la valeur par défaut, cela ajoutera "Default-568h @ 2x" OU - Si vous voulez utiliser des images de démarrage de "Images .xcassets ", allez dans les paramètres du projet -> TARGETS -> General -> dans" Launch Images Source "choisissez d'utiliser le catalogue d'actifs, il en créera un nouveau, vous pourrez ensuite choisir lequel utiliser comme catalogue d'actifs à partir de l'existant .
  10. application:didFinishLaunchingWithOptions:méthode de mise en œuvre :

    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;
    

16

La réponse d'Akhils est totalement correcte. Pour ceux d'entre nous qui utilisent Swift, ce serait comme ceci:

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
}

12

Xcode 9.3.1 et Swift 4

  1. Tout d'abord, vous devez supprimer Main.storyboard dans le menu du navigateur de projet .
  2. Puis supprimez la ligne Nom de base du fichier de storyboard principal dans Info.plist .
  3. Et n'oubliez pas de supprimer la cellule Main Interface (supprimez simplement Main ) dans votre Project Target - General - Deployment Info .
  4. Après ces étapes, accédez à AppDelegate.swift et dans la fonction didFinishLaunchingWithOptions, écrivez le suivant:

    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 et Swift 5

  1. Tout d'abord, vous devez supprimer Main.storyboard dans le menu du navigateur de projet .
  2. Puis supprimez la ligne Nom de base du fichier de storyboard principal dans Info.plist .
  3. Et n'oubliez pas de supprimer la cellule Main Interface (supprimez simplement Main ) dans votre Project Target - General - Deployment Info .
  4. Cette étape est importante et ne l'était pas dans les versions précédentes de Xcode et Swift. Dans Info.plist, accédez à: Manifeste de la scène d'applicationConfiguration de la scèneRôle de la session d'applicationÉlément 0 et supprimez ici la ligne Storyboard.name .
  5. Après cela, allez à SceneDelegate et dans la scène de fonction écrivez le suivant:

    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()
    }
    

10

Il y a une autre étape que vous devez faire:

1) supprimer le nom de base du fichier principal du storyboard dans le fichier 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;
}

2
il y a un problème de limites, UIScreen.mainScreen (). bounds imprime: (0.0,0.0,320.0,480.0). pourquoi donc?
Esqarrouth

9

Mise à jour: Swift 5 et iOS 13:

  1. Créez une application à vue unique.
  2. Supprimer Main.storyboard (clic droit et supprimer).
  3. Supprimez "Nom du storyboard" de la configuration de scène par défaut dans le fichier Info.plist: entrez la description de l'image ici
  4. Ouvrir SceneDelegate.swiftet changer func scenede:
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 }
}

à

 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()
    }
}

2
Vous devez également supprimer "Nom de base du fichier du storyboard principal" de Info.plist, sinon vous obtiendrez l'erreur "Impossible de trouver un storyboard nommé" Main ""
Ziad Hilal

6

J'ai le modèle original d'application vide qui a été utilisé dans les versions de Xcode avant Xcode 6. Je l'ai téléchargé ici .

Vous pouvez soit le télécharger et le coller manuellement dans le répertoire des modèles Xcode, soit l'installer à l'aide du gestionnaire de packages pour Xcode, Alcatraz . Recherchez simplement l' application Xcode Empty .


5

Supprimer le fichier Main.storyboard

Cela peut simplement être supprimé.

Mettre à jour le fichier ProjectName-Info.plist

Retirez la Main storyboard base file nameclé.

Créer un fichier nib et créer un lien vers le contrôleur de vue du projet

1.Créez un fichier nib (Fichier -> Nouveau -> Fichier -> Afficher)

2.Mettez à jour la File's Owner'sclasse sur le nom du contrôleur de vue du projet

3.Liez la File's Owner's viewprise à l' viewobjet dans le fichier nib

Mettre à jour le délégué d'application

1. importez le fichier d'en-tête du contrôleur de vue du projet

2.Mettez à jour la :didFinishLaunchingWithOptions:méthode d' application :

- (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;
}

5

Pour Xcode 8et Swift 3. Supprimez simplement le .storyboardfichier, il supprimera automatiquement la référence correspondante de votre .plistet dans votre AppDelegate.swiftajouter le code suivant.

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

Vous pouvez écrire votre propre ViewCountroller personnalisé et l'utiliser en AppDelegate.swifttant que votre self.window?.rootViewController, remplacez simplement UIViewController par votre propre ViewController dans le code ci-dessus.


1
En utilisant Xcode 9.1 et Swift 4, si je supprime simplement le fichier du storyboard sans supprimer manuellement la référence correspondante de .plist, j'obtiens une erreur "Impossible de trouver un storyboard nommé 'Main' dans le bundle". Semble que je dois supprimer la référence manuellement.
peacetype

3

J'utilise XCode6 Beta et j'ai cherché une autre solution à ce problème en ajoutant un modèle vide de XCode5.xx à XCode6 Beta.

Pour ce clic droit sur XCode5.xx dans Applications, cliquez sur `` Afficher le contenu du package '' et copiez `` Empty Application.xctemplate '' à partir du chemin donné

Contenu / Développeur / Plateformes / iPhoneOS.platform / Développeur / Bibliothèque / Xcode / Modèles / Modèles de projet / Application

Maintenant, quittez la fenêtre et ouvrez le chemin donné pour XCode6

Contenu / Développeur / Plateformes / iPhoneOS.platform / Développeur / Bibliothèque / Xcode / Modèles / Modèles de projet / iOS / Application /

Collez 'Empty Application.xctemplate' dans le dossier Application. Redémarrez maintenant XCode6 en quittant et créez un nouveau projet. Vous obtiendrez l'option «Application vide».

Maintenant, lorsque je crée un nouveau projet vide, un fichier .pch automatiquement ajouté dans le projet (que nous devons ajouter manuellement dans XCode6)

J'espère que cela fonctionnera


1

Oui, ou utilisez simplement l'une des versions bêta précédentes pour le créer et continuez avec la dernière version après.



1

D'autres ont déjà expliqué comment se débarrasser du storyboard, je vais donc sauter sur celui-ci ici. C'est ainsi que je préfère le faire dans mon code avec moins de chaînage optionnel (écrit 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
}

1

mise à jour sur Xcode 11 et ios 13. Une fois que tout est configuré mais que vous voyez toujours un écran noir, c'est parce que le cycle de vie est géré par UISceneDelegate et lorsque vous créez un nouveau projet, il génère automatiquement UISceneDelegate.m et UISceneDelegate.h. Pour revenir à l'ancien temps avant de nous habituer à UISceneDelegate. les étapes suivantes pourraient aider:

  1. supprimer le manifeste de la scène d'application dans plist.

  2. supprimer Application Scene Manifest.h et Application Scene Manifest.m

  3. supprimer le code sous la marque #pragma - Cycle de vie UISceneSession dans APPdelegate.m

  4. ajouter @property (forte, non atomique) UIWindow * window; dans APPdelegate.h

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.