Renomear uma classe no Xcode: Refactor… está esmaecido (desabilitado). Por quê?

112

Por que Refactor ... está esmaecido (desabilitado) no Xcode?

Eu gostaria de renomear uma classe.

Elliot
fonte

Respostas:

181

Selecione o símbolo da classe em seu arquivo de cabeçalho - ou seja, o bit logo depois @interface. Então, o material de refatoração deve ser ativado.

Noah Witherspoon
fonte
O arquivo de cabeçalho da minha classe tem apenas @interface, não @class. Mas selecionar o símbolo após @interface parece funcionar.
Elliot
3
@class se para declarações futuras ... s
Jonathan Sterling
Isso também tem me incomodado há algum tempo. Obrigado!
Jonatan Hedborg
Mesmo isso não permite a refatoração no xcode 4. Estou ficando sem esperança, por que a apple não melhora suas coisas de refatoração. Há Eclipse a seguir, como fazer as coisas!
karim
@karim - nunca funcionou no Xcode, veja minha resposta abaixo para uma solução alternativa que funciona sempre
Adam
26

Se você estiver usando Objective-C ++ (ou seja, misture Objective-C com código C ++), então a refatoração é desabilitada no xcode, pois não suporta a refatoração de código C ++.

Volker Voecking
fonte
Muito triste, quase 2 anos depois e ainda não refatorou os objetos Objective-C.
christophercotton de
@christophercotton Tente quase 8 anos depois, e ainda não foi implementado.
Alex
7

A refatoração também pode ser desabilitada se os arquivos afetados (provavelmente o arquivo com sua classe) não forem salvos.

klaaspieter
fonte
1
Salvar um arquivo xib no Interface Builder reativou a Refatoração para mim, mesmo quando relançar o Xcode não estava ajudando, obrigado!
Vincent Gable
1
1 para isso. Alguns cantos do XCode ainda possuem áreas irregulares e este é um deles. Às vezes, se salvar não habilitar a refatoração, a reconstrução o fará.
memmons de
6

Eu uso o Xcode há 5 anos e a refatoração nunca funcionou corretamente (até mesmo o xcode 4.6 tem grandes bugs que IRÃO corromper seu código-fonte!).

A solução alternativa sempre foi (ainda funciona 100%, mesmo nos casos em que o código da Apple falha)

  1. use shift-command-f para encontrar todos os usos do arquivo
  2. selecione "substituir" nas configurações de pesquisa
  3. "substitua tudo"
  4. faça o seguinte para o arquivo .h e REPITA PARA O ARQUIVO .m (se você tiver um):
    1. clique com o botão direito no arquivo original e selecione "mostrar no localizador"
    2. exclua o arquivo do xcode (selecione "excluir referências apenas" quando solicitado)
  5. renomeie o .h (e .m se você tiver um) no Finder
  6. no Xcode, selecione "Produto -> (mantenha pressionada a tecla Alt) -> Limpar pasta de compilação"
  7. saia do xcode (normalmente você pode escapar sem fazer isso - mas NOTA: existem alguns outros erros PRINCIPAIS no Xcode onde ele trava sozinho se você não fizer isso)
  8. reabra o xcode
  9. arraste / solte o .h e .m de volta ao Xcode
  10. espere alguns segundos (alguns dos métodos principais do Xcode são assíncronos - o que permite corromper seu projeto)
  11. finalmente, quando parece que não está fazendo nada (e seu disco rígido não está mais fazendo barulho): cmd-b para reconstruir

Tenho uma taxa de sucesso de 100% com este método. Eu tentei refatorar com "Refactor -> Rename" da Apple no último xcode e falhou - de novo!

(desta vez com o erro incorreto: "Não foi possível determinar o idioma de", uma daquelas mensagens de erro em que a Apple inseriu o texto incorreto)

Adão
fonte
Sim, eu tentei isso recentemente (maio de 2014) e a opção de menu "refatorar" oficial do Xcode ainda está quebrada, ainda corrompe seu código-fonte. Estou surpreso que a equipe da Apple não se incomode com isso.
Adam
3

Vou para o meu projeto no Finder e, em seguida, altero o nome dos arquivos obtendo informações .

Depois disso, em xcode -> Project Navigator eu excluo os arquivos.

No final, clico com o botão direito na classe e adiciono arquivos a ... , e adiciono esses arquivos novamente.

Funcionou para mim

Deslocamento
fonte
2

Para mim, percebi que Refactor estava desativado porque o projeto Xcode que abri fazia referência a um SDK Base que estava faltando. Edite as configurações do projeto e na guia Build defina o Base SDK para um que você tem (como para mim, era iOS 4.2). Isso habilitou Refatorar para mim.

user591345
fonte
1

Além disso, pode acontecer de você renomear o nome do arquivo da classe, seja fora do xcode ou clicando com a tecla Ctrl pressionada no nome do arquivo e renomeando-o. xcode se recusa a refatorar se o nome do arquivo não corresponder ao nome da classe.

carlos_ms
fonte
1

Vá para o arquivo de cabeçalho de sua classe e encontre a linha semelhante a esta:

@interface YourClassName

Clique com o botão direito no símbolo da classe (por exemplo, YourClassName) e você deverá ser capaz de selecionar Refatorar -> Renomear ...

Acabei de experimentar e funciona no Xcode 5.

alvo fácil
fonte
0

Tive esse problema também. Corri tentando encontrar SDKs ausentes, salvando arquivos e procurando o código Objective-C ++ conforme mencionado acima, e tudo o que precisei para consertar minha máquina foi reiniciar o XCode.

Ainda parece um pouco bugado.

BTW, isso era para XCode 4.0.1

gdavis
fonte
-1

A refatoração funciona se você alterar primeiro o nome do arquivo no navegador do projeto.

Chris
fonte