Как создать пустое приложение в Xcode без раскадровки


146

Xcode6удалил Empty Applicationшаблон при создании нового проекта. Как мы можем создать пустое приложение (без раскадровки) в Xcode6и выше, как в более ранних версиях?


3
codefromabove.com/2014/09/… , очень хороший урок для этого
Anurag Bhakuni

Прочитайте это: xcodenoobies.blogspot.my/2015/10/…
GeneCode

Обновленный учебник с iOS9 и Xcode 7: medium.com/frozen-fire-studios/…
Райан Пулос

Ответы:


270

В XCode6версиях и выше нет возможности напрямую создать пустое приложение, как в XCode5предыдущих версиях . Но все же мы можем создать приложение, не Storyboardвыполняя следующие действия:

  1. Создать Single View Application.
  2. Удалить Main.storyboardи LaunchScreen.xib(выберите их, щелкните правой кнопкой мыши и выберите либо удалить их из проекта, либо удалить их полностью).
  3. Удалите в Info.plistфайле записи «Основное имя файла основной раскадровки» и «Основное имя файла интерфейса экрана запуска» .
  4. Откройте AppDelegate.m и отредактируйте applicationDidFinishLaunchingWithOptions, чтобы он выглядел следующим образом:

Swift 3 и выше:

    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
Мне нравится хранить LaunchScreen.xibи соответствующую Info.plistзапись. Без этого приложение не будет занимать весь размер экрана на больших iPhone, что некрасиво.
tboyce12

2
Я сам люблю хранить раскадровку. Это удобно для создания различных вещей, но мне нужно выполнить первоначальную настройку, не полагаясь на раскадровки.
Мазёд

Возможно, ошибка в Xcode 7 Я вообще не смог удалить Main.storyboard с экрана настроек информации о проекте. Я использовал пустой шаблон приложения Xcode 5, как упомянуто @Silentwarrior.
GoodSp33d

3
Если вы вручную не установите корневой ViewController, этот ответ генерирует ошибку времени выполнения в XCode7: «NSInternalInconsistencyException», причина: «Ожидается, что окна приложений будут иметь корневой контроллер представления в конце запуска приложения»

11
Пожалуйста, добавьте этот код также: self.window.rootViewController = [[ViewController alloc] init]; в вашем AppDelegate.m под методом didFinishLaunchingWithOptions. В противном случае вы получите следующую ошибку: «Ожидается, что окна приложений будут иметь контроллер корневого представления в конце запуска приложения»
Rizwan Ahmed

32

Простой подход был бы скопировать XCode 5«ы Empty Applicationшаблон для XCode» ы шаблонов каталога.

Вы можете скачать XCode 5«s Empty Applicationшаблон из здесь , а затем распаковать его и скопировать в /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/Project Templates/iOS/Applicationкаталог.

PS этот подход работает и со swift!

Редактировать
Как предложено @harrisg в комментарии ниже, Вы можете поместить вышеупомянутый шаблон в ~/Library/Developer/Xcode/Templates/Project Templates/iOS/Application/папку, чтобы он мог быть доступен, даже если Xcode будет обновлен.
А если нет такого каталога нет, то вы , возможно , придется создать эту структуру каталогов: Templates/Project Templates/iOS/Application/в~/Library/Developer/Xcode/

Используя этот простой подход я в состоянии создать Empty Applicationин XCode 6. (Скриншот прилагается ниже)

Пустой шаблон приложения Xcode Надеюсь это поможет!


Спасибо. Как примечание вам нужно будет заменить этот шаблон после обновлений XCode.
elliotrock

1
Если вы поместите его в ~ / Library / Developer / Xcode / Templates / Project Templates / iOS / Application /, его не нужно будет заменять каждый раз при обновлении Xcode
harrisg

@harrisg не может найти этот каталог в Йосемити. Можете ли вы подтвердить свое присутствие? Спасибо
S1LENT WARRIOR

1
Этот подход работает с Xcode 7.1, однако LaunchScreen.storyboard создан, что некоторые могут не хотеть. Я закончил тем, что использовал это, поскольку это не мешает моим созданным вручную представлениям.
Битсанд

1
Не забудьте распаковать файл в каталог, копирование не достаточно.
Балабан Марио

17

Есть еще несколько шагов, которые вам нужно сделать:

  1. Добавить файл префикса. (Если вам это нужно)
  2. Чтобы добавить образ запуска по умолчанию, в противном случае размер приложения на iPhone 5 будет 320x480.

Итак, вот полный урок:

  1. удалить файл Main.storyboard
  2. удалить файл LaunchScreen.xib
  3. удалить свойство "Основное имя файла раскадровки" в Info.plist
  4. удалить свойство "Базовое имя файла интерфейса экрана запуска" в Info.plist
  5. добавьте файл «[app name] -Prefix.pch» во вспомогательные файлы с содержимым:

    #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. добавьте «$ SRCROOT / $ PROJECT_NAME / [имя файла pch]» в настройки проекта -> Настройки сборки -> Apple LLVM 6.0 - Язык -> «Заголовок префикса»

  7. добавьте «ДА» в настройки проекта -> Настройки сборки -> Apple LLVM 6.0 - Язык -> «Заголовок префикса прекомпиляции»
  8. откройте «Image.xcassets» и добавьте LaunchImage
  9. создайте проект, затем появится предупреждение об отсутствии изображения запуска по умолчанию, просто нажмите на предупреждение и выберите, чтобы добавить значение по умолчанию, это добавит «Default-568h @ 2x» ИЛИ - Если вы хотите использовать заставки из изображений .xcassets ", перейдите в настройки проекта -> ЦЕЛИ -> Общие -> в" Launch Images Source "выберите использовать каталог ресурсов, он создаст новый, затем вы можете выбрать, который использовать в качестве каталога активов из существующего ,
  10. реализовать 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;
    

16

Ответ Ахилса совершенно правильный. Для тех из нас, кто использует Swift, это будет выглядеть так:

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

  1. Прежде всего вам необходимо удалить Main.storyboard в меню навигатора проекта .
  2. Затем удалите строку Основное имя файла раскадровки в Info.plist .
  3. И не забудьте удалить основной интерфейс ячейки (просто удалите основной ) в вашей цели проекта - Общие - Информация о развертывании .
  4. После этого перейдите в AppDelegate.swift и в функции didFinishLaunchingWithOptions напишите следующее:

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

  1. Прежде всего вам необходимо удалить Main.storyboard в меню навигатора проекта .
  2. Затем удалите строку Основное имя файла раскадровки в Info.plist .
  3. И не забудьте удалить основной интерфейс ячейки (просто удалите основной ) в вашей цели проекта - Общие - Информация о развертывании .
  4. Этот шаг важен и не был в предыдущих версиях Xcode и Swift. В Info.plist перейдите к: Манифест сцены приложенияКонфигурация сценыРоль сеанса приложенияЭлемент 0 и удалите здесь строку Storyboard.name .
  5. После этого шага перейти к SceneDelegate и функции сцены написать следующее:

    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

Есть еще один шаг, который вам нужно сделать:

1) удалить основное имя файла раскадровки в файле 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
существует проблема с границами, UIScreen.mainScreen (). bounds распечатывается: (0.0,0.0,320.0,480.0). это почему?
Esqarrouth

9

Обновление: Swift 5 и iOS 13:

  1. Создайте приложение с одним представлением.
  2. Удалить Main.storyboard (щелкните правой кнопкой мыши и удалите).
  3. Удалите «Storyboard Name» из конфигурации сцены по умолчанию в файле Info.plist: введите описание изображения здесь
  4. Открыть SceneDelegate.swiftи изменить func sceneс:
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
Вы также должны удалить «Основное имя файла основной раскадровки» из Info.plist, в противном случае вы получите ошибку «Не удалось найти раскадровку с именем« Main »»
Зиад Хилал

6

У меня есть оригинальный шаблон пустого приложения, который использовался в версиях Xcode до Xcode 6. Я загрузил его здесь .

Вы можете либо загрузить его и вставить его в каталог шаблонов Xcode вручную, либо установить его, используя менеджер пакетов для Xcode, Alcatraz . Просто найдите Xcode Пустое приложение .


5

Удалить файл Main.storyboard

Это можно просто удалить.

Обновите файл ProjectName-Info.plist

Выньте Main storyboard base file nameключ.

Создайте nib-файл и ссылку на контроллер вида проекта

1.Создайте файл пера (Файл -> Создать -> Файл -> Просмотр)

2. Обновите File's Owner'sкласс до того, что называется контроллером представления проекта.

3.Связать File's Owner's viewрозетку с viewобъектом в файле пера

Обновите делегат приложения

1. Импортируйте заголовочный файл контроллера вида проекта

2. Обновите :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;
}

5

Для Xcode 8и Swift 3. Просто удалите .storyboardфайл, он автоматически удалит соответствующую ссылку из вашего .plistи в вашем AppDelegate.swiftдобавит следующий код.

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

Вы можете написать свой собственный ViewCountroller и использовать его в AppDelegate.swiftкачестве своего self.window?.rootViewController, просто замените UIViewController своим собственным ViewController в приведенном выше коде.


1
Используя Xcode 9.1 и Swift 4, если я просто удаляю файл раскадровки, не удаляя вручную соответствующую ссылку из .plist, я получаю ошибку «Не удалось найти раскадровку с именем« Main »в комплекте». Кажется, я должен удалить ссылку вручную.
мирный тип

3

Я использую XCode6 Beta, и я искал другое решение этой проблемы, добавив пустой шаблон из XCode5.xx в XCode6 Beta.

Для этого щелкните правой кнопкой мыши XCode5.xx в Приложениях, нажмите «Показать содержимое пакета» и скопируйте «Пустой Application.xctemplate» из указанного пути.

Содержание / Разработчик / Платформы / iPhoneOS.platform / Разработчик / Библиотека / Xcode / Шаблоны / Шаблоны проектов / Приложение

Теперь выйдите из окна и откройте заданный путь для XCode6

Содержание / Разработчик / Платформы / iPhoneOS.platform / Разработчик / Библиотека / Xcode / Шаблоны / Шаблоны проектов / iOS / Приложение /

Вставьте 'Empty Application.xctemplate' в папку приложения. Теперь перезапустите XCode6, выйдя и создайте новый проект. Вы получите опцию «Пустое приложение».

Теперь, когда я создаю новый пустой проект, в проект автоматически добавляется файл .pch (который мы должны добавить вручную в XCode6).

Надеюсь, это сработает


1

Да, или просто используйте одну из предыдущих бета-версий для ее создания и продолжите работу с последней версией после.



1

Другие уже объяснили, как избавиться от раскадровки, поэтому я пропущу эту тему здесь. Вот как я предпочитаю делать это в своем коде с меньшим количеством необязательных цепочек (написано в 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

обновление для Xcode 11 и ios 13. После того, как вы все настроили, но все еще видите черный экран, это потому, что жизненный цикл обрабатывается UISceneDelegate, а когда вы создаете новый проект, он автоматически генерирует UISceneDelegate.m и UISceneDelegate.h. Чтобы вернуться к прежним временам, прежде чем мы привыкнем к UISceneDelegate. следующие шаги могут помочь:

  1. удалите манифест сцены приложения в листе.

  2. удалить сценарий приложения Manifest.h и сценарий приложения Manifest.m

  3. удалить код под знаком #pragma - жизненный цикл UISceneSession в APPdelegate.m

  4. добавить @property (сильный, неатомный) UIWindow * window; в APPdelegate.h

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.