Como criar um aplicativo vazio no Xcode sem o Storyboard


146

Xcode6removeu o Empty Applicationmodelo ao criar um novo projeto. Como podemos criar um aplicativo vazio (sem Storyboard) dentro Xcode6e acima, como nas versões anteriores?


3
codefromabove.com/2014/09/... , um tutorial muito bom para este
Anurag Bhakuni


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

Respostas:


270

Não há opção nas XCode6versões e acima para criar diretamente um Aplicativo Vazio como em XCode5e anteriores. Mas ainda podemos criar um aplicativo sem Storyboardseguir estas etapas:

  1. Crie um Single View Application.
  2. Remova Main.storyboarde LaunchScreen.xib(selecione-os, clique com o botão direito do mouse e escolha removê-los do projeto ou excluí-los completamente).
  3. Remova as entradas "Nome principal da base do arquivo do storyboard" e "Iniciar nome da base do arquivo da interface da tela" no Info.plistarquivo.
  4. Abra AppDelegate.m e edite applicationDidFinishLaunchingWithOptions para que fique assim:

Swift 3 e acima:

    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
    }

Objetivo-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
Eu gosto de manter LaunchScreen.xibe a Info.plistentrada correspondente . Sem ele, o aplicativo não ocupará todo o tamanho da tela em iPhones maiores, o que é feio.
tboyce12

2
Eu também gosto de manter o Storyboard. É conveniente para criar várias coisas, mas preciso fazer a configuração inicial sem depender de storyboards.
precisa saber é o seguinte

Talvez um bug no Xcode 7 não tenha conseguido remover o Main.storyboard da tela de configurações de informações do projeto. Usei o modelo de aplicativo vazio do Xcode 5, como mencionado por @Silentwarrior.
30339 GoodSp33d

3
A menos que você instale manualmente um ViewController raiz, esta resposta gera um erro de tempo de execução no XCode7: 'NSInternalInconsistencyException', motivo: 'Espera-se que as janelas do aplicativo tenham um controlador de exibição raiz no final do lançamento do aplicativo'

11
Por favor, adicione este código também: self.window.rootViewController = [[ViewController assign] init]; no seu AppDelegate.m sob o método didFinishLaunchingWithOptions. Ou então, você receberá o seguinte erro: 'Espera-se que as janelas do aplicativo tenham um controlador de exibição raiz no final do lançamento do aplicativo'
Rizwan Ahmed 17/17

32

Uma abordagem simples seria a de copiar o XCode 5's Empty Applicationmodelo para XCode' s modelos de diretório.

Você pode fazer XCode 5o download do Empty Applicationmodelo aqui , descompacte-o e copie-o para o /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/Project Templates/iOS/Applicationdiretório.

PS essa abordagem funciona com rapidez também!

Editar
Conforme sugerido por @harrisg em um comentário abaixo, você pode colocar o modelo acima mencionado na ~/Library/Developer/Xcode/Templates/Project Templates/iOS/Application/pasta para que ele esteja disponível mesmo que o Xcode seja atualizado.
E se não houver esse diretório presente, talvez seja necessário criar esta estrutura de diretório: Templates/Project Templates/iOS/Application/em~/Library/Developer/Xcode/

Usando esta abordagem simples, sou capaz de criar um Empty Applicationarquivo XCode 6. (Captura de tela anexada abaixo)

Modelo de aplicativo vazio do Xcode Espero que isto ajude!


Obrigado. Como observação, você precisará substituir este modelo após a atualização do Xcode.
elliotrock

1
Se você colocá-lo em ~ / Library / Developer / Xcode / modelos / modelos de projeto / iOS / Aplicação / ela não terá de ser substituído cada vez que atualizações Xcode
harrisg

@harrisg não conseguiu encontrar este diretório em Yosemite. Você pode confirmar sua presença? Obrigado
S1LENT WARRIOR

1
Essa abordagem funciona com o Xcode 7.1, no entanto, o LaunchScreen.storyboard é criado que alguns podem não querer. Acabei usando-o, pois não interfere com minhas visualizações criadas manualmente.
bitsand

1
Lembre-se de descompactar o arquivo no diretório, copiar não é suficiente.
Balaban Mario

17

Há mais algumas etapas que você precisa executar:

  1. Para adicionar um arquivo de prefixo. (Se você precisar)
  2. Para adicionar uma imagem de inicialização padrão, caso contrário, o tamanho do aplicativo será 320x480 no iPhone 5.

Então, aqui está um tutorial completo:

  1. remover o arquivo Main.storyboard
  2. remover o arquivo LaunchScreen.xib
  3. remova a propriedade "Nome principal da base do arquivo do storyboard" no Info.plist
  4. remova a propriedade "Iniciar o nome da base do arquivo da interface da tela" no Info.plist
  5. adicione o arquivo "[app name] -Prefix.pch" aos arquivos de suporte com conteúdo:

    #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. adicione "$ SRCROOT / $ PROJECT_NAME / [nome do arquivo pch]" às configurações do projeto -> Configurações de compilação -> Apple LLVM 6.0 - Idioma -> "Prefixo do cabeçalho"

  7. adicione "SIM" às configurações do projeto -> Configurações da compilação -> Apple LLVM 6.0 - Idioma -> "Cabeçalho do prefixo de pré-compilação"
  8. abra "Image.xcassets" e adicione LaunchImage
  9. compilar o projeto, haverá um aviso sobre a falta da imagem de inicialização padrão, basta pressionar o aviso e selecionar para adicionar o padrão; isso adicionará "Default-568h @ 2x" OU - Se você quiser usar imagens de splash de "Imagens .xcassets ", vá para as configurações do projeto -> ALVOS -> Geral -> em" Iniciar fonte de imagens ", escolha usar o catálogo de ativos, ele criará um novo, você pode escolher então, que usar como catálogo de ativos existente .
  10. implementar application:didFinishLaunchingWithOptions:método:

    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

A resposta de Akhils está totalmente correta. Para aqueles de nós que usam o Swift, seria assim:

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. Antes de tudo, você precisa excluir Main.storyboard no menu do Project navigator .
  2. Em seguida, exclua a linha Nome principal da base do arquivo do storyboard em Info.plist .
  3. E não se esqueça de excluir a interface principal da célula (basta remover a principal ) em seu Projeto - Geral - Informações de implantação .
  4. Após essas etapas, vá para AppDelegate.swift e, na função didFinishLaunchingWithOptions, escreva o seguinte:

    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. Antes de tudo, você precisa excluir Main.storyboard no menu do Project navigator .
  2. Em seguida, exclua a linha Nome principal da base do arquivo do storyboard em Info.plist .
  3. E não se esqueça de excluir a interface principal da célula (basta remover a principal ) em seu Projeto - Geral - Informações de implantação .
  4. Esta etapa é importante e não estava nas versões anteriores do Xcode e Swift. No Info.plist, vá para: Manifesto de cena do aplicativoConfiguração da cenaFunção da sessão do aplicativoItem 0 e exclua aqui a linha Storyboard.name .
  5. Após essas etapas, vá para SceneDelegate e, na cena da função , escreva o seguinte:

    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

Há mais uma etapa que você precisa executar:

1) remova o nome da base do arquivo principal do storyboard no arquivo 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
há um problema de limites, UIScreen.mainScreen (). limites está imprimindo: (0.0,0.0.320.0.480.0). por que é que?
Esqarrouth

9

Atualização: Swift 5 e iOS 13:

  1. Crie um aplicativo de exibição única.
  2. Exclua Main.storyboard (clique com o botão direito e exclua).
  3. Exclua "Nome do storyboard" da configuração de cena padrão no arquivo Info.plist: insira a descrição da imagem aqui
  4. Abra SceneDelegate.swifte mude func scenede:
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 }
}

para

 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
Você também precisa excluir "Nome da base do arquivo do storyboard principal" do Info.plist, caso contrário, receberá o erro "Não foi possível encontrar um storyboard chamado 'Main'"
Ziad Hilal

6

Eu tenho o modelo original de Aplicativo Vazio que foi usado nas versões do Xcode anteriores ao Xcode 6. Fiz o upload aqui .

Você pode baixá-lo e colá-lo no diretório de modelos do Xcode manualmente ou instalá-lo usando o gerenciador de pacotes do Xcode, Alcatraz . Basta procurar o aplicativo Xcode Empty .


5

Remova o arquivo Main.storyboard

Isso pode ser simplesmente excluído.

Atualize o arquivo ProjectName-Info.plist

Retire a Main storyboard base file namechave.

Crie um arquivo de ponta e vincule ao controlador de visualização do projeto

1.Crie um arquivo de ponta (Arquivo -> Novo -> Arquivo -> Exibir)

2.Atualize a File's Owner'sclasse para o nome do controlador de exibição do projeto

3.Ligue a File's Owner's viewtomada ao viewobjeto no arquivo da ponta

Atualize o delegado do aplicativo

1.Importe o arquivo de cabeçalho do controlador de exibição do projeto

2.Atualize o :didFinishLaunchingWithOptions:método de aplicação :

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

Para Xcode 8e Swift 3. Apenas exclua o .storyboardarquivo, ele excluirá automaticamente a referência correspondente do seu .pliste no seu AppDelegate.swiftadicione o seguinte código.

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

Você pode escrever seu próprio ViewCountroller personalizado e usá-lo AppDelegate.swiftcomo seu self.window?.rootViewController, basta substituir o UIViewController pelo seu próprio ViewController no código acima.


1
Usando o Xcode 9.1 & Swift 4, se eu simplesmente excluir o arquivo do storyboard sem remover manualmente a referência correspondente de .plist, recebo um erro "Não foi possível encontrar um storyboard chamado 'Main' no pacote". Parece que devo remover a referência manualmente.
Peacetype

3

Estou usando o XCode6 Beta e procurei outra solução desse problema adicionando o modelo Vazio do XCode5.xx ao XCode6 Beta.

Para isso, clique com o botão direito do mouse em XCode5.xx em Applications, clique em 'Show Package Content' e copie 'Empty Application.xctemplate' do caminho especificado

Conteúdo / Desenvolvedor / Plataformas / iPhoneOS.platform / Desenvolvedor / Biblioteca / Xcode / Modelos / Modelos de Projeto / Aplicativo

Agora saia da janela e abra o caminho especificado para o XCode6

Conteúdo / Desenvolvedor / Plataformas / iPhoneOS.platform / Desenvolvedor / Biblioteca / Xcode / Modelos / Modelos de Projeto / iOS / Aplicativo /

Cole 'Empty Application.xctemplate' dentro da pasta Application. Agora reinicie o XCode6 fechando e crie um novo projeto. Você receberá a opção 'Aplicativo vazio'.

Agora, quando estou criando um novo projeto Vazio, um arquivo .pch é adicionado automaticamente no projeto (que precisamos adicionar manualmente no XCode6)

Espero que funcione


1

Sim, ou apenas use uma versão beta anterior para criá-la e continue na versão mais recente depois.



1

Outros já explicaram como se livrar do storyboard, então vou pular esse aqui. É assim que eu prefiro fazê-lo no meu código com menos encadeamento opcional (escrito em 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

atualização no Xcode 11 e no ios 13. Depois de definir tudo, mas ainda ver uma tela preta, é porque o ciclo de vida é tratado pelo UISceneDelegate e quando você cria um novo projeto, ele gera automaticamente UISceneDelegate.m e UISceneDelegate.h. Para voltar aos velhos tempos antes de nos acostumarmos com o UISceneDelegate. Os seguintes passos podem ajudar:

  1. excluir Application Scene Manifest em plist.

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

  3. excluir código na marca #pragma - ciclo de vida do UISceneSession no APPdelegate.m

  4. adicione @property (forte, não atômica) janela UIWindow *; em APPdelegate.h

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.