Come creare un'applicazione vuota in Xcode senza Storyboard


146

Xcode6ha rimosso il Empty Applicationmodello durante la creazione di un nuovo progetto. Come possiamo creare un'applicazione vuota (senza Storyboard) in Xcode6e sopra, come nelle versioni precedenti?


3
codefromabove.com/2014/09/… , un ottimo tutorial per questo
Anurag Bhakuni,


Tutorial aggiornato con iOS9 e Xcode 7: medium.com/frozen-fire-studios/…
Ryan Poolos,

Risposte:


270

Non esiste alcuna opzione nelle XCode6versioni precedenti e superiori per la creazione diretta di un'applicazione vuota come nelle versioni XCode5precedenti. Ma possiamo ancora creare un'applicazione senza Storyboardseguire questi passaggi:

  1. Crea un Single View Application.
  2. Rimuovi Main.storyboarde LaunchScreen.xib(selezionali, fai clic con il pulsante destro del mouse e scegli di rimuoverli dal progetto o eliminarli completamente).
  3. Rimuovere le voci "Nome base file storyboard principale" e "Avvia nome base file interfaccia schermo" nel Info.plistfile.
  4. Apri AppDelegate.m e modifica applicationDidFinishLaunchingWithOptions in modo che sia simile al seguente:

Swift 3 e versioni successive:

    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
    }

Objective-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
Mi piace mantenere LaunchScreen.xibe la Info.plistvoce corrispondente . Senza di essa, l'app non occuperà l'intera dimensione dello schermo su iPhone più grandi, il che è brutto.
tboyce12,

2
Mi piace mantenere lo Storyboard, me stesso. È comodo per creare varie cose, ma devo fare la configurazione iniziale senza fare affidamento su storyboard.
Mazyod

Forse un bug in Xcode 7 non sono riuscito a rimuovere Main.storyboard dalla schermata delle impostazioni delle informazioni sul progetto. Ho usato il modello di applicazione vuota di Xcode 5 come menzionato da @Silentwarrior.
GoodSp33d,

3
A meno che non si installi manualmente un ViewController root, questa risposta genera un errore di runtime in XCode7: "NSInternalInconsistencyException", motivo: "Si prevede che Windows dell'applicazione abbia un controller di visualizzazione root alla fine del lancio dell'applicazione"

11
Aggiungi anche questo codice: self.window.rootViewController = [[ViewController alloc] init]; nel tuo AppDelegate.m con il metodo didFinishLaunchingWithOptions. Altrimenti si otterrà il seguente errore: "Si prevede che le finestre dell'applicazione abbiano un controller di visualizzazione radice alla fine del lancio dell'applicazione"
Rizwan Ahmed

32

Un approccio semplice sarebbe quello di copiare il XCode 5's Empty Applicationmodello di XCode' s cartella templates.

Puoi scaricare XCode 5il Empty Applicationmodello da qui , quindi decomprimerlo e copiarlo nella /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/Project Templates/iOS/Applicationdirectory.

PS questo approccio funziona anche con swift!

Modifica
Come suggerito da @harrisg in un commento qui sotto, puoi posizionare il modello sopra menzionato nella ~/Library/Developer/Xcode/Templates/Project Templates/iOS/Application/cartella in modo che possa essere disponibile anche se Xcode viene aggiornato.
E se non è presente tale directory, potrebbe essere necessario creare questa struttura di directory: Templates/Project Templates/iOS/Application/in~/Library/Developer/Xcode/

Utilizzando questo semplice approccio sono in grado di creare un Empty Applicationin XCode 6. (Schermata allegata di seguito)

Modello di applicazione vuoto Xcode Spero che questo ti aiuti!


Grazie. Come nota, dovrai sostituire questo modello dopo gli aggiornamenti di Xcode.
elliotrock,

1
Se lo metti in ~ / Library / Developer / Xcode / Templates / Project Templates / iOS / Applicazione / non dovrà essere sostituito ogni volta che aggiorna Xcode
harrisg,

@harrisg non è riuscito a trovare questa directory in Yosemite. Puoi confermare la sua presenza? Grazie
S1LENT WARRIOR

1
Questo approccio funziona con Xcode 7.1, tuttavia viene creato LaunchScreen.storyboard che alcuni potrebbero non desiderare. Ho finito per usarlo in quanto non interferisce con le mie viste create manualmente.
bitsand

1
Ricorda di decomprimere il file nella directory, la copia non è sufficiente.
Balaban Mario,

17

Ci sono alcuni altri passaggi che devi fare:

  1. Per aggiungere un file prefisso. (Se ne hai bisogno)
  2. Per aggiungere un'immagine di avvio predefinita, altrimenti la dimensione dell'app sarà 320x480 su iPhone 5.

Quindi ecco un tutorial completo:

  1. rimuovere il file Main.storyboard
  2. rimuovere il file LaunchScreen.xib
  3. rimuovere la proprietà "Nome base file storyboard principale" in Info.plist
  4. rimuovere la proprietà "Avvia nome base file interfaccia schermo" in Info.plist
  5. aggiungi il file "[nome app] -Prefix.pch" ai file di supporto con contenuti:

    #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. aggiungi "$ SRCROOT / $ PROJECT_NAME / [nome file pch]" alle impostazioni del progetto -> Impostazioni di costruzione -> Apple LLVM 6.0 - Lingua -> "Intestazione prefisso"

  7. aggiungi "SÌ" alle impostazioni del progetto -> Impostazioni di costruzione -> Apple LLVM 6.0 - Lingua -> "Precompila intestazione prefisso"
  8. apri "Image.xcassets" e aggiungi LaunchImage
  9. costruire il progetto, quindi verrà visualizzato un avviso relativo alla mancata immagine di avvio predefinita, basta premere l'avviso e selezionare per aggiungere il valore predefinito, questo aggiungerà "Default-568h @ 2x" OPPURE - Se si desidera utilizzare immagini splash da "Immagini .xcassets ", vai alle impostazioni del progetto -> OBIETTIVI -> Generale -> in" Avvia sorgente immagini "scegli di utilizzare il catalogo degli asset, ne creerà uno nuovo, potrai scegliere quindi, che utilizzare come catalogo degli asset dall'esistente .
  10. implementare application:didFinishLaunchingWithOptions:metodo:

    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 risposta di Akhils è totalmente corretta. Per quelli di noi che usano Swift, sarebbe così:

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 e Swift 4

  1. Prima di tutto devi eliminare Main.storyboard nel menu di navigazione di Project .
  2. Quindi eliminare la riga Nome base file storyboard principale in Info.plist .
  3. E non dimenticare di eliminare l' interfaccia principale della cella (basta rimuovere Main ) nella destinazione del progetto - Generale - Informazioni sulla distribuzione .
  4. Dopo questi passaggi vai su AppDelegate.swift e in funzione didFinishLaunchingWithOptions scrivi il seguente:

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

  1. Prima di tutto devi eliminare Main.storyboard nel menu di navigazione di Project .
  2. Quindi eliminare la riga Nome base file storyboard principale in Info.plist .
  3. E non dimenticare di eliminare l' interfaccia principale della cella (basta rimuovere Main ) nella destinazione del progetto - Generale - Informazioni sulla distribuzione .
  4. Questo passaggio è importante e non era nelle versioni precedenti di Xcode e Swift. In Info.plist andare a: Scena manifesto dell'applicazioneScena Configurazionesessione dell'applicazione RuoloVoce 0 ed eliminare qui Storyboard.name fila.
  5. Dopo questi passaggi vai a SceneDelegate e nella scena della funzione scrivi il seguente:

    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

C'è un altro passo che devi fare:

1) rimuovere il nome base del file dello storyboard principale nel file 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
c'è un problema con i limiti, UIScreen.mainScreen (). Stampa dei limiti: (0.0.0.0.320.0.480.0). perché?
Esqarrouth,

9

Aggiornamento: Swift 5 e iOS 13:

  1. Crea un'applicazione a vista singola.
  2. Elimina Main.storyboard (tasto destro del mouse ed elimina).
  3. Elimina "Nome storyboard" dalla configurazione della scena predefinita nel file Info.plist: inserisci qui la descrizione dell'immagine
  4. Apri SceneDelegate.swifte cambia func sceneda:
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 }
}

per

 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
Devi anche eliminare "Nome base file storyboard principale" da Info.plist, altrimenti otterrai l'errore "Impossibile trovare uno storyboard chiamato 'Main'"
Ziad Hilal

6

Ho il modello di applicazione vuoto originale che era utilizzato nelle versioni Xcode precedenti a Xcode 6. L'ho caricato qui .

Puoi scaricarlo e incollarlo manualmente nella directory del modello Xcode o installarlo utilizzando il gestore pacchetti per Xcode, Alcatraz . Cerca l' applicazione Xcode Empty .


5

Rimuovere il file Main.storyboard

Questo può essere semplicemente cancellato.

Aggiorna il file ProjectName-Info.plist

Rimuovi la Main storyboard base file namechiave.

Creare un file pennino e collegarlo al controller di visualizzazione del progetto

1.Creare un file pennino (File -> Nuovo -> File -> Visualizza)

2.Aggiorna la File's Owner'sclasse in qualunque modo venga chiamato il controller di visualizzazione del progetto

3.Collegare l' File's Owner's viewoutlet viewall'oggetto nel file pennino

Aggiorna il delegato dell'app

1.Importa il file di intestazione del controller di visualizzazione del progetto

2.Aggiorna il :didFinishLaunchingWithOptions:metodo dell'applicazione :

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

Per Xcode 8e Swift 3. Basta eliminare il .storyboardfile, eliminerà automaticamente il riferimento corrispondente dal tuo .pliste nel tuo AppDelegate.swiftaggiungere il seguente codice.

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

Puoi scrivere il tuo ViewCoolleroller personalizzato e utilizzarlo AppDelegate.swiftcome tuo self.window?.rootViewController, basta sostituire UIViewController con il tuo ViewController nel codice sopra.


1
Utilizzando Xcode 9.1 e Swift 4 se elimino semplicemente il file dello storyboard senza rimuovere manualmente il riferimento corrispondente da .plist, visualizzo un errore "Impossibile trovare uno storyboard chiamato 'Main' nel bundle". Sembra che devo rimuovere il riferimento manualmente.
peac

3

Sto usando XCode6 Beta e ho cercato un'altra soluzione di questo problema aggiungendo un modello vuoto da XCode5.xx a XCode6 Beta.

Per questo fare clic destro su XCode5.xx in Applicazioni fare clic su "Mostra contenuto pacchetto" e copiare "Svuota Application.xctemplate" dal percorso indicato

Contenuti / Sviluppatore / Piattaforme / iPhoneOS.platform / Sviluppatore / Libreria / Xcode / Modelli / Modelli di progetto / Applicazione

Ora esci dalla finestra e apri il percorso indicato per XCode6

Contenuti / Sviluppatore / Piattaforme / iPhoneOS.platform / Sviluppatore / Libreria / Xcode / Modelli / Modelli di progetto / iOS / Applicazione /

Incolla "Svuota Application.xctemplate" nella cartella dell'applicazione. Ora riavvia XCode6 chiudendo e crea un nuovo progetto. Otterrai l'opzione "Svuota applicazione".

Ora quando sto creando un nuovo progetto vuoto, un file .pch viene aggiunto automaticamente nel progetto (che dobbiamo aggiungere manualmente in XCode6)

Spero che funzioni


1

Sì, oppure utilizza una delle versioni beta precedenti per crearla e continua dopo l'ultima versione.



1

Altri hanno già spiegato come sbarazzarsi dello storyboard, quindi salterò su quello qui. È così che preferisco farlo nel mio codice con un concatenamento meno opzionale (scritto in 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

aggiornamento su Xcode 11 e iOS 13. Dopo aver impostato tutto ma ancora visualizzato una schermata nera, è perché il ciclo di vita è gestito da UISceneDelegate e quando si crea un nuovo progetto, genererà automaticamente UISceneDelegate.m e UISceneDelegate.h. Per tornare ai vecchi tempi prima di abituarci a UISceneDelegate. i seguenti passaggi potrebbero aiutare:

  1. elimina Application Scene Manifest in plist.

  2. elimina Application Scene Manifest.h e Application Scene Manifest.m

  3. elimina il codice sotto il segno #pragma - Ciclo di vita di UISceneSession in APPdelegate.m

  4. aggiungi la finestra UIWindow * di @property (strong, nonatomic); in APPdelegate.h

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.