Jak utworzyć pustą aplikację w Xcode bez Storyboard


146

Xcode6usunął Empty Applicationszablon podczas tworzenia nowego projektu. Jak możemy stworzyć pustą aplikację (bez Storyboard) w Xcode6i powyżej, tak jak we wcześniejszych wersjach?


3
codefromabove.com/2014/09/… , bardzo dobry tutorial do tego
Anurag Bhakuni


Aktualny samouczek z iOS9 i Xcode 7: medium.com/frozen-fire-studios/ ...
Ryan Poolos

Odpowiedzi:


270

W XCode6wersjach i nowszych nie ma opcji bezpośredniego tworzenia pustej aplikacji, jak w XCode5i wcześniejszych. Ale nadal możemy stworzyć aplikację bez, Storyboardwykonując następujące kroki:

  1. Utwórz plik Single View Application.
  2. Usuń Main.storyboardi LaunchScreen.xib(zaznacz je, kliknij prawym przyciskiem myszy i wybierz, czy chcesz je usunąć z projektu, czy całkowicie).
  3. Usuń wpisy „Nazwa bazowa pliku głównego storyboardu” i „Nazwa bazowa pliku interfejsu ekranu uruchamiania” z Info.plistpliku.
  4. Otwórz AppDelegate.m i edytuj applicationDidFinishLaunchingWithOptions tak, aby wyglądało to tak:

Swift 3 i nowsze:

    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
    }

Cel 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
Lubię zachować LaunchScreen.xibi odpowiedni Info.plistwpis. Bez tego aplikacja nie zajmie całego rozmiaru ekranu na większych iPhone'ach, co jest brzydkie.
tboyce 12

2
Sam lubię zachować Storyboard. Jest to wygodne do tworzenia różnych rzeczy, ale muszę przeprowadzić wstępną konfigurację bez polegania na scenorysach.
Mozyod

Może błąd w Xcode 7 Nie mogłem w ogóle usunąć Main.storyboard z ekranu ustawień informacji o projekcie. Użyłem pustego szablonu aplikacji Xcode 5, o czym wspomniał @Silentwarrior.
GoodSp33d

3
O ile nie zainstalujesz ręcznie głównego kontrolera ViewController, ta odpowiedź generuje błąd w czasie wykonywania w XCode7: `` NSInternalInconsistencyException '', powód: `` Oczekuje się, że okna aplikacji będą miały główny kontroler widoku na koniec uruchamiania aplikacji ''

11
Dodaj również ten kod: self.window.rootViewController = [[ViewControllerocation] init]; w AppDelegate.m w metodzie didFinishLaunchingWithOptions. W przeciwnym razie pojawi się następujący błąd: `` Oczekuje się, że okna aplikacji będą miały kontroler widoku root pod koniec uruchamiania aplikacji ''
Rizwan Ahmed

32

Podejście proste byłoby skopiować XCode 5„s Empty Applicationszablon do XCode” s szablony katalog.

Można pobrać XCode 5„s Empty Applicationszablon z tutaj , a następnie rozpakuj go i skopiować do /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/Project Templates/iOS/Applicationkatalogu.

PS to podejście działa również szybko!

Edytuj
Zgodnie z sugestią @harrisg w komentarzu poniżej, możesz umieścić wyżej wymieniony szablon w ~/Library/Developer/Xcode/Templates/Project Templates/iOS/Application/folderze, aby był dostępny nawet po zaktualizowaniu Xcode.
A jeśli nie ma takiego katalogu, może być konieczne utworzenie takiej struktury katalogów: Templates/Project Templates/iOS/Application/w~/Library/Developer/Xcode/

Korzystając z tego prostego podejścia, jestem w stanie stworzyć Empty Applicationw XCode 6. (Zrzut ekranu załączony poniżej)

Pusty szablon aplikacji Xcode Mam nadzieję że to pomoże!


Dzięki. Uwaga: po aktualizacji Xcode trzeba będzie zastąpić ten szablon.
elliotrock

1
Jeśli umieścisz go w ~ / Library / Developer / Xcode / Templates / Project Templates / iOS / Application /, nie będzie musiał być wymieniany za każdym razem, gdy Xcode aktualizuje
harrisg

@harrisg nie może znaleźć tego katalogu w Yosemite. Czy możesz potwierdzić jego obecność? Dzięki
S1LENT WARRIOR

1
To podejście działa z Xcode 7.1, jednak utworzono LaunchScreen.storyboard, którego niektórzy mogą nie chcieć. Skończyło się na tym, że go użyłem, ponieważ nie koliduje z moimi ręcznie utworzonymi widokami.
bits i

1
Pamiętaj, aby rozpakować plik do katalogu, kopiowanie nie wystarczy.
Balaban Mario

17

Musisz wykonać jeszcze kilka czynności:

  1. Aby dodać plik przedrostka. (Jeżeli tego potrzebujesz)
  2. Aby dodać domyślny obraz uruchamiania, w przeciwnym razie aplikacja będzie miała rozmiar 320 x 480 na iPhonie 5.

Oto pełny samouczek:

  1. usuń plik Main.storyboard
  2. usuń plik LaunchScreen.xib
  3. usuń właściwość „Nazwa bazowa pliku głównego storyboardu” w Info.plist
  4. usuń właściwość „Nazwa bazowa pliku interfejsu ekranu uruchamiania” w Info.plist
  5. dodaj plik „[nazwa aplikacji] -Prefix.pch” do plików pomocniczych z zawartością:

    #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. dodaj „$ SRCROOT / $ PROJECT_NAME / [nazwa pliku pch]” do ustawień projektu -> Ustawienia kompilacji -> Apple LLVM 6.0 - Język -> „Nagłówek prefiksu”

  7. dodaj „TAK” do ustawień projektu -> Ustawienia kompilacji -> Apple LLVM 6.0 - Język -> „Prekompiluj nagłówek prefiksu”
  8. otwórz „Image.xcassets” i dodaj LaunchImage
  9. zbuduj projekt, pojawi się ostrzeżenie o brakującym domyślnym obrazie startowym, po prostu naciśnij ostrzeżenie i wybierz, aby dodać domyślny, doda to "Default-568h @ 2x" LUB - Jeśli chcesz użyć obrazów powitalnych z "Obrazy .xcassets ”, przejdź do ustawień projektu -> CELE -> Ogólne -> w„ Uruchom źródło obrazów ”wybierz opcję użycia katalogu zasobów, utworzy nowy, możesz następnie wybrać, który będzie używany jako katalog zasobów z istniejącego .
  10. application:didFinishLaunchingWithOptions:metoda realizacji :

    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

Odpowiedź Achils jest całkowicie poprawna. Dla tych z nas, którzy używają Swift, wyglądałoby to tak:

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

  1. Przede wszystkim musisz usunąć Main.storyboard w menu nawigatora projektu .
  2. Następnie usuń wiersz Nazwa bazowa pliku głównego storyboardu w Info.plist .
  3. I nie zapomnij usunąć komórki Główny interfejs (po prostu usuń Główny ) w Twoim projekcie Cel - Ogólne - Informacje o wdrożeniu .
  4. Następnie przejdź do AppDelegate.swift iw funkcji didFinishLaunchingWithOptions napisz następną:

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

  1. Przede wszystkim musisz usunąć Main.storyboard w menu nawigatora projektu .
  2. Następnie usuń wiersz Nazwa bazowa pliku głównego storyboardu w Info.plist .
  3. I nie zapomnij usunąć głównego interfejsu komórki (po prostu usuń główny ) w miejscu docelowym projektu - Ogólne - Informacje o wdrożeniu .
  4. Ten krok jest ważny i nie był w poprzednich wersjach Xcode i Swift. W Info.plist przejdź do: Manifest sceny aplikacjiKonfiguracja scenyRola sesji aplikacjiPozycja 0 i usuń tutaj wiersz Storyboard.name .
  5. Następnie przejdź do SceneDelegate iw funkcji scena napisz następną:

    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

Jest jeszcze jeden krok, który musisz zrobić:

1) Usuń nazwę bazową pliku głównego storyboardu w pliku 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
jest problem z granicami, UIScreen.mainScreen (). bounds jest drukowane: (0.0,0.0,320.0,480.0). dlaczego?
Esqarrouth

9

Aktualizacja: Swift 5 i iOS 13:

  1. Utwórz aplikację z pojedynczym widokiem.
  2. Usuń Main.storyboard (kliknij prawym przyciskiem myszy i usuń).
  3. Usuń „Storyboard Name” z domyślnej konfiguracji sceny w pliku Info.plist: wprowadź opis obrazu tutaj
  4. Otwórz SceneDelegate.swifti zmień func scenez:
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 }
}

do

 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
Musisz także usunąć „nazwę bazową pliku storyboardu głównego” z Info.plist, w przeciwnym razie pojawi się błąd „Nie można znaleźć scenorysu o nazwie„ Główny ””
Ziad Hilal

6

Mam oryginalny szablon pustej aplikacji, który był używany w wersjach Xcode wcześniejszych niż Xcode 6. Wrzuciłem go tutaj .

Możesz go pobrać i wkleić ręcznie do katalogu szablonów Xcode lub zainstalować za pomocą menedżera pakietów dla Xcode, Alcatraz . Po prostu wyszukaj Xcode Empty Application .


5

Usuń plik Main.storyboard

Można to po prostu usunąć.

Zaktualizuj plik ProjectName-Info.plist

Wyjmij Main storyboard base file nameklucz.

Utwórz plik nib i połącz się z kontrolerem widoku projektu

1. Utwórz plik NIB (Plik -> Nowy -> Plik -> Widok)

2. Zaktualizuj File's Owner'sklasę do dowolnego wywoływanego kontrolera widoku projektu

3. Połącz File's Owner's viewwylot z viewobiektem w pliku nib

Zaktualizuj delegata aplikacji

1. Importuj plik nagłówkowy kontrolera widoku projektu

2. Zaktualizuj :didFinishLaunchingWithOptions:metodę aplikacji :

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

Dla Xcode 8i Swift 3. Po prostu usuń .storyboardplik, automatycznie usunie on odpowiednie odniesienie z twojego .plisti AppDelegate.swiftdodasz następujący kod.

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

Możesz napisać własny niestandardowy ViewCountroller i używać go AppDelegate.swiftjako swojego self.window?.rootViewController, po prostu zastąp UIViewController własnym ViewController w powyższym kodzie.


1
Używając Xcode 9.1 i Swift 4, jeśli po prostu usunę plik storyboardu bez ręcznego usuwania odpowiedniego odniesienia z .plist, pojawia się błąd „Nie można znaleźć scenorysu o nazwie„ Główny ”w pakiecie”. Wygląda na to, że muszę ręcznie usunąć odniesienie.
pokojowy

3

Używam XCode6 Beta i szukałem innego rozwiązania tego problemu, dodając pusty szablon z XCode5.xx do XCode6 Beta.

W tym celu kliknij prawym przyciskiem myszy XCode5.xx w aplikacjach, kliknij „Pokaż zawartość pakietu” i skopiuj „Empty Application.xctemplate” z podanej ścieżki

Zawartość / Programista / Platformy / iPhoneOS.platform / Developer / Library / Xcode / Templates / Project Templates / Application

Teraz zamknij okno i otwórz podaną ścieżkę dla XCode6

Spis treści / Programista / Platformy / iPhoneOS.platform / Developer / Library / Xcode / Templates / Project Templates / iOS / Application /

Wklej plik „Empty Application.xctemplate” do folderu aplikacji. Teraz zrestartuj XCode6, wychodząc i tworząc nowy projekt. Otrzymasz opcję „Pusta aplikacja”.

Teraz, gdy tworzę nowy pusty projekt, automatycznie dodawany jest plik .pch w projekcie (który musimy dodać ręcznie w XCode6)

Mam nadzieję, że to zadziała


1

Tak, lub po prostu użyj jednej z poprzednich wersji beta, aby ją utworzyć, a potem kontynuuj na najnowszej wersji.



1

Inni już wyjaśnili, jak pozbyć się storyboardu, więc pominę tutaj. W ten sposób wolę robić to w moim kodzie z mniejszą liczbą opcjonalnych łańcuchów (napisane w 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

aktualizacja na Xcode 11 i iOS 13. Po ustawieniu wszystkiego, ale nadal widzisz czarny ekran, dzieje się tak, ponieważ cykl życia jest obsługiwany przez UISceneDelegate i kiedy tworzysz nowy projekt, automatycznie generuje UISceneDelegate.m i UISceneDelegate.h. Aby wrócić do dawnych czasów, zanim przyzwyczailiśmy się do UISceneDelegate. następujące kroki mogą pomóc:

  1. usuń plik Manifest sceny aplikacji w plist.

  2. usuń Application Scene Manifest.h i Application Scene Manifest.m

  3. usuń kod pod znakiem #pragma - cykl życia UISceneSession w APPdelegate.m

  4. add @property (silne, nieatomowe) okno UIWindow *; w APPdelegate.h

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.