Xcode: “A cena está inacessível devido à falta de pontos de entrada”, mas não consigo encontrá-la

89

O Xcode 4.5.2 me dá o seguinte aviso:

Unsupported Configuration    
Scene is unreachable due to lack of entry points and does not have an identifier 
for runtime access via -instantiateViewControllerWithIdentifier:.

Infelizmente, não consigo identificar a cena incriminada. Selecionar o aviso no Navegador de problemas não destaca nada no Storyboard. Eu tenho um storyboard bastante complicado (mais de 30 cenas).

Alguma sugestão?

Captura de tela para aviso

Wolfy
fonte

Respostas:

50

Embora este tópico seja antigo, não vi uma resposta descrevendo o que funcionou para mim, então aqui vai ...

Eu tive esse erro e o exame visual do storyboard mostrou que todos os controladores de exibição pareciam estar conectados ao controlador de exibição raiz.

Tentei nomear todos os 17 controladores de visualização no storyboard (como na resposta de @bobnoble). Eu usei uma convenção de nomenclatura baseada no nome longo do controlador de visualização, por exemplo, "jvc" para "Controlador de visualização de jobs". Quando tentei construir, recebi uma mensagem de erro apontando para um dos controladores de visualização como tendo um nome duplicado. Rastreando as coisas, descobri que tinha uma duplicata real de um controlador de visualização empilhado exatamente em cima de seu gêmeo. Suspeito que tenha sido o dano cortado e colado de um experimento de interface do usuário que eu não desisti completamente.

De qualquer forma, excluir o gêmeo desconectado resolveu meu problema. Depois disso, removi todos os nomes de VC, pois eles não são referenciados no código.

Bob H
fonte
3
Isso aconteceu comigo também, mas ainda tive que preencher um dos muitos vaziosStoryboard ID
Pierre de LESPINAY
... então eu acredito que @bobnoble é a resposta correta para ser marcada com um √
SwiftArchitect
139

Em seu storyboard, selecione cada um dos controladores de visualização (seta vermelha na imagem abaixo) e observe o campo ID do Storyboard (oval vermelho). Nenhum dos campos de ID do Storyboard deve ficar em branco. Quando você encontra um que é, esse é o culpado.

insira a descrição da imagem aqui

bobnoble
fonte
6
Olá @bobnoble, obrigado pela sua resposta. Uma pergunta: por que devo definir a ID do Storyboard para cada cena? Não acho que seja obrigatório, não é? Eu sei que tenho que definir um ID se quiser acessar a cena programaticamente, mas e se todas as minhas cenas estiverem conectadas por meio de segues? Ou é apenas uma boa prática de programação?
Wolfy
@Wolfy - bom ponto, você precisa olhar para cada um para ter certeza de que possui uma segue ou ID de storyboard.
bobnoble
2
Tentando essa solução, percebi que preencher apenas um específico Storyboard IDremoveu o aviso
Pierre de LESPINAY
Tive UINavigationControllerpara vários UIViewControllerse tive que definir um identificador para todos eles, mesmo que nunca chame um deles por identificador. Muito chato, procurar um bug onde ninguém está!
Alex Cio
Funciona para mim. Alguém sabe por que isso surge? Parece muito indetectável - o erro dado, em retrospecto, dá uma pista escassa. Eu consegui depois de converter um storyboard para o mais recente e melhor - se o Storyboard ID é necessário agora, certamente não era antes, e a conversão automática não cuidou disso.
Josh Sutterfield
30

Acabei de ter esse erro exato com um Storyboard de cena única simples e tudo o que tive que fazer para consertá-lo foi marcar a caixa de seleção "É o controlador de visualização inicial" para o controlador de visualização 1 no Storyboard. Suspeito que o Xcode costumava marcar essa caixa para você por padrão nesta situação, mas não faz mais.

Marque a caixa na parte inferior

                                     

Marque a caixa para exatamente um dos controladores de visualização em seu storyboard e você deve estar bem.

w0mbat
fonte
1
Obrigado. Era isso!
Eric Chen
20

Receio que você terá que passar por todos os 30 deles e verificar se eles têm um ID de Storyboard ou uma segue para aquele controlador de visualização. Um dos dois é obrigatório, ambos também são uma opção.

Scott Berrevoets
fonte
5
Depois que todos os controladores de visualização tiverem sua segue ou ID, a mensagem de erro ainda pode estar lá. Nesse caso, limpe o produto e ele terá sumido.
Reinhard Männer
5
No meu caso, um produto limpo não foi suficiente para eliminar a mensagem de erro depois de corrigi-lo. Ele desapareceu quando reiniciei o Xcode. (Não tentei fechar / reabrir o projeto. Isso também pode ter funcionado.)
JulianSymes
O mesmo para mim - eventualmente, você precisa parar e reiniciar o xcode para se livrar da mensagem de erro.
MusiGenesis
8

Esse problema pode acontecer em um dos seguintes cenários:

Caso I: se nenhuma cena do storyboard estiver marcada como "isInitialViewController" .

Correção: identifique o controlador de visualização raiz e marque-o como "isInitialViewController" em seu SB. Nesse caso, a id do storyboard não é obrigatória.

Caso II

Pode haver situações em que você não precisa ter um initialViewController em um storyboard. Por exemplo: ao usar vários storyboards.

Correção: Nesses casos, certifique-se de que o "id do storyboard" seja fornecido corretamente e consulte a primeira cena a ser usada no storyboard usando esse id. Por exemplo:

UIStoryboard *myStoryBoard = [UIStoryboard storyboardWithName:@"MyStoryBoardName" bundle:nil];
MyViewController *myViewController = (MyViewController *)[myStoryBoard instantiateViewControllerWithIdentifier:@"MyViewControllerId"];

Nesse caso, a "id do storyboard" é obrigatória.

Caso III

Você tem seu initialViewController conectado. Mas você ainda recebe este aviso. Isso ocorre porque algumas das cenas no storyboard podem não estar conectadas com uma "segue" e também não têm uma "id do storyboard" . Digitalize seu storyboard, veja se uma "segue" é necessária. Conecte a segue se estiver faltando. Se uma segue não for necessária, certifique-se de fornecer um "id do storyboard" pois é a única maneira de referir a cena de seu código, conforme mostrado no código de exemplo acima.

Espero que isto ajude

shah1988
fonte
CASO III - me ajudou. Obrigado!
mrGott
Tive um caso em que um projeto de amostra veio com o arquivo xib antigo. Eu criei um storyBoard e estou sofrendo atualmente .. preciso converter o xib em formato storyBoard e mover a partir daí .. não consigo ver nenhuma maneira de criar uma cena de aplicativo ou um menu ..
nyxee
6

Você não precisa definir Storyboard IDpara todas as cenas ouUINavigationController

Bem, eu tenho cerca de 50-60 cenas e acabei de receber esses avisos de modo que percebi que apenas o controlador (Scene) ou NavigationController que não está conectado com segue precisa ser definido Storyboard ID.

insira a descrição da imagem aqui

Você pode ver que na imagem acima UINavigationControllernão está conectado com segue, foi o culpado desse aviso.

Basta fornecer a ele um Storyboard ID para remover este aviso.

Kampai
fonte
5

Eu tive o mesmo problema. Tenho muitas visualizações no meu storyboard com um controlador de barra de navegação e guia. Para mim foi apenas um aviso para avisar que algumas das visualizações não estão conectadas. Certifique-se de que todas as suas visualizações estão conectadas de alguma forma ao controlador de visualização raiz . Eu estava começando este projeto do zero para eliminar esse aviso e percebi o mesmo aviso quando uma view não estava conectada.

Richard
fonte
Isso ajudou para mim. Estou usando o Swift 2. de 7.1.1. O StoryBoard inicial TEM que ser o controlador de visualização raiz.
Lukesivi
3

Maneira mais simples de encontrar a cena ofensiva:

Vá para o navegador de problemas (no painel esquerdo, próximo ao botão de pesquisa) e clique duas vezes no erro. Uma janela aparecerá contendo a cena ofensiva centralizada no meio da janela.

(Isso geralmente é verdade - clicar duas vezes em qualquer erro geralmente resultará em um pop-up contendo o erro centralizado - um pequeno truque interessante!)

Nota lateral: Às vezes, o XCode fornecerá incorretamente esse erro para uma cena que é o controlador de visualização raiz de um controlador de navegação (que é o controlador de visualização inicial). A correção simples é dar a este controlador de visualização raiz um Storyboard ID, compilando (o erro deve desaparecer) e, em seguida, removendo o storyboardID (sem mais erros).

ajay14
fonte
Obrigado pela sua dica "A correção simples é dar a este controlador de visualização raiz um Storyboard ID". Isso resolveu meu problema. Bem, eu preciso dar 'Storyboard ID' para UINavigationController.
Mohd Haider de
Isso me aponta para a cena do aplicativo com o menu principal. Não é possível fornecer a isso uma ID de storyboard.
Daniel,
2

A maneira mais fácil de ver qual controlador, ou cena, está causando esse problema é:

  • Clique com a tecla Ctrl pressionada .storyboardno Navegador do projeto e selecione Open As > Source Code. Isso abrirá o XML subjacente do Storyboard.
  • Nesta visualização, o aviso estará claramente relacionado a uma linha no XML que se relaciona à cena do crime.

Agora, no meu caso, o aviso foi particularmente irritante porque a "cena ofensiva" tinha um identificador e uma segue! Consegui solucionar o problema excluindo a cena e, em seguida, desfazendo a exclusão. Não é elegante, mas funcionou. Salvei meu Storyboard antes de fazer isso. Em retrospecto, eu deveria ter feito uma cópia e feito diffo antes e depois.

Dmitry Minkovsky
fonte
2
Estranhamente, isso não parece funcionar de forma consistente. Na minha situação problemática, funcionou. Agora estou testando e o Source Codeview não mostra o erro. Portanto, a milhagem pode variar.
Dmitry Minkovsky
Não encontrei o View Controller com isso, mas apaguei (em XML, não funcionava em ID) e o aviso havia sumido.
Daniel
2

Para mim, não foi por causa de a Storyboard IDou a Segue. Recebi este aviso porque não configurei o View Controller's Custom Class.

Selecione View Controllerno e Storyboard, em seguida Utilities Pane, selecione o Identity Inspectorícone. Abaixo Custom Class, veja qual valor está dentro do Classcampo.

Se apenas diz UIViewController, então você precisa digitar o nome da classe. Este será o nome de seus arquivos .he .mque constituem sua UIViewControllersubclasse personalizada .

user3344977
fonte
Acabei de ter uma variação disso. Combinei o ViewController errado em meu storyboard com a classe ViewController e o mesmo com o ID do Storyboard.
Vince O'Sullivan
2

Eu vim para esta questão hoje. Estou usando o Xcode 6.3 e a resposta à pergunta do OP é bastante simples agora:

Selecione o View Controller que deseja que seja o primeiro, mostre o Attributes Inspector e, na seção View Controller, certifique-se de

É o controlador de visão inicial

está checado. Voilà!

Zonker.in.Geneva
fonte
2

Com o Xcode 7, isso pode ser tratado facilmente. Não há necessidade de passar manualmente por todas as cenas para encontrar uma problemática. Primeiro vá para o navegador de relatórios , onde você pode obter mais informações detalhadas sobre os problemas conhecidos. A descrição do problema pode ser assim:

Base.lproj / Main.storyboard: fPh-fe-F5F : aviso: A cena está inacessível devido à falta de pontos de entrada e não tem um identificador para acesso em tempo de execução via -instantiateViewControllerWithIdentifier :.

Com esta informação, você pode copiar o id do objeto, neste caso era fPh-fe-F5F , e pesquisar no espaço de trabalho a ocorrência desta string. A string será encontrada no arquivo Main.storyboard. Clique duas vezes no resultado da pesquisa e será aberto Main.storyboard com a cena selecionada. Depois de conhecer uma cena problemática, você pode corrigir facilmente o problema, definindo o ID do storyboard ou definindo "É o controlador de visualização inicial"

Sergio
fonte
1

Você pode apenas definir um identificador. No inspetor de atributos no painel direito, você encontrará um campo chamado "Identificador". Basta colocar qualquer string lá, isso deve funcionar

Você pode clicar no controlador de navegação e no inspetor de atributos clicar no botão "é o controlador de visualização inicial", e isso deve funcionar também.

Mohammad Rabi
fonte
1
Mohammad, obrigado por responder, mas o problema é: em qual cena devo definir um identificador? Não consigo localizar a cena que está causando o aviso, esse é o problema principal.
Wolfy
1

Eu enfrentei o mesmo problema e resolvi colocar no storyboard ID qualquer identificador para todos os viewController e NavigationController também; o erro será removido imediatamente

desfrutar!!!

sônica
fonte
0

Talvez esta XQuery ajude você a encontrar essas cenas desagradáveis

for $i in .//scene/objects/*[1][not(@storyboardIdentifier) or @storyboardIdentifier= '']/@id      (: find every scene that has an empty storyboardIdentifier :)
where count(.//segue[@destination= $i])= 0 and $i!= ./document/@initialViewController             (: filter the results to the scenes that are not destinations of a segue and exclude the initialViewController :) 
return ($i, $i/../@customClass)                                                                   (: return the storyboard-id and the customClass, if any :)

Se você tiver o xqilla instalado, você deve salvar a consulta em um arquivo e usá-lo como

xqilla <xqueryfile> -i <path to your storyboard>
paralaxe
fonte
0

Não sei se isso ainda não foi mencionado ou não, mas outro motivo pelo qual você pode receber este aviso é se você tiver uma sequência indo na direção errada. Por exemplo, em meu projeto eu estava recebendo este aviso, mas todos os meus controladores estavam de fato conectados. No entanto, um deles teve uma sequência que basicamente estava tentando apresentar o pai da criança em vez de o pai apresentar a criança. Isso causou o mesmo aviso.

miken.mkndev
fonte
0

Recebi este aviso quando estou tendo um UIViewController no Storyboard para o qual nada está definido. Evitei esse aviso configurando o Storyboard ID para ele.

Durga Vundavalli
fonte
0

Tive o mesmo problema, mas percebi que estava usando o modo de exibição de contêiner e, em vez de excluir o controlador de exibição padrão, excluí seu controlador segue. Portanto, o controlador de exibição permaneceu no storyboard, assim como o aviso. Portanto, este é um dos casos em que o aviso aparece se o controlador de visualização padrão da visualização do contêiner não for excluído corretamente quando você não precisar dele.

profundo
fonte
0

Tentei tudo descrito acima sem sucesso. Eu tinha tudo conectado corretamente no IB, com exatamente um UIViewControllerdesignado como controlador de visualização raiz. Eu não tinha identificadores, mas os adicionei a todos os meus controladores.

A única maneira de fazer o aviso desaparecer era fazendo tudo acima (incluindo reinicializar o computador e uma compilação limpa), em seguida, alternar para um branch sem erros do meu projeto no git e vice-versa.

Não tenho certeza de qual ação o corrigiu ou qual combinação de ações, mas não era a compilação limpa por si só. Isso pode ser um subproduto de Main.storyboard, sempre mudando ao simplesmente ser aberto, o que significa que preciso fazer isso com git commit -m "Stupid storyboard"mais freqüência do que gostaria.

Corwin Newall
fonte
0

Aqui está o que funcionou para mim:

  1. Abra o storyboard em um editor de texto.
  2. Altere a versão 3.0 para 2.0, salve e feche-o.
  3. Abra-o novamente no Visual Studio. Ele irá converter e abrir automaticamente o documento.
vegas2ny
fonte
0

Recebi o mesmo erro: para mim, o erro foi não iniciei um controlador de visualização no meu storyboard.

Corrigir isso removeu aquele aviso.

Vetri Selvi Vairamuthu
fonte
0

Simplesmente dar a todos os MVCs uma id de storyboard funcionou para mim.

Elia Döhler
fonte