Ponta carregada, mas a saída 'view' não foi definida

742

Adicionei um novo arquivo de ponta ao meu projeto e tentei carregá-lo.

No entanto, quando clico no ícone da barra de ferramentas que deveria me levar à exibição que criei, recebo NSInternalInconsistencyExceptiona mensagem:

Finalizando o aplicativo devido à exceção não capturada 'NSInternalInconsistencyException', motivo: '- [UIViewController _loadViewFromNibNamed: bundle:] carregou a ponta "...", mas a saída da visualização não estava definida.'

Então, eu abri meu arquivo de ponta e vejo que não há saídas de referência definidas. No entanto, tento clicar e arrastar o círculo de "nova saída de referência" para o Proprietário do arquivo, mas isso não me permite ... o que preciso fazer para que minha exibição seja exibida?

John
fonte
1
Tente limpar a compilação primeiro.
precisa saber é o seguinte
No meu caso, o erro real foi que eu defini um método no valor viewController (- (void) setValue: (NSNumber *) forKey: (chave NSString *)) que substitui o método ViewController que causou o erro. Eu resolvi mudar o nome deste método
cristão mini-

Respostas:

1807

Vocês estão certos, mas como eu sou novato, demorei um pouco para descobrir todas as etapas para fazer isso. Aqui está o que funcionou para mim:

  • Abra o arquivo XIB causando problemas
  • Clique no ícone do proprietário do arquivo na barra esquerda (a parte superior parece uma caixa amarela)
  • Se você não vir a barra lateral direita, clique no terceiro ícone acima de "visualizar" na barra de ferramentas. Isso mostrará a barra lateral direita
  • Na barra lateral direita, clique na terceira guia - a que se parece um pouco com um jornal
  • Em "Classe personalizada" na parte superior, verifique se Class é o nome do ViewController que deve corresponder a essa exibição. Caso contrário, insira-o
  • Na barra lateral direita, clique na última guia - a que se parece com um círculo com uma seta nela
  • Você deve ver "pontos de venda" com "visualização" abaixo. Arraste o círculo ao lado dele até o ícone "visualizar" na barra esquerda (inferior, parece um quadrado branco com um contorno cinza grosso)
  • Salve o xib e execute novamente
Josh Justice
fonte
Também enfrentei esse problema no cacau e, desde que a exibição não fosse carregada / adicionada à hierarquia de exibições, todos os pontos de vista eram NIL. Após chamar addSubview ou algo semelhante, todas as tomadas foram conectadas. A parte engraçada da minha história foi que po viewcontroller.view.subviews mostrava os objetos ausentes.
Apoc
11
Esta solução não está mais funcionando no Xcode 7.3 a partir das etapas 4 e 5. Em vez disso, no criador de interface, arraste com a tecla Control pressionada do proprietário do arquivo para sua visualização.
PeiweiChen
2
Não funcionou para mim (nenhuma seção de tomadas no inspetor de conexões, portanto, não há "visualização" nas tomadas a que se conectar), mas +1 pelo esforço que você colocou em sua resposta. :)
William T. Mallard
2
Se você não vir "view" nos pontos de venda, também poderá arrastar com o ctlr do proprietário dos arquivos para a view no storyboard. Um menu contextual deve aparecer com uma opção "view"
Josef
1
@ WilliamT.Mallard Tenho o mesmo comportamento. MyViewControlleré uma subclasse de subclasse de UIViewControllere não existe viewem "Outlets". Se eu subclasse MyViewControllerdireta da UIViewControllerexibição aparece em "Outlets". Magia ou bug do Xcode.
User2319066
201

Esta é a proposta de Josh Justice, mas de maneira gráfica (as fotos são minhas):

  1. Selecione Proprietário do arquivo
  2. No painel do lado direito, selecione a classe personalizada.
  3. Digite o nome da classe personalizada

insira a descrição da imagem aqui

  1. No painel do lado direito, selecione pontos de parada
  2. Arraste a saída da vista para ver o componente

insira a descrição da imagem aqui

Finalmente, o View Controller é instanciado com o código rotativo:

        PTFilterUserVC *aFilterUserVC = [[PTFilterUserVC alloc] initWithNibName:@"FilterVC" bundle:nil];

        //OPTIONAL.This is how 'I' am interested in present the view controller.
        [self.navigationController pushViewController:aFilterUserVC animated:YES];
Javier Calatrava Llavería
fonte
1
Obrigado Javier Calatrava Llavería ... me ajudou muito depois de bater minha cabeça por uma hora !!!
BharathRao 20/0418
um exito muchas gracias
Bruno Sosa Fast Tag
Perdi
73

Geralmente, posso corrigi-lo refazendo a conexão entre o Proprietário do arquivo e a visualização. Arraste com a tecla Control pressionada do proprietário do arquivo para sua Visualização (no IB) e selecione a visualização no menu pop-up.

Rohit Mandiwal
fonte
62

A identidade de exibição - identidade de classe não foi definida. Depois de configurá-lo para a classe apropriada, o problema foi resolvido.

John
fonte
Oi @ John, eu fiz isso, mas ainda estou recebendo essa exceção.
Mansuu ....
29

Você tem certeza de que possui uma UIView (ou subclasse) atribuída à propriedade "view" do seuViewController?

Clique com o botão direito do mouse em "Proprietário do arquivo" no painel esquerdo do xib para o seu ViewController e verifique se a saída "view" está definida. Caso contrário, defina-o para uma visualização!

isso definitivamente corrigirá o problema

Shehbaz Khan
fonte
2
Resposta clara e concisa.
precisa saber é o seguinte
15

Para mim, todas as coisas declaradas aqui https://stackoverflow.com/a/6395750/939501 eram verdadeiras, mas ainda assim geravam erros, razão pela qual criei uma classe View com o nome ABCView e a excluí depois, adicionei um controlador de exibição como ABCViewController Então, de alguma forma, ele estava se referindo ao antigo ABCView no novo controlador de exibição. Eu tive que excluir o ABCViewController e adicionar um novo com um nome diferente que resolvesse meu problema.

obrigado

vishal dharankar
fonte
Ainda um bug em 2020.
Tamás Sengel
15

Eu tive o mesmo problema com o XCode 4.6.3. Eu tinha começado com alguns arquivos nomeados MySettingsView.he, .mmas os apaguei em favor de MySettingsViewController.h, mas, apesar de tentar a maioria das dicas mencionadas aqui, ele continuava se enganando com,

2013-07-05 11: 48: 17.205 MyApp [39024: c07] *** Finalizando o aplicativo devido à exceção não capturada 'NSInternalInconsistencyException', motivo: '- [UIViewController _loadViewFromNibNamed: bundle:] carregou a ponta "MySettingsView", mas a saída de exibição não foi definido.

Evidentemente, ainda estava "confuso", tentando carregar o MySettingsView.xib em vez do MySettingsView Controller .xib. Talvez a lógica "faça o que eu quero dizer" seja muito chique.

Então, eu resolvi o problema codificando o nome NIB / XIB em MySettingsViewController.m:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:@"MySettingsViewController" bundle:nibBundleOrNil];
}
Nathan
fonte
10

Para qualquer pessoa que esteja usando um método xib para criar um UIView e tendo esse problema, notará que não terá a saída "view" no menu do inspetor de conexões. Mas se você definir a classe personalizada Proprietários do arquivo como um UIViewController e verá a saída "view", na qual você pode apenas CMND conectar uma saída ao CustomView.

manapate
fonte
Impressionante. Muito obrigado. Esta deve ser uma resposta aceita!
Roman
7

Meu problema com isso foi causado por uma ponta duplicada na pasta da classe que não tinha o modo de exibição definido. O xcode parecia estar escolhendo uma ponta para uma compilação e depois a outra na próxima vez que eu construí o projeto. Apenas excluiu o outro. Parece bom. Doh!

Matt
fonte
6

Passei mais de uma hora tentando descobrir por que minha propriedade view não está definida no meu controlador de exibição após iniciá-la a partir da ponta. Lembre-se de chamar "[super initWithNibName ...]" dentro do initWithNibName do seu controlador de exibição.

Kamil.S
fonte
5

Eu apenas consertei isso no meu. Projeto grande, dois arquivos. Um era "ReallyLargeNameView" e o outro era "ReallyLargeNameViewController"

Com base na segunda resposta escolhida acima, decidi que deveria limpar minha compilação. Nada, mas eu ainda era suspeito do XCode (como eu tenho duas classes idênticas, deveria abstraí-las, mas eh ...) Então, alguém está trabalhando, não está. Os nomes dos proprietários dos arquivos são tanto quanto copiados e colados, tomadas reiniciadas, xCode reiniciado, ainda nada.

Então, eu excluo a classe nomeada semelhante (que é uma exibição). Logo, o novo erro "saída interna não conectada" era literalmente "webView, não valor-chave" blah ... basicamente dizendo "Visual Studio's better". Enfim ... eu apago o arquivo menor chamado, e bam, ele funciona.

O XCode é confundido por arquivos com nomes semelhantes. E o projeto é grande o suficiente para precisar reiniciar um pouco, o que pode fazer parte dele.

Gostaria de ter uma resposta mais técnica do que "XCode está confuso", mas bem, o xCode fica muito confuso neste momento. Não confundiu da mesma maneira que eu ajudaria uma criança. Funciona agora, :) Deverá beneficiar outras pessoas se o acima não corrigir nada.

Lembre-se sempre de limpar suas compilações (excluindo também o simulador)

Stephen J
fonte
4

Eu também tive o mesmo problema e meu problema foi que eu adicionei outra localização (em inglês) à ponta do ViewControllers para que meu aplicativo com o alemão de localização não conseguisse encontrar a ponta com o inglês de localização !! Espero que isso ajude alguém!

Weini
fonte
4

Eu tive que enfrentar o mesmo problema enquanto excluía acidentalmente a referência xib e a adicionava novamente.Eu apenas corrigi a conexão entre o proprietário do Files e a view.Também verifique se a classe personalizada do FilesOwner é a viewController esperada.

Nidhin
fonte
3

Para mim, o problema foi causado pela ligação initWithNibName:bundle:. Estou usando células de exibição de tabela de um arquivo de ponta para definir os formulários de entrada tableViews. Como não tenho uma visão, não faz sentido ligar a uma. Em vez disso, se eu chamar o initWithStyle:método e, a partir daí, carregar o arquivo nib, tudo funcionará conforme o esperado.

DaveDude
fonte
3

As respostas anteriores quase resolveram o problema para mim, mas o último passo estava faltando.

  1. Crie um arquivo xib e swift com o mesmo nome.

Adicionar arquivo de visualização e troca rápida

  1. Defina o proprietário do arquivo como a subclasse UIView.

insira a descrição da imagem aqui

  1. Arraste uma saída da subclasse View para a subclasse UIView e chame-a de "contentView"

adicione a visualização de conteúdo

  1. Adicione este inicializador personalizado para que, quando o xib carregue, anexe o contentView

adicione a visualização de conteúdo como uma subvisão

required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        Bundle(for: self.classForCoder).loadNibNamed("SampleView", owner: self, options: nil)
        addSubview(contentView)
        contentView.frame = self.bounds
        contentView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
    }

Agora, todos os @IBOutlets adicionados serão anexados.

Cheers, Richard

COSMO BAKER
fonte
2

Eu tinha o mesmo problema, mas era necessária uma solução um pouco diferente. O problema nesse caso foi a classe do proprietário do arquivo, em vez da classe da exibição. Para definir isso, tive que clicar no ícone "reproduzir para trás" no canto inferior esquerdo da janela do Interface Builder, e apareceram opções que isolavam as características do proprietário do arquivo, do primeiro respondente e da exibição. Clicar no primeiro (uma grande caixa transparente) permitiu-me definir sua classe personalizada, conforme sugerido acima.

Michael Stern
fonte
2

Eu tive o mesmo problema, mas uma solução diferente foi necessária. O problema neste caso foi a classe do proprietário do arquivo não estava conectada ao arquivo xib.

user1951454
fonte
2

Encontrei algo muito semelhante hoje à noite, com uma subclasse Swift UIViewController. Nesse caso, nenhuma das correções acima funcionou, mas reorganizar um pouco meu código funcionou. Net-net, com uma extensão para a subclasse, ocorre antes que a própria definição da subclasse no mesmo arquivo pareça confundir o XCode, apesar de compilar bem; a correção foi colocar as extensões após a definição da subclasse.

Postei os detalhes em uma resposta a essa pergunta semelhante .

Cora Middleton
fonte
2

No meu caso, o inicializador designado - (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNilna classe *** ViewController foi implementado, portanto, mesmo quando eu chamar outro inicializador para inicializar o objeto, o inicializador designado será chamado.

Portanto, para resolver esse problema, verifique se o - (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNiltambém é uma maneira adequada.

lynulzy
fonte
2

Encontrei esse problema de uma maneira um pouco diferente das outras respostas aqui.

Se eu simplesmente criasse um novo arquivo xib, adicionasse um UIViewController a ele no Interface Builder e definisse a classe personalizada do UIViewController como meu controlador de exibição, o que resultaria na falha "a saída de exibição não foi configurada". As outras soluções aqui dizem para controlar e arrastar a saída de exibição para o View, mas para mim a saída de exibição estava acinzentada e não consegui controlá-la.

a tomada cinza da View

Eu descobri que meu erro foi adicionar um UIViewController no Interface Builder. Em vez disso, tive que adicionar um UIView e definir a classe personalizada do proprietário do arquivo como meu controlador de exibição. Então eu poderia controlar e arrastar a saída do proprietário do arquivo para o meu novo modo de exibição UIView e tudo funcionou como deveria.

Brian Kendig
fonte
1

Só tive o mesmo erro no meu projeto, mas motivo diferente. No meu caso, eu tinha uma configuração do IBOutlet com o nome "View" na minha classe UITableViewController personalizada. Eu sabia que "view" era especial porque ele é um membro da classe base, mas não achei que View (caso diferente) também fosse um problema. Eu acho que algumas áreas do cacau não diferenciam maiúsculas de minúsculas, e provavelmente carregar um xib é uma dessas áreas. Então, acabei de renomeá-lo para DefaultView e tudo está bem agora.

eselk
fonte
1

selecione o proprietário dos arquivos e abra o inspetor de identidade, fornecendo o nome da classe a que corresponde. Se nenhum dos métodos acima funcionar e você ainda não conseguir ver a saída de exibição, dê uma nova conexão de referência ao proprietário do arquivo e poderá ver a saída de exibição. Clique na visualização Outlet para fazer uma conexão entre o View Outlet e o proprietário do arquivo. Execute o aplicativo, isso funciona bem.

Abhilash Reddy kallepu
fonte
1

No meu caso, a visualização não foi visualizada no xib. no xib, a visualização era size = none (quarta guia à direita). Defino o tamanho para Forma livre e recarrego o xCode. A vista foi apelada e eu configurei o link adequado para Ver.

OrdoDei
fonte
1

Se você já tentou de tudo e ainda assim obtém esse erro, tente recriar o arquivo de classe do zero, mas lembre-se de marcar a caixa de seleção "Também criar arquivo XIB". Isso vinculará automaticamente alguns itens que não estão vinculados ao criar esses arquivos separadamente. Depois que isso é criado, você provavelmente pode recortar e colar tudo no novo XIB e deve funcionar bem.

Estou encontrando esse problema especificamente ao criar arquivos separadamente no Swift.

Travis M.
fonte
1

para mim aconteceu, quando

  • Eu tenho uma classe ViewController (.mm / h) associada ao arquivo Nib,
  • O UIView deste ViewController deve ser carregado na outra visualização como uma subvisão,

  • chamaremos algo assim

    -(void)initCheckView{
    
       CheckView *pCheckViewCtrl = [CheckView instance];
    
       pCheckView = [pCheckViewCtrl view];
    
       [[self view]addSubview:pCheckView];
    
       [pCheckViewCtrl performCheck];        
    
    }

Onde

+(CheckView *)instance{
    static CheckView *pCheckView = nil;
    static dispatch_once_t checkToken;

    dispatch_once(&checkToken, ^{
        pCheckView = [[CheckView alloc]initWithNibName:@"CheckView" bundle:nil];
        if ( pCheckView){
            [pCheckView initLocal];
            **[pCheckView loadView];**
        }
    });

    return pCheckView;

}

Aqui o loadView estava ausente ,, a adição desta linha resolveu meu problema.

Amitg2k12
fonte
1

Eu tive o mesmo problema, descobri e é por isso que eu marquei " Células estáticas " nas propriedades da exibição de tabela na opção Conteúdo . Funcionou quando foi alterado para " Dynamic Prototypes". A captura de tela está abaixo. insira a descrição da imagem aqui

Saranjith
fonte
1

Eu tive um problema semelhante com o Xcode 9.3, e a configuração de "Módulo" no inspetor de atributos "Proprietário do arquivo" para o módulo do projeto corrigiu isso para mim.

nananta
fonte
1

Abra seu arquivo de storyboard onde seu viewController existe ou um arquivo relacionado ao XIB com textEdit.app e verifique se o nome do storyboard ou do XIB é o mesmo do seu viewController, altere-o, salve e recarregue / reinicie o Xcode.

Alessandro Ornano
fonte
1

Se você estiver usando um método init personalizado, verifique se está retornando algo válido. Corri para um pedaço de código que falhou em algo como isto:

- (id)init {
   self = [super init];
   if (self) {
      CustomController *controller = [[NSBundle mainBundle] loadNibNamed:NSStringFromClass(className) owner:self options:nil];
   } return self;
}

Em outra classe, o controlador foi criado da seguinte maneira:

CustomController *controller = [[CustomController alloc] init];

O problema é que, no método init, o self não mudou e deve ficar assim:

- (id)init {
   self = [super init];
   if (self) {
      CustomController *controller = [[NSBundle mainBundle] loadNibNamed:NSStringFromClass(className) owner:self options:nil];
      [controller viewDidLoad];
      self = controller;
   } return self;
}
Declan Land
fonte
0

Gostaria de dizer a Stephen J. Algumas vezes, o X Code fica confuso. Acabei de ter uma experiência em que brinquei bastante com a interface do usuário e adicionei e excluí algumas tomadas várias vezes. As tomadas simplesmente não ligavam mais. Eu nunca descobri um motivo específico (tentei todas as soluções acima) e só precisei excluir o NIB e recriá-lo do zero, e na verdade tive que usar um nome diferente para o NIB antes que funcionasse. (XCode 4.6.1) Desperdiçou algumas horas com isso.

BrianH
fonte