Как создать пустое приложение в 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 Надеюсь это поможет!

S1LENT WARRIOR
источник
Спасибо. Как примечание вам нужно будет заменить этот шаблон после обновлений 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()
    }
    
iAleksandr
источник
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;
}
Bhushan_pawar
источник
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 Пустое приложение .

Isuru
источник
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;
}
Bhargav
источник
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 в приведенном выше коде.

Vakas
источник
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).

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

Gagan_iOS
источник
1

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

P1kachu
источник
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
}
DevAndArtist
источник
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

Сяофэн Чжоу
источник