Renommer une classe dans Xcode: Refactor… est grisé (désactivé). Pourquoi?

112

Pourquoi Refactor ... est-il grisé (désactivé) dans Xcode?

Je voudrais renommer une classe.

Elliot
la source

Réponses:

181

Sélectionnez le symbole de la classe dans son fichier d'en-tête - c'est-à-dire le bit juste après @interface. Ensuite, les éléments de refactoring doivent être activés.

Noah Witherspoon
la source
Le fichier d'en-tête de ma classe n'a que @interface, pas de @class. Mais sélectionner le symbole après @interface semble fonctionner.
Elliot
3
@class if for forward declarations… s
Jonathan Sterling
Cela me dérange depuis un certain temps également. Merci!
Jonatan Hedborg
Même cela ne permet pas le refactoring dans xcode 4. Je deviens désespéré, pourquoi Apple n'améliore pas leurs choses Refactoring. Il y a Eclipse à suivre, comment faire les choses!
karim
@karim - cela n'a jamais fonctionné dans Xcode, voir ma réponse ci-dessous pour une solution de contournement qui fonctionne à chaque fois
Adam
26

Si vous utilisez Objective-C ++ (c'est-à-dire mélanger Objective-C avec du code C ++), le refactoring est désactivé dans xcode car il ne prend pas en charge le refactoring du code C ++.

Volker Voecking
la source
Très triste, presque 2 ans plus tard et cela ne refactorisera toujours pas les objets Objective-C.
christophercotton
@christophercotton Essayez presque 8 ans plus tard, et il n'est toujours pas implémenté.
Alex
7

Refactor peut également être désactivé si les fichiers concernés (probablement le fichier contenant votre classe) ne sont pas enregistrés.

klaaspieter
la source
1
L'enregistrement d'un fichier xib dans Interface Builder a réactivé la refactorisation pour moi, alors que même la relance de Xcode n'aidait pas, merci!
Vincent Gable
1
+1 pour cela. Certains coins de XCode ont encore des zones rugueuses et c'est l'une d'entre elles. Parfois, si l'enregistrement ne permet pas la refactorisation, la reconstruction le sera.
memmons
6

J'utilise Xcode depuis maintenant 5 ans et le refactoring n'a jamais fonctionné correctement (même xcode 4.6 a des bogues majeurs où il corrompra votre code source!).

La solution de contournement a toujours été (fonctionne toujours à 100%, même dans les cas où le code d'Apple échoue)

  1. utilisez shift-command-f pour trouver toutes les utilisations du fichier
  2. sélectionnez "remplacer" dans les paramètres de recherche
  3. "remplace tout"
  4. procédez comme suit pour le fichier .h et RÉPÉTEZ-LE POUR LE FICHIER .m (si vous en avez un):
    1. cliquez avec le bouton droit de la souris sur le fichier d'origine et sélectionnez "Afficher dans le Finder"
    2. supprimer le fichier de xcode (sélectionnez "supprimer les références uniquement" lorsque vous y êtes invité)
  5. renommer le .h (et .m si vous en avez un) dans le Finder
  6. dans Xcode, sélectionnez "Produit -> (maintenez la touche Alt enfoncée) -> Nettoyer le dossier de construction"
  7. quittez xcode (vous pouvez généralement vous en tirer sans faire cela - mais REMARQUE: il y a d'autres bogues MAJEURS dans Xcode où il se bloque si vous ne le faites pas)
  8. rouvrir xcode
  9. faites glisser / déposez les fichiers .h et .m dans Xcode
  10. attendez quelques secondes (certaines des méthodes de base de Xcode sont asynchrones - ce qui lui permet de corrompre votre projet)
  11. enfin, quand il semble ne rien faire (et que votre disque dur ne fait plus de bruit): cmd-b à reconstruire

J'ai un taux de réussite de 100% avec cette méthode. J'ai juste essayé de refactoriser avec "Refactor -> Rename" d'Apple dans le dernier xcode et cela a échoué - encore une fois!

(cette fois avec l'erreur incorrecte: "Impossible de déterminer la langue de", l'un de ces messages d'erreur où Apple a mis le mauvais texte en place)

Adam
la source
Oui, j'ai essayé cela récemment (mai 2014) et l'option de menu "refactor" officielle de Xcode est toujours cassée, elle corrompt toujours votre code source. Je suis surpris que le personnel Apple ne soit pas dérangé par cela.
Adam
3

Je vais à mon projet au finder, puis change le nom des fichiers en obtenant des informations .

Après cela, à xcode -> Project Navigator, je supprime les fichiers.

À la fin, je clique à droite sur la classe et Ajouter des fichiers à ... , et ajoute à nouveau ces fichiers.

Cela a fonctionné pour moi.

décalage
la source
2

Pour moi, j'ai réalisé que Refactor était désactivé parce que le projet Xcode que j'avais ouvert faisait référence à un SDK de base qui manquait. Modifiez les paramètres du projet et dans l'onglet Construire, définissez le SDK de base sur celui que vous avez (comme pour moi, c'était iOS 4.2). Cela a activé Refactor pour moi.

user591345
la source
1

En outre, il se peut que vous ayez renommé le nom de fichier de la classe, soit en dehors de xcode, soit en cliquant sur le nom de fichier en maintenant la touche Ctrl enfoncée, puis en le renommant. xcode refuse de refactoriser si le nom du fichier ne correspond pas au nom de la classe.

carlos_ms
la source
1

Accédez au fichier d'en-tête de votre classe et trouvez la ligne qui ressemble à ceci:

@interface YourClassName

Cliquez avec le bouton droit sur le symbole de la classe (par exemple YourClassName) et vous devriez pouvoir sélectionner Refactor -> Renommer ...

Je viens d'essayer et cela fonctionne dans Xcode 5.

cible facile
la source
0

Eu ce problème aussi. J'ai essayé de trouver des SDK manquants, d'enregistrer des fichiers et de rechercher du code Objective-C ++ comme mentionné ci-dessus, et tout ce qu'il fallait pour réparer ma machine était de redémarrer XCode.

Semble encore un peu bogué.

BTW, c'était pour XCode 4.0.1

gdavis
la source
-1

La refactorisation fonctionne Si vous modifiez d'abord le nom du fichier dans le navigateur de projet.

Chris
la source