Xcode 4: Criando um UIView xib, não conectando corretamente

84

Estou tentando criar uma ponta que contém um modo de exibição que será incorporado em um TableViewCell. Criei a interface e os arquivos de implementação ResultCell.he ResultCell.m. Eles são padrão, prontos para uso, sem alterações de código.

Em seguida, crio um arquivo XIB vazio e arrasto um UIView para ele. Em seguida, clico em Proprietário do arquivo e defino o tipo como ResultCell. Eu clico na visualização e defino sua classe como também ResultCell.

Aqui estão os problemas que tenho:

  1. Ao usar a visualização do Editor Assistente (na qual moro), o ResultCell.harquivo não aparece quando estou visualizando o arquivo ResultCell.xib. Tenho que forçar o carregamento clicando em Automático e selecionando o arquivo.
  2. Quando solto um rótulo na visualização e, em seguida, Ctrl + Clique e arrasto para o .h para criar uma tomada, recebo esta mensagem de erro: " Não foi possível inserir uma nova conexão de tomada: não foi possível encontrar nenhuma informação sobre a classe chamada ResultCell. "

Tentei criar e recriar a exibição, mas não está funcionando e comecei a perder a paciência. Qualquer ajuda seria muito, muito apreciada!

Tim Sullivan
fonte
Eu apenas corri para isso sozinho. Ontem à noite funcionou e hoje nada. Avisarei você se encontrar alguma coisa.
Tavison
Para constar, várias respostas aqui me ajudaram no ano passado. As versões recentes do Xcode melhoraram as coisas.
Tim Sullivan

Respostas:

82

Isso pode não funcionar para o seu problema específico, mas ocasionalmente recebo esse erro ao trabalhar com pontas recém-criadas. Excluir e recriar os nibs e os controladores de visualização com os mesmos nomes de antes não resolveu o problema, mas relançar o Xcode resolveu.

Defragged
fonte
+1 funcionou para mim também. Apenas reinicie o XCode, e agora posso CTRL + arrastar para criar novos @propertys em meu arquivo .h.
Mike Gledhill
1
A resposta de David Pisoni funcionou para mim. Simplesmente reiniciar o Xcode não cortou a mostarda.
Andy
Não tive esse problema ocorrendo em muitos lançamentos do Xcode agora, então provavelmente há outra causa que é mais prevalente agora do que aquela que eu estava experimentando quando escrevi esta resposta no ano passado.
Desfragmentado
@Defragged você também pode incluir a etapa para limpar o cache pressionando Comando K antes de citar ou ainda melhor é sair do Xcode e limpar o cache ( ~/Library/Developer/Xcode/DerivedData)
user1046037
Estou trabalhando com o Xamarin Studio. Tive que sair do xcode e do xamarin studio e, em seguida, reabrir o Xamamrin Studio e abrir um arquivo xib daqui que foi iniciado no xcode. O editor assistente então abriu corretamente.
Dave Haigh,
113

Eu entrei em um estado semelhante hoje. Foi muito estranho: eu poderia anexar qualquer XIB (novo ou existente) a qualquer classe ViewController já existente no projeto, mas não consegui criar um novo ViewController e anexá-lo corretamente a qualquer XIB. A funcionalidade "assistente" não funcionou, nem a funcionalidade de conexão IB-para-headerfile.

Fechar o projeto e reabri-lo não resolveu.
Sair do XCode e reiniciar não resolveu o problema.
Criar um novo projeto e testar a funcionalidade funcionou bem, o que me levou a acreditar que havia algo corrompido em algum cache em algum lugar.

Minha solução

  • Feche seu projeto.
  • Vá para a pasta ~ / Library / Developer / XCode / DerivedData e REMOVA todas as subpastas que fazem referência ao projeto em que você está trabalhando.
  • Abra seu projeto no XCode. O problema deve ser resolvido agora.

A propósito, apenas fazer uma limpeza completa não parecia esclarecer as coisas. Eu tive que destruir os dados derivados. Tenho certeza de que fiquei nessa posição por causa dos jogos git que estava jogando, mas não tinha ideia de como sair, porque mesmo voltar para as revisões anteriores do git não ajudou. (Essa também foi uma grande pista de que era algo não rastreado pelo próprio projeto.)

David Pisoni
fonte
6
Acabei de entrar no SO no meu Mac para poder votar a favor desta resposta! Funcionou totalmente para mim. Isso estava me deixando louco, pois estou apenas aprendendo a usar o XCode e já é difícil o suficiente sem problemas ridículos como esses. :) Obrigado!!!
Dave
2
funciona até mesmo sem reiniciar o xcode; apenas excluindo dados derivados e reconstruindo (em um projeto iOS)
novembro
Isso funcionou ao reiniciar o xcode, não. Não tenho ideia de como isso aconteceu, pois o método de David Pisoni funcionou muito bem.
mmopy
Impressionante. Como você soube disso? Funcionou para mim.
feriado de
1
lol é bom saber que IOS e xcode podem ser tão bugs, senão mais do que usar eclipse e Android: p
James andresakis
14

Acabei de ter esse problema e reiniciar o Xcode não resolveu. Eu removi os arquivos da classe do projeto, então os adicionei de volta e ele começou a funcionar.

Jasongregori
fonte
13

Eu tive o mesmo problema. E eu tentei:

  • Reiniciando o Xcode
  • Excluindo Dados Derivados
  • E muitos mais

Nada disso funcionou. O que funcionou para mim foi simplesmente:

  • Remova os arquivos de classe 'suspeitos' do Projeto (apenas remova as referências, hein?)
  • Adicione-os novamente ao projeto

E feito!

Dr.Kameleon
fonte
2
Isso funcionou para mim, obrigado! Foi a primeira coisa que tentei, além de reiniciar o XCode, já que parecia o mínimo de trabalho e risco, e funcionou muito bem.
adriandz
1
funcionou para mim depois de reiniciar o xcode e excluir os dados derivados didnt
elad em
1
Este também funcionou para mim. Isso pode ter algo a ver com a refatoração dos nomes das classes (que é o que acabei de fazer antes).
ecotax
9

Se reiniciar o Xcode não funcionar com você, descobri que Alternar o novo arquivo .m para fora e de volta para a associação de destino funciona.

Duane Fields
fonte
3

Isso me ajudou:

  1. no painel do arquivo de projeto (lado esquerdo), selecione o arquivo xib que está quebrado.
  2. Clique no ícone Proprietário dos arquivos na visualização do editor.
  3. no painel de propriedades (lado direito), selecione a terceira guia (no topo)
  4. especificar a "classe personalizada"

Se você não vir um "painel", dê uma olhada no canto superior direito da janela e habilite os botões de "visualização" adequados. Se você não vir os botões "visualizar", clique no botão da cápsula mais à direita.

Ivan Dossev
fonte
Eu tinha mudado (refatorado) recentemente o nome da classe. A classe personalizada mencionada nesta resposta ainda estava configurada com o nome antigo. Alterou para o novo nome e está corrigido.
PaulMrG
2

Percebi que o arquivo .m foi movido para dentro da pasta en.lproj.

Apenas exclua (apenas referência) o arquivo .m do Xcode e mova .m para fora do en.lproj. Adicione-o novamente. Isso resolverá o problema.

Não se preocupe, você receberá todas as suas conexões de volta.

COMO
fonte
Meu .m foi gerado automaticamente e eu ainda não o tinha alterado. Eu fiz e estava tudo bem. Nada mais funcionou.
entonio
2

Eu encontrei o mesmo problema hoje. Reiniciar o XCode não resolveu o problema para mim. Consegui voltar ao normal usando a opção "Excluir" de "Dados Derivados" do projeto que pode ser encontrado no Organizer . O Organizer diz que, "Dados derivados incluem índice, saída de construção e logs". Acho que o índice ou a saída da compilação estavam causando esse problema.

Praveen Kumar
fonte
2

no XCode vá para o organizador, clique no projeto, clique em excluir dados derivados ... e limpe o projeto

Peter Lapisu
fonte
2

No meu caso, ajudou a fazer uma "mudança falsa" (apenas um espaço) para o arquivo de cabeçalho correspondente.

jakob.j
fonte
Eu acho que isso pode ter feito isso por mim também. No meu caso, adicionei uma tomada manualmente. Consegui então conectar meu macarrão a ele, bem como criar novos pontos de venda arrastando com o botão Ctrl pressionado.
Daniel Wood
1
  1. ResultCell deve ser uma subclasse de UITableViewCell
  2. Você não deve arrastar um UIViewpara a tela vazia, você deve arrastar umUITableViewCell
  3. Você deve selecionar a célula e alterá- la para ser sua subclasse
  4. O proprietário é na maioria das vezes um controlador com uma saída para a célula

Toda vez que você quiser carregar um novo celular, ligue:

 [[NSBundle mainBundle] loadNibNamed:nibName 
                               owner:controllerWithOutletToCell 
                             options:nil]

após o carregamento, use a célula e defina a ivar / saída para zero, pronto para a próxima carga

existem outras formas, mas isso é comum

bshirley
fonte
Se eu fizer isso, terei exatamente o mesmo problema. O Editor Assistente não exibe o .h quando estou visualizando a ponta, e ctrl + arrastar não cria o código da tomada, ele exibe o erro.
Tim Sullivan
2
Você está usando o 4.0.2 Xcode? Você pode definir manualmente o editor assistente se ele estiver se comportando mal. Presumo que você reiniciou o aplicativo para testar novamente esse problema (o Xcode 4 geralmente se beneficia disso). Parece que ele não consegue encontrar os arquivos de classe no projeto, ou algo está com o nome incorreto - a capitalização é importante. O projeto está em construção atualmente? Esta é uma funcionalidade de nível muito alto que depende da nova tecnologia de compilador.
bshirley
Ai, ai. Sim, reiniciei o Xcode e ele imediatamente começou a funcionar. - Com licença, vou cair sobre minha espada agora.
Tim Sullivan
1

Talvez o que funcionou para mim seja isso .. (Xcode v4.5)

Isso não funcionou

Eu estava tentando controlar o arrasto para a definição da interface do meu .h

@interface SearchViewController : UIViewController

@end

Funcionou (pode ser assim que deveria funcionar, eu não sabia antes) Veja os colchetes de abertura e fechamento. Controlar arrastar e soltar após o colchete fechado.

@interface SearchViewController : UIViewController
{
}

@end
Mouli
fonte
1

Tive um problema semelhante com um projeto escrito em Swift.

O que funcionou para mim foi configurar o IBOutlet em um código como este

@IBOutlet var foo: UIView?

e depois conecte-o ao Interface Builder arrastando-o até o pequeno círculo que apareceu ao lado da linha de código.

Patrick
fonte
Esta é a ÚNICA maneira que consegui fazer funcionar para mim também. Eu estava seguindo um tutorial da Apple escrito para Objective-C (comece a desenvolver aplicativos iOS hoje) e precisava conectar o campo de texto New To-Do Item. Finalmente criei @IBOutlet var textField: UITextField? e conectado a isso, e funcionou. Usando o XCode 6.4
andrewz
1

Nenhuma das soluções alternativas acima resolveu o problema do conector para mim, então engavetei meu projeto de estimação até encontrar o seguinte thread de stackoverflow:

https://stackoverflow.com/a/15873770/2846800

Eu estava trabalhando em um grande projeto em uma versão anterior do XCode e desativei a indexação. Ao reativar a indexação, meu problema foi corrigido:

defaults delete com.apple.dt.XCode IDEIndexDisable

Agora posso usar os recursos de D&D do Interface Builder. Espero que isso possa ajudar outros ...

user2846800
fonte
1

Este problema parece ser um bug do Xcode que surge principalmente quando você substitui um arquivo por um novo arquivo com o mesmo nome. O Xcode parece manter uma referência do arquivo mais antigo de mesmo nome.

De qualquer forma, a maneira de consertar isso parece ser:

  1. Limpe o projeto
  2. Clique em (Seu projeto) na visualização Project Navigator. Vá para Códigos de compilação em Fases de compilação do destino para o qual você está compilando. Remova e adicione novamente o arquivo .m que está causando problemas.
  3. Como alternativa, no Inspetor de arquivos (visualização Utilitários) do arquivo NIB, em Associação ao destino, desmarque e verifique novamente o nome do destino.
  4. Reinicie o Xcode para uma boa medida.
  5. Claro, excluir e adicionar de volta o arquivo .m sozinho deve corrigir isso também.

(As etapas 1 e 2 resolveram sozinho para mim.)

codeburn
fonte
0

Se você copiou arquivos de outro projeto, certifique-se de marcar a caixa 'Adicionar aos destinos'

John67
fonte
0

Sintoma semelhante, mas causa diferente.

Aparentemente, apertei a tecla de retrocesso quando o foco estava na visualização do assistente, porque uma das linhas de comentário do modelo de arquivo padrão foi de // para / o que resultou na não compilação do arquivo.

A correção do comentário permitiu que o SDK analisasse o arquivo, reconhecesse-o como um UIViewController e adicionasse no outlet.

SO - se você tiver este problema, faça uma compilação ou analise para ver se há erros que precisam ser corrigidos no arquivo .h do controlador de visualização. ENTÃO tente as outras soluções.

software evoluiu
fonte
0

Esse pode ser um tópico antigo, mas caso alguém tenha o mesmo problema no futuro, tente excluir os arquivos .xib, .h e .m associados e criar novos. Para mim, o UIViewController no meu arquivo .h não estava roxo e mesmo retroceder e digitar não ajudou.

SG
fonte
0

Basta colocar uma linha entre @implementation e @synthesize. A maioria das respostas aqui tem isso em comum. Funcionou para mim

@implementation 

@synthesize
user2371963
fonte
0

Acabei de tentar de tudo aqui e nada funcionou (usando um Developer Preview para Xcode 5).

A única coisa que funcionou para mim foi colocar esta linha incompleta no meu arquivo de interface:

@property (nonatomic, weak)

Por alguma razão, adicionar pontos de venda e ações arrastando e soltando de um .xib funcionou bem depois disso.

Djibouti33
fonte
0

Para mim, limpar ou excluir os DerivedData resolveu o problema.

Tentei excluir e recriar minha classe UIViewController várias vezes e tive o problema novamente.

Em seguida, recriei a classe UIViewController e dei a ela um nome diferente. Isso resolveu o problema para mim.

Fabian Stark
fonte
0

Eu tive esse problema e encontrei uma solução não listada acima.

No meu caso, pude ver que havia algo errado no arquivo .h da classe porque meu controlador de visualização personalizada não reconheceu a classe: UIViewController (estava em preto e não em roxo). Todos os outros controladores de visualização personalizados tinham: UIViewController em roxo.

no meu caso, e possivelmente no seu, precisei adicionar a classe ao menu suspenso alvos / fases de construção / fontes de compilação. O .m precisa ser adicionado. Todos os outros .m estavam lá, mas não este.

Depois de adicioná-lo, o: UIViewController apareceu em roxo e tudo funcionou bem.

Michendo
fonte
0

No meu caso, tenho vários projetos com algumas outras dependências. Tentei resolver isso excluindo dados derivados ou reiniciando o XCode, mas não funcionou. No final, tentei o seguinte método e funcionou:

Vá para target> Build Target Architectures Only> e defina Debug e Release como NO.

Defina isso para todos os projetos na área de trabalho e recompile para garantir que não haja outros erros. Talvez não fizesse sentido, mas de alguma forma fazia. Durante minha compilação, tive outros problemas, como erros de linker e símbolos não encontrados.

morph85
fonte
0

Para o arquivo * .m desta visualização de classe, abra "Mostrar Inspetor de Arquivos" e desmarque "Associação de destino" para este projeto, então faça Limpar (menu Produto-> Limpar) e marque novamente "Associação de destino" para este projeto

insira a descrição da imagem aqui

Kozlov V
fonte
0

Usando o Swift, tive um problema semelhante. Descobri que os comentários eram parte do problema para mim.

Aproveitei o controlador de visualização padrão, trabalhei nele e criei um segundo controlador de visualização copiando o primeiro inteiro, reduzindo-o para apenas viewDidLoad () e renomeando a classe para TestViewController. Builds funcionaram, código executado. Tudo estava bom.

Quando fui arrastar um UITextField para criar uma saída, ele não permitiu. Percebi que meus comentários ainda diziam "ViewController.swift", então mudei o texto do comentário para "TestViewController.swift" e recompilei. Consegui conectar minha tomada!

Eu me pergunto se o que aconteceu é que o Indexador estava lendo os comentários, bem como os nomes das classes, e de alguma forma ficou confuso.

Antonio Ciolino
fonte
0

Espero que isto seja útil a alguém.

Eu só tive que excluir a pasta de dados derivados. Você precisa clicar em Janela -> Organizador -> Projetos -> Excluir Dados Derivados

E REINICIE XCODE.

Você deve estar pronto para ir!

Ronaldoh1
fonte
0

O fato de a nova classe não fazer parte do "ALVO" é provavelmente a causa raiz disso, conforme aludido por algumas dessas respostas.

Ao criar uma nova classe de cacau, por padrão, a opção de adicionar uma nova classe ao destino é marcada por padrão, mas deve, por qualquer motivo, isso não ser verificado quando você clicar em salvar, você terá esse problema.

Alvo de nova classe

Qualquer uma dessas soluções alternativas que adicionam a nova classe ao destino de aplicativos funcionará para resolver o problema, e é algo que todas essas 'correções' têm em comum.

Acho que o XCode provavelmente tem alguns bugs que fazem com que um novo arquivo, por padrão, NÃO seja adicionado ao destino principal do aplicativo. A correção se resume a adicionar sua classe 'quebrada' ao TARGET principal

Michael Bopp
fonte
0

No XCode 7.1, adicionar o conector em um ponto diferente no meu arquivo de origem funcionou. O erro que estava recebendo referia-se a uma das minhas variáveis ​​como se fosse uma classe (não fazia sentido). O erro parou de ocorrer quando adicionei o conector abaixo dessa variável em vez de acima dela.

user2683747
fonte
0

Há também um motivo diferente para o problema ... se você criou um novo arquivo de classe cocoa com um modelo diferente de ios ... eu posso acontecer ...

A solução seria excluí-lo e recriá-lo com o modelo correto insira a descrição da imagem aqui

Mihir Mehta
fonte