O storyboard não contém um controlador de exibição com identificador


175

Continuo recebendo o seguinte erro:

Storyboard (<UIStoryboard: 0x7ebdd20>) doesn't contain a view controller with identifier 'drivingDetails'

Este é o código:

- (void)tableView:(UITableView *)tableView 
        didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

   UIViewController *controller =  [self.storyboard instantiateViewControllerWithIdentifier:@"drivingDetails"];
   controller.title = [[dao libraryItemAtIndex:indexPath.row] valueForKey:@"name"];
   [self.navigationController pushViewController:controller animated:YES];
}

Eu já definiu o identifierno UIStoryboard, mas ainda estou recebendo este erro.

insira a descrição da imagem aqui



4
Parece que você definiu o identificador de um segue, não um controlador de exibição. Qual controlador de exibição nessa imagem você está tentando apresentar? E por que você não está apenas usando um segue?
Firoze Lafeer

Até o controlador de exibição Driving funciona bem .... do que quando tento apresentar o TableViewController, recebo o erro ...... como você faria isso?
Mat

Vá para o Storyboard, remova esse ID do Storyboard e adicione novamente. Às vezes você precisa pasta compilação limpa e derivados de dados
onmyway133

Respostas:


244

Apenas para referência futura:

Estou desenvolvendo no iOS 6 usando Storyboards.

Eu estava com o mesmo problema, mas não consegui encontrar o campo "Identificador" no inspetor. Em vez disso, basta definir o campo chamado "ID do storyboard" para o que você chamaria de identificador. Esse campo pode ser encontrado na guia "Mostrar o inspetor de identidade" no inspetor.

[Nota - os comentários abaixo indicam que algumas pessoas descobriram que precisam (também?) Definir o campo "ID de restauração" logo abaixo da ID do storyboard no inspetor. Clicar em "Usar ID do Storyboard" não parece suficiente.]

Há uma imagem abaixo para referência: (nesse caso, nomeei meu identificador como igual à minha classe) insira a descrição da imagem aqui


24
pré XCode 4.4 e anterior: Identificador; XCode 4.5: Storyboard ID
ilmiacs

obrigado pela sua informação. Eu estava com problemas para encontrar o identificador no storyboard, seguindo as explicações no google, mas não consegui encontrar o identificador no Xcode4.6. esse é um grande problema para o novato. obrigado.
iniciantes

4
O que funcionou para mim foi usar o ReuseIndentifier. O ID do storyboard ainda causa uma exceção de ponteiro nulo.
Droid Chris

Mesmo caso aqui @DroidChris
Ahmed

5
verificar "Usar o ID do Storyboard" me deixou feliz
preetam 19/09/2015

189

No Xcode 7 - 11 ,

quando você altera os IDs do storyboard e obtém erros como este,

apenas LIMPO seu projeto ( CMD+ SHIFT+ K)


13
Por que eu sempre esqueço de fazer isso? Corrige os problemas mais loucos. Obrigado, Ted, por me lembrar!
AlphaCodaSeven

2
Esse problema ocorreu no XCode 7.2 ao extrair de um repositório no qual um VC no storyboard recebeu um identificador. A limpeza do projeto pareceu resolver o problema.
Ed George

2
Eu pensei que estava enlouquecendo ... um simples seguimento não estava funcionando, isso fez o truque.
Dokun1

2
Sim está funcionando !!!! algum tempo A limpeza do projeto xcode removerá a referência indesejável ao projeto #
2737

3
Eu venho do Android Studio e do desenvolvimento do Android. É louco quantos hacks eu tenho que usar no XCode e no Swift. Eu realmente tenho que chorar. Seriamente.
Ktamas 14/05

43

Fixo! Não apenas o identificador no segue deve ser definido, no meu caso, DrivingDetails, mas também o identificador em meu tableViewController deve ser definido como DrivingDetails ... veja minha imagem:

insira a descrição da imagem aqui

Também removi o controlador de visualização de navegação, agora os dois controladores de visualização de tabela estão conectados diretamente com uma animação "push".

***** EDIT para XCODE 7.0 *****

você precisa definir o storyboardId (nesse caso, o viewController é incorporado em um controlador de navegação:

let lastMinVc  = mainStoryBoard.instantiateViewControllerWithIdentifier("lastMinuteNavController") as! UINavigationController

insira a descrição da imagem aqui


2
Eu estou correndo em um problema semelhante a esta pergunta, mas quando eu ir para o inspetor de atributos não vejo 2 campos como na sua tela tiro apenas um campo de título, nenhum campo identificador
Anon957

você olhou para a resposta acima? Eu acho que é mais atualizado. Obrigado
Mat

1
O identificador para o segue não tem nada a ver com isso. Somente o ID do Storyboard para o controlador de exibição precisa ser definido no storyboard.
Jawwad

Possivelmente relacionado. No iOS7, [storyboard instantiateViewControllerWithIdentifier]NÃO instancia as visualizações do Interface Builder dentro do controlador de visualização; mas no iOS6 ele fez #
William Entriken 22/09

30
let storyboard = UIStoryboard(name: "StoryboardFileName", bundle: nil)
let controller = storyboard.instantiateViewController(withIdentifier: "StoryboardID")
self.present(controller, animated: true, completion: nil)

Nota:

  • "StoryboardFileName"é o nome do arquivo do Storyboard e não o ID do storyboard!
  • "StoryboardID"é o ID que você definiu manualmente no inspetor de identidade para esse storyboard (veja a captura de tela abaixo).

ID do storyboard

Às vezes, as pessoas acreditam que o primeiro é o Storyboard ID e o segundo o nome da classe View Controller, portanto, observe a diferença.


1
Este!! Meu homem, você acabou de resolver meu mistério de 18 horas. Obrigado pela explicação concisa.
Mrfevrier 26/08/19

1
Jesus Cristo! Obrigado por isso! .instantiateViewController(withIdentifier: "StoryboardID")deve ser renomeado para .instantiateStoryboard(withIdentifier: "StoryboardID")Ou apenas algo mais simplesUIStoryboard(name: "StoryboardFileName", bundle: nil).init()
roosevelt

16

Identidade localizada na guia Identity Inspector denominada ID do Storyboard para Xcode 6.3.2 e marcada a opção Usar ID do Storyboard. insira a descrição da imagem aqui


Esse era o problema o tempo todo, isso funcionava nos dois lugares em que eu estava tendo problemas. A sua não apenas o valor Storyboard ID sendo set, você precisa verificar o 'Use Storyboard ID'
Tyler Corte

"Usar ID do Storyboard" foi a peça vital que faltava para mim. Obrigado.
Marcy

9

Acabei de ter esse problema depois de adicionar um novo VC ao storyboard, mas apenas no dispositivo, não no simulador. Acontece que isso ocorreu devido a várias localizações de storyboard - o VC foi adicionado apenas ao principal. Tentei remover as outras localizações (uma das quais é usada pelo meu iPhone), mas ainda tinha o erro. No final, tive que recriar as outras localizações com o novo VC em cada uma delas.


5

O compilador mostra o seguinte erro:

Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: 'Storyboard (<UIStoryboard: 0x7fedf2d5c9a0>) doesn't contain a 
ViewController with identifier 'SBAddEmployeeVC''

Aqui, o objeto do storyboard criado não é o storyboard principal que contém nossos ViewControllers. Como arquivo de storyboard no qual trabalhamos é nomeado como Main.storyboard . Então, precisamos ter referência ao objeto do Main.storyboard .

Use o seguinte código para isso:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];

Aqui storyboardWithNameestá o nome do arquivo de storyboard com o qual estamos trabalhando e bundleespecifica o pacote em que está o nosso storyboard (ou seja mainBundle).


5

Para aqueles com o mesmo problema que @Ravi Bhanushali, aqui está uma solução Swift 4:

let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)


Deve ser adicionado um comentário à resposta de @Ravi.
Sunil 01/02

Eu teria, mas não tenho reputação. Alguém com reputação suficiente é mais do que bem-vindo a fazê-lo
confitz20

4

Eu encontrei ... clique no controlador de exibição no storyboard, clique no terceiro ícone à esquerda nos inspetores de atributos de vc - aquele em que você define o nome da chamada na tela que diz 'identidade' - o meu estava escondido, eu tinha que clique na palavra identidade que mostra o storyboardID - adicione o identificador do código, pronto


4

A modificação de "ID do storyboard" no inspetor de identidade (o terceiro ícone à esquerda) deve funcionar.

Caso contrário, e você tem certeza de que não há erro de digitação, tente limpar o projeto ("Produto" -> "Limpar" ou simplesmente comando + shift + K).


salvou a minha vida. obrigado. (especialmente a parte de limpeza)
Jay

1

Ao digitar o identificador, você não selecionou o controlador de visualização adequado, basta verificar uma vez se estiver pronto, repita o procedimento mais uma vez.


qual controlador de exibição devo selecionar? desculpe, estou confuso.
Mat

TableViewController * controller = [self.storyboard instantiateViewControllerWithIdentifier: @ "drivingDetails"]; controller.title = [[dao libraryItemAtIndex: indexPath.row] valueForKey: @ "nome"]; [self.navigationController pushViewController: controlador animado: SIM]; como isso?
Mat

Conforme a imagem, o TableViewController deve ser selecionado como você está fazendo para exibir detalhes nesse controlador.
iamsult

Explicação passo a passo de story board dada raywenderlich.com/5138/beginning-storyboards-in-ios-5-part-1
iamsult

1
Apenas uma pequena nota, seu identificador segue e identificador de controlador de exibição são diferentes. Eu só queria destacar que, no caso de haver alguma confusão, você está usando o mesmo nome para ambos. Seu identificador segue deve ser usado em prepareForSegue e seu identificador de controlador de exibição é para carregar visualizações diretamente do seu storyboard. scott-sherwood.com/?p=219
Scott Sherwood

1

Alguns dos meus controladores de exibição estavam ausentes do atributo storyboardIdentifier .

Antes:

<viewController
    id="pka-il-u5E"
    customClass="YourViewControllerName"
    customModule="ModuleName"
    customModuleProvider="target"
    sceneMemberID="viewController">

Depois de:

<viewController
    storyboardIdentifier="YourViewControllerName"   <----
    id="pka-il-u5E"
    customClass="YourViewControllerName"
    customModule="ModuleName"
    customModuleProvider="target"
    sceneMemberID="viewController">

0

Eu recebi o mesmo erro e poderia corrigir isso alterando as seguintes alterações no meu projeto. Mencionei o nome da minha classe no painel do inspetor e o problema foi resolvido. Ir para-> painel direito lá Identity Inspector Na seção de classe personalizada

classe: o nome da sua classe (ViewController)

Na identificação do storyboard da seção Identity: seu ID do storyboard (nome do viewController)

Depois disso, clique na opção Usar ID do storyboard por lá. É isso que o problema está concluído. Espero que ajude você ....


0

Use seu identificador (@ "drivingDetails") como ID do Storyboard.


0

é muito simples selecionar o respectivo controlador de exibição no storyboard principal e verificar o storyboardID, se presente, usá-lo no identificador de nome e usá-lo.

aqui meu primeiro é o storyboardID, deixe vc = self.storyboard? .instantiateViewController (withIdentifier: "firstone") as! tabBarViewController


0

Eu tentei todas as soluções acima e nenhuma funcionou.

O que eu fiz foi:

  • Projeto limpo
  • Excluir dados derivados
  • Reinicie o Xcode
  • Digite novamente o StoryboardID mostrado nas respostas anteriores (dentro da IB).

E então deu certo. O mais chocante foi que eu havia inserido o ID do Storyboar no construtor de interfaces e ele foi removido / excluído depois de abrir o Xcode novamente.

Espero que isso ajude alguém.


0

Limpar tudo e fechar o Xcode não resolveu o problema para mim.

Eu tive que excluir o viewController e criar um novo com o novo identificador.


0

Nota: Se você usar cocoapods em seu projeto, primeiro execute pod deintegrateerm Podfile.lock

Em seguida, abra a pasta do projeto em qualquer editor de código de terceiros como o VSCode e faça uma pesquisa global pelo nome do ViewController que gera o erro.

  1. Renomeie / corrija os nomes errados que encontrar.
  2. Salve todas as alterações.
  3. Limpe e construa seu projeto.

Tudo deve funcionar bem agora.

Isso geralmente ocorre quando você renomeia arquivos do Xcode.


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.