iOS 7 - Falha ao instanciar o controlador de visualização padrão

93

Estou usando o Xcode 5 em um aplicativo recém-criado e quando acabo de criá-lo, clico no botão Executar e, em seguida, o projeto é construído, mas não aparece no Simulador iOS e recebo a seguinte mensagem:

 Failed to instantiate the default view controller for UIMainStoryboardFile 'Main' - 
 perhaps the designated entry point is not set?

É claro que pesquisei sobre isso no Google e todos apontam que isso está acontecendo porque o XCode ainda não sabe qual view controller é o inicial. Mas o estranho é que eu criei o aplicativo como um aplicativo baseado em página (também tentei opções de aplicativo de visualização única e com guias) e o XCode já tinha definido um Storyboard para ele.

Além disso, quando vou para a opção de interface principal do projeto, o storyboard (denominado "Principal" pelo próprio Xcode) é definido e, no Storyboard, meu controlador de visualização é definido como "Controlador de visualização inicial"

insira a descrição da imagem aqui

O que está errado?

rodrigoalvesvieira
fonte
tente configurá-lo de forma
programática
@Ramshad Olá, sou meio que um novato no desenvolvimento de iOS. Como eu posso fazer isso?
rodrigoalvesvieira
2
Certifique-se de definir o controlador de visualização como o controlador de visualização inicial.
Sandeep
Como Kashif Ahmed apontou, você também precisa abrir seu arquivo Info.plist como código-fonte e editar a string <key> UISceneStoryboardFile </key> e fornecer lá o nome de seu novo storyboard.
bogdan

Respostas:

56

Então isso também aconteceu comigo também. Verifiquei 50 vezes e meu "Is Initial View Controller" foi verificado, acredite em mim. Aconteceu do nada. Então, como eu corrigi isso?

  1. Crie um novo Storyboard em seu projeto, nomeie-o como Main_iPhoneV2 (ou iPadV2 dependendo do seu estilo de storyboard original)
  2. Abra o storyboard quebrado, clique em qualquer lugar na área branca e pressione command-a e, em seguida, command-c (selecione tudo e copie)
  3. Abra seu novo storyboard e pressione command-v para colar exatamente a mesma configuração
  4. Vá para as configurações do projeto, altere sua "Interface principal" para o novo Main_iPhoneV2 (se for o seu iPad e você estiver escrevendo um aplicativo universal, você terá que editar o -Info.plist e procurar o valor "Arquivo de storyboard principal nome de base (iPad)
  5. Recompile e pare de puxar seus cabelos
Ryna
fonte
3
encontrou o mesmo problema ao tentar as etapas listadas nas noções básicas do desenvolvedor. Criou um novo Storyboard, marcou o novo como controlador de visualização inicial e definiu o novo como o storyboard principal por meio de Projects Deployment Info. Começou a funcionar magicamente. Não tenho certeza se é algum bug com o Xcode. developer.apple.com/library/ios/referencelibrary/GettingStarted/…
ioWint
Isso não funcionou ou acredito que não funcionará, a menos e até que o controlador de navegação inicial seja definido como "é o Controlador de visualização inicial".
Sumit Kumar Saha
Eu ia tentar isso. Mas então eu limpei e construí novamente e funcionou
Skywalker
305

Verifique se é o controlador de visualização inicial no Inspetor de atributos.

insira a descrição da imagem aqui

Ashvin Ajadiya
fonte
Claro que esta é 'a forma como deve funcionar'. Mas também encontrei o 'bug' e isso não funciona. Criar um novo e copiar todas as suas coisas funcionou! No meu caso.
Tys
Mas seu controlador de visualização já está definido como Controlador de visualização inicial, não é?
Iurii Vasylenko
@YuraVasylenko: Não era antes, então indiquei por marca como selecionado.
Ashvin Ajadiya
1
Apenas para torná-lo um pouco mais detalhado para quem precisa, Configurando o controlador inicial para um storyboard
Sergei Basharov
40

Primeiro clique em View Controller na barra de utilitários do lado direito . Em seguida, selecione o Attributes Inspector e certifique-se de que na seção View Controller a caixa de seleção 'Is Initial View Controller' esteja marcada!

Andy
fonte
1
Esse era o meu problema. Excluí o controlador de visualização padrão que meu storyboard tinha e quando adicionei outro tive que verificar isso.
Orgmir
17

Este aviso também é relatado se você tiver algum código como:

    window = UIWindow(frame: UIScreen.mainScreen().bounds)
    window?.rootViewController = myAwesomeRootViewController
    window?.makeKeyAndVisible()

Nesse caso, vá para a primeira página de configurações de destino e defina Main Interfacecomo vazio, uma vez que você não precisa de uma entrada de storyboard para seu aplicativo.

superarts.org
fonte
14

Usando o Interface Builder:

Verifique se ' É controlador de visualização inicial ' está definido. Você pode configurá-lo usando as etapas abaixo:

  1. Selecione seu controlador de visualização (que deve ser exibido como tela inicial).
  2. Selecione o inspetor de atributos de janela Utilitários .
  3. Selecione ' Is Initial View Controller ' em View Controller seção (se não).

Se você fez esta etapa e ainda está recebendo erros, então uncheck and do it again.

Passos para resolver o problema

Usando programaticamente:

Objective-C:

        self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds];
        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];

        UIViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"HomeViewController"]; // <storyboard id>

        self.window.rootViewController = viewController;
        [self.window makeKeyAndVisible];

        return YES;

Rápido :

        self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
        let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)

        var objMainViewController: MainViewController = mainStoryboard.instantiateViewControllerWithIdentifier("MainController") as! MainViewController

        self.window?.rootViewController = objMainViewController

        self.window?.makeKeyAndVisible()

        return true
Jayprakash Dubey
fonte
3
Se você fizer isso programaticamente, certifique-se de remover o storyboard da interface principal do seu alvo - apenas deixe em branco. Também deve entrar didFinishLaunchingWithOptions.
Jordan H
@JordanH como remover o storyboard da interface principal dos alvos?
PascalS
@Passe Selecione o texto e aperte delete, está na aba General
Jordan H
12

Eu experimentei isso com meu Tab Bar Controller não aparecendo no simulador junto com uma tela preta. Fiz o seguinte para que meu aplicativo apareça no Simulador.

  1. Vá para Main.storyboard.
  2. Verifique na Is Initial View Controllerguia do inspetor de atributos.

É o controlador de visualização inicial no Inspetor de atributos.

Cons Bulaquena
fonte
10

Configure a janela manualmente,

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    if (!application.keyWindow.rootViewController) 
     {
        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];

        UIViewController *myViewController= [storyboard instantiateViewControllerWithIdentifier:@"myViewController identifier"];

         application.keyWindow.rootViewController = myViewController;
     }
}
Shamsudheen TK
fonte
É necessário desmarcar o viewcontroller inicial no storyboard?
bdv
7

Recebo este erro quando mudo o nome do arquivo de storyboard " Main.storyboard " PARA: " XXX.storyboard "

A solução para mim foi:

  • Produto-> Limpo
  • ALTERAR: Arquivos de suporte -> info.plist -> Nome da base do arquivo de storyboard principal -> Principal para : XXX

Boa sorte

Hovanes Mosoyan
fonte
3

O produto “Clean” foi a solução para mim.

Walter Schurter
fonte
3

insira a descrição da imagem aqui

Além da resposta correta acima, também certifique-se de que configurou a interface principal correta em geral.

Naren
fonte
3

1ª opção

se você deseja definir seu storyboard personalizado em vez de um controlador de visualização padrão.

Altere este atributo do arquivo info.plist

<key>UISceneStoryboardFile</key> <string>Onboarding</string>

Onboarding seria o nome do seu storyboard

para abrir este clique com o botão direito no arquivo info.plist e abra como um código-fonte

2ª opção

1- Clique no seu projeto

2- Selecione seu projeto na seção de destino

3- Mover para a seção de interface de implantação

4- Altere a seção do storyboard no campo Interface principal

Lembre-se de definir seu controlador de visualização inicial do storyboard

Kashif Ahmed
fonte
1
A coisa <key> UISceneStoryboardFile </key> corrigiu para mim. Obrigado.
bogdan
2

Se você adicionou um novo storyboard, você deve verificar os seguintes pontos.

1) Em seu arquivo plist, verifique o valor do nome base do arquivo de storyboard principal (iPad) ou (iPhone) deve corresponder ao nome do arquivo de storyboard ( não adicione a extensão .storyboard )

2) No storyboard deve haver um controlador de visualização que é definido como controlador de visualização inicial

3) Limpe e construa seu projeto. :)

insira a descrição da imagem aqui

Sachin Nikumbh
fonte
1

Se você tem enviado seu código para o controle de origem regularmente, isso pode evitar o incômodo de criar um novo Storyboard e possivelmente introduzir mais problemas ...

Consegui resolver isso comparando o código-fonte do Git da versão que funcionava com o código quebrado. O diff mostrou que a primeira linha deve conter o Id do controlador de visualização inicial, no meu caso, initialViewController = "Q7U-eo-vxw" . Eu pesquisei o código-fonte para ter certeza de que a id existia. Tudo que eu tive que fazer foi colocá-lo de volta e tudo funcionou novamente!

<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="5056" systemVersion="13E28" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" initialViewController="Q7U-eo-vxw">
    <dependencies>
        <deployment defaultVersion="1296" identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="3733"/>
    </dependencies>
    <scenes>

Aqui estão algumas etapas que podem ajudá-lo a solucionar o problema:

  1. Clique com o botão direito no Storyboard com falha e use Source Control> Commit ... para preservar suas alterações desde o último commit.
  2. Tente clicar com o botão direito em seu Storyboard com falha e use "Abrir como> Código-fonte" para visualizar o XML do storyboard.
  3. No elemento do documento , procure o atributo denominado " initialViewController ". Se estiver faltando, não se preocupe, nós consertaremos. Se estiver lá, clique duas vezes no id que está atribuído a ele, command-c para copiá-lo, command-f command-v para pesquisá-lo mais profundamente no documento. Este é o identificador do controlador que deve fornecer a visualização inicial. Se não estiver definido no documento, isso é um problema - você deve removê-lo da tag do documento, no meu caso initialViewController = "Q7U-eo-vxw" .
  4. Vá para o item de menu do Xcode chamado Exibir e escolha Editor de Versão> Mostrar Visualização de Comparação
  5. Isso mostra sua versão local à esquerda e a versão histórica à direita. Clique na data abaixo da versão histórica para obter uma lista dos commits para este storyboard. Escolha um que você sabe que funcionou e compare o elemento do documento . Qual é a id do * initialViewController ? É diferente? Em caso afirmativo, tente editá-lo de volta manualmente e correndo. Ferramenta de comparação histórica do xcode em ação
neoscribe
fonte
1

Verifique se você tem a janela var no AppDelegate.

var window: UIWindow? 

E também verifique o storyboard do seu arquivo Info.plist.

<key>UIMainStoryboardFile</key>
<string>Main</string>

Configurar o rootViewController programaticamente no AppDelegate não vai corrigir o aviso. Você deve escolher se deseja permitir que o storyboard defina o controlador de visualização ou fazê-lo programaticamente.

rockdaswift
fonte
1

Projetos criados no Xcode 11 e superior, simplesmente alterar o arquivo da interface principal nas configurações do projeto não será suficiente.

Você deve editar manualmente o arquivo Info.plist e definir o nome do storyboard para o UISceneStoryboardFiletambém.

Isuru
fonte
1

Nenhuma das opções acima resolveu o problema para mim. No meu caso, também não estava definindo o manifesto de cena do aplicativo correto.

Eu tive que mudar LoginScreen costumava ser principal

insira a descrição da imagem aqui

Julian Silvestri
fonte
Surpreso, isso não obteve tantos votos. Isso acontecerá em praticamente qualquer implementação de SceneDelegate (que não use Storyboard como controlador inicial).
bauerMusic