So erstellen Sie eine leere Anwendung in Xcode ohne Storyboard

146

Xcode6hat die Empty ApplicationVorlage beim Erstellen eines neuen Projekts entfernt. Wie können wir eine leere Anwendung (ohne Storyboard) in Xcode6und darüber erstellen , wie in früheren Versionen?

Akhil KC
quelle
3
codefromabove.com/2014/09/… , ein sehr gutes Tutorial dafür
Anurag Bhakuni
Lesen Sie dies: xcodenoobies.blogspot.my/2015/10/…
GeneCode
Aktuelles Tutorial mit iOS9 und Xcode 7: medium.com/frozen-fire-studios/…
Ryan Poolos

Antworten:

270

In XCode6und über Versionen gibt es keine Option zum direkten Erstellen einer leeren Anwendung wie in XCode5und früher. Trotzdem können wir eine Anwendung erstellen, ohne die Storyboardfolgenden Schritte auszuführen:

  1. Ein ... kreieren Single View Application .
  2. Entfernen Main.storyboardundLaunchScreen.xib (wählen Sie sie aus, klicken Sie mit der rechten Maustaste und wählen Sie, ob Sie sie entweder aus dem Projekt entfernen oder vollständig löschen möchten).
  3. Entfernen Sie die Einträge "Name der Basis-Storyboard-Dateibasis" und "Name der Basisdatei der Bildschirmschnittstelle starten" in Info.plist Datei.
  4. Öffnen Sie AppDelegate.m und bearbeiten Sie applicationDidFinishLaunchingWithOptions so, dass es folgendermaßen aussieht:

Swift 3 und höher:

    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
    }

Ziel 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;
    }
Akhil KC
quelle
22
Ich behalte gerne LaunchScreen.xibden entsprechenden Info.plistEintrag. Ohne sie nimmt die App auf größeren iPhones nicht die gesamte Bildschirmgröße ein, was hässlich ist.
tboyce12
2
Ich mag es, das Storyboard selbst zu behalten. Es ist praktisch, um verschiedene Dinge zu erstellen, aber ich muss die Ersteinrichtung durchführen, ohne mich auf Storyboards verlassen zu müssen.
Mazyod
Möglicherweise ein Fehler in Xcode 7 Ich konnte Main.storyboard überhaupt nicht aus dem Bildschirm mit den Projektinformationseinstellungen entfernen. Ich habe die leere Xcode 5-Anwendungsvorlage verwendet, wie von @Silentwarrior erwähnt.
GoodSp33d
3
Sofern Sie einen Root-ViewController nicht manuell installieren, generiert diese Antwort einen Laufzeitfehler in XCode7: 'NSInternalInconsistencyException', Grund: 'Für Anwendungsfenster wird erwartet, dass am Ende des Anwendungsstarts ein Root-View-Controller vorhanden ist'
11
Bitte fügen Sie diesen Code auch hinzu: self.window.rootViewController = [[ViewController alloc] init]; in Ihrem AppDelegate.m unter didFinishLaunchingWithOptions-Methode. Andernfalls wird die folgende Fehlermeldung angezeigt: "Es wird erwartet, dass Anwendungsfenster am Ende des Anwendungsstarts einen Root-View-Controller haben"
Rizwan Ahmed,
32

Ein einfacher Ansatz wäre die kopieren XCode 5‚s - Empty ApplicationVorlageXCode ‘ s - Vorlagen - Verzeichnis.

Sie können XCode 5die Empty ApplicationVorlage von hier herunterladen , entpacken und in das /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/Project Templates/iOS/ApplicationVerzeichnis kopieren .

PS dieser Ansatz funktioniert auch mit schnell!

Bearbeiten
Wie von @harrisg in einem Kommentar unten vorgeschlagen, können Sie die oben genannte Vorlage in einem ~/Library/Developer/Xcode/Templates/Project Templates/iOS/Application/Ordner ablegen, damit sie auch dann verfügbar ist, wenn Xcode aktualisiert wird.
Und wenn kein solches Verzeichnis vorhanden ist, müssen Sie möglicherweise diese Verzeichnisstruktur erstellen: Templates/Project Templates/iOS/Application/in~/Library/Developer/Xcode/

Mit diesem einfachen Ansatz kann ich ein Empty ApplicationIn erstellen XCode 6. (Screenshot unten angehängt)

Xcode Leere Anwendungsvorlage Hoffe das hilft!

S1LENT WARRIOR
quelle
Vielen Dank. Als Hinweis müssen Sie diese Vorlage nach Xcode-Updates ersetzen.
Elliotrock
1
Wenn Sie es in ~ / Bibliothek / Entwickler / Xcode / Vorlagen / Projektvorlagen / iOS / Anwendung /
ablegen, muss
@harrisg konnte dieses Verzeichnis in Yosemite nicht finden. Können Sie seine Anwesenheit bestätigen? Danke
S1LENT WARRIOR
1
Dieser Ansatz funktioniert mit Xcode 7.1, es wird jedoch das LaunchScreen.storyboard erstellt, das einige möglicherweise nicht möchten. Ich habe es letztendlich verwendet, da es meine manuell erstellten Ansichten nicht beeinträchtigt.
Bitsand
1
Denken Sie daran, die Datei in das Verzeichnis zu entpacken. Das Kopieren reicht nicht aus.
Balaban Mario
17

Es gibt noch ein paar weitere Schritte, die Sie ausführen müssen:

  1. So fügen Sie eine Präfixdatei hinzu (Wenn du es brauchst)
  2. Um ein Standard-Startbild hinzuzufügen, beträgt die App-Größe auf dem iPhone 5 andernfalls 320 x 480.

Hier ist ein vollständiges Tutorial:

  1. Entfernen Sie die Datei Main.storyboard
  2. Entfernen Sie die Datei LaunchScreen.xib
  3. Entfernen Sie die Eigenschaft "Name der Basis-Storyboard-Dateibasis" in Info.plist
  4. Entfernen Sie die Eigenschaft "Startname der Bildschirmschnittstellendatei" in Info.plist
  5. Fügen Sie die Datei "[App-Name] -Prefix.pch" zu den unterstützenden Dateien mit Inhalten hinzu:

    #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. Fügen Sie "$ SRCROOT / $ PROJECT_NAME / [pch Dateiname]" zu den Projekteinstellungen hinzu -> Build-Einstellungen -> Apple LLVM 6.0 - Sprache -> "Präfix-Header"

  7. Fügen Sie "JA" zu den Projekteinstellungen hinzu -> Build-Einstellungen -> Apple LLVM 6.0 - Sprache -> "Precompile Prefix Header"
  8. Öffnen Sie "Image.xcassets" und fügen Sie LaunchImage hinzu
  9. Wenn Sie das Projekt erstellen, wird eine Warnung angezeigt, dass das Standardstartbild fehlt. Drücken Sie einfach auf die Warnung und wählen Sie, um das Standardbild hinzuzufügen. Dadurch wird "Standard-568h @ 2x" hinzugefügt. ODER - Wenn Sie Begrüßungsbilder aus "Bilder" verwenden möchten .xcassets ", gehen Sie zu den Projekteinstellungen -> ZIELE -> Allgemein -> wählen Sie unter" Bilderquelle starten "die Option" Asset-Katalog verwenden ". Es wird ein neuer erstellt. Sie können dann auswählen, welcher Asset-Katalog aus dem vorhandenen Katalog verwendet werden soll .
  10. Implementierungsmethode application:didFinishLaunchingWithOptions::

    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
quelle
16

Akhils Antwort ist völlig richtig. Für diejenigen von uns, die Swift verwenden, wäre es so:

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
quelle
12

Xcode 9.3.1 und Swift 4

  1. Zunächst einmal müssen Sie löschen Main.storyboard im Projektnavigator Menü.
  2. Löschen Sie dann den Basisnamen der Haupt-Storyboard-Datei in der Info.plist .
  3. Und vergessen Sie nicht, die Hauptschnittstelle der Zelle zu löschen (entfernen Sie einfach Main ) in Ihrem Projektziel - Allgemein - Bereitstellungsinformationen .
  4. Gehen Sie danach zu AppDelegate.swift und schreiben Sie in der Funktion didFinishLaunchingWithOptions das nächste:

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

  1. Zunächst einmal müssen Sie löschen Main.storyboard im Projektnavigator Menü.
  2. Löschen Sie dann den Basisnamen der Haupt-Storyboard-Datei in der Info.plist .
  3. Und vergessen Sie nicht, die Hauptschnittstelle der Zelle zu löschen (entfernen Sie einfach Main ) in Ihrem Projektziel - Allgemein - Bereitstellungsinformationen .
  4. Dieser Schritt ist wichtig und war in früheren Versionen von Xcode und Swift nicht vorhanden. In Info.plist gehen Sie zu: Anwendungs Szene ManifestSzene KonfigurationAnwendung Session RoleArtikel 0 und löschen hier Storyboard.name Reihe.
  5. Danach werden Schritte zu gehen SceneDelegate und in Funktion Szene schreiben die nächste:

    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
quelle
10

Es gibt noch einen Schritt, den Sie tun müssen:

1) Entfernen Sie den Basisnamen der Haupt-Storyboard-Datei in der Plist-Datei

//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
quelle
2
Es gibt ein Problem mit den Grenzen. UIScreen.mainScreen (). Die Grenzen werden ausgedruckt: (0,0,0,0,320,0,480,0). warum ist das so?
Esqarrouth
9

Update: Swift 5 und iOS 13:

  1. Erstellen Sie eine Single View-Anwendung.
  2. Main.storyboard löschen (Rechtsklick und Löschen).
  3. Löschen Sie "Storyboard Name" aus der Standard-Szenenkonfiguration in der Datei Info.plist: Geben Sie hier die Bildbeschreibung ein
  4. Öffnen SceneDelegate.swiftund ändern func scenevon:
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 }
}

zu

 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
quelle
2
Sie müssen auch "Basis-Storyboard-Dateibasisname" aus Info.plist löschen, sonst wird die Fehlermeldung "Ein Storyboard mit dem Namen" Main "konnte nicht gefunden werden"
Ziad Hilal
6

Ich habe die ursprüngliche Vorlage für leere Anwendungen, die in Xcode-Versionen vor Xcode 6 verwendet wurde. Ich habe sie hier hochgeladen .

Sie können es entweder herunterladen und manuell in das Xcode-Vorlagenverzeichnis einfügen oder mit dem Paketmanager für Xcode, Alcatraz, installieren . Suchen Sie einfach nach Xcode Empty Application .

Isuru
quelle
5

Entfernen Sie die Datei Main.storyboard

Dies kann einfach gelöscht werden.

Aktualisieren Sie die Datei ProjectName-Info.plist

Entfernen Sie den Main storyboard base file nameSchlüssel.

Erstellen Sie eine NIB-Datei und verknüpfen Sie sie mit dem View Controller des Projekts

1.Erstellen Sie eine NIB-Datei (Datei -> Neu -> Datei -> Ansicht)

2. Aktualisieren Sie die File's Owner's Klasse auf den View Controller des Projekts

3.Verbinden Sie den File's Owner's viewAusgang mit dem viewObjekt in der Nib-Datei

Aktualisieren Sie den App-Delegaten

1.Importieren Sie die Header-Datei des View Controllers des Projekts

2. Aktualisieren Sie die Anwendungsmethode :didFinishLaunchingWithOptions::

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

Für Xcode 8und Swift 3. Löschen Sie einfach die .storyboardDatei, sie löscht automatisch die entsprechende Referenz aus Ihrem .plistund AppDelegate.swiftfügen Sie den folgenden Code hinzu.

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

Sie können Ihren eigenen benutzerdefinierten ViewCountroller schreiben und diesen AppDelegate.swiftals Ihren verwenden self.window?.rootViewController. Ersetzen Sie einfach den UIViewController durch Ihren eigenen ViewController im obigen Code.

Vakas
quelle
1
Wenn ich mit Xcode 9.1 & Swift 4 einfach die Storyboard-Datei lösche, ohne die entsprechende Referenz manuell aus der .plist zu entfernen, wird die Fehlermeldung "Ein Storyboard mit dem Namen 'Main' im Bundle konnte nicht gefunden werden" angezeigt. Scheint, dass ich die Referenz manuell entfernen muss.
Friedenstyp
3

Ich verwende XCode6 Beta und habe nach einer anderen Lösung für dieses Problem gesucht, indem ich XCode6 Beta eine leere Vorlage von XCode5.xx hinzugefügt habe.

Klicken Sie dazu mit der rechten Maustaste auf XCode5.xx in Anwendungen. Klicken Sie auf "Paketinhalt anzeigen" und kopieren Sie "Leere Anwendung.xctemplate" aus dem angegebenen Pfad

Inhalt / Entwickler / Plattformen / iPhoneOS.platform / Entwickler / Bibliothek / Xcode / Vorlagen / Projektvorlagen / Anwendung

Verlassen Sie nun das Fenster und öffnen Sie den angegebenen Pfad für XCode6

Inhalt / Entwickler / Plattformen / iPhoneOS.platform / Entwickler / Bibliothek / Xcode / Vorlagen / Projektvorlagen / iOS / Anwendung /

Fügen Sie 'Empty Application.xctemplate' in den Anwendungsordner ein. Starten Sie nun XCode6 neu, indem Sie das Projekt beenden und ein neues Projekt erstellen. Sie erhalten die Option "Leere Anwendung".

Wenn ich jetzt ein neues leeres Projekt erstelle, wird automatisch eine .pch-Datei im Projekt hinzugefügt (die wir manuell in XCode6 hinzufügen müssen).

Hoffe es wird funktionieren

Gagan_iOS
quelle
1

Ja, oder verwenden Sie einfach eine der vorherigen Beta-Versionen, um sie zu erstellen, und fahren Sie anschließend mit der neuesten Version fort.

P1kachu
quelle
1

Andere haben bereits erklärt, wie man das Storyboard loswird, deshalb werde ich dieses hier überspringen. So ziehe ich es in meinem Code mit weniger optionaler Verkettung vor (geschrieben 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
}
DevAndArtist
quelle
1

Update auf Xcode 11 und iOS 13. Nachdem Sie alles eingestellt haben, aber immer noch einen schwarzen Bildschirm sehen, wird der Lebenszyklus von UISceneDelegate verwaltet. Wenn Sie ein neues Projekt erstellen, werden UISceneDelegate.m und UISceneDelegate.h automatisch generiert. Um zu den alten Zeiten zurückzukehren, bevor wir uns an UISceneDelegate gewöhnen. Folgende Schritte könnten helfen:

  1. Löschen des Anwendungsszenenmanifests in der Liste.

  2. Löschen Sie Application Scene Manifest.h und Application Scene Manifest.m

  3. Code unter #pragma mark - UISceneSession-Lebenszyklus in APPdelegate.m löschen

  4. @property (starkes, nichtatomares) UIWindow * -Fenster hinzufügen; in APPdelegate.h

Xiaofeng Zhou
quelle