2015-09-23 5 views
25

Cercando di rinominare una classe selezionando il nome della classe (ViewController) dopo @interface:la selezione non è un tipo che può essere rinominato Xcode 7

@interface ViewController : UIViewController 

clic destro, selezionando Refactor -> Rinomina risultati nel seguente Messaggio di errore finestra:

enter image description here

questo ha funzionato bene in Xcode 6, è presente una sorta di regressione? Ho provato this solution for Xcode 4 inutilmente. Qualcuno sa di un lavoro in giro?

+0

Hai provato Modifica -> Refactoring> Rinomina? – Abhinav

+0

Solo provato, stesso risultato. – Stunner

+0

Mi chiedo perché l'interfaccia non sia '@interface ViewController: UIViewController' o' @interface ViewController() '? – WangYudong

risposta

27

Sì, refactoring è male rotto in Xcode 7.

ho trovato problemi simili quando si cerca di rinominare proprietà, metodi e classi. Ieri ho scaricato 7.1.1 con la speranza che potrebbero esserci dei miglioramenti ma nessuno finora.

ho fatto dei test in un campione unico progetto vista in Objective-C su Xcode 7.1.1 e trovato il seguente:

  1. Se si tenta di rinominare una proprietà che ha IBOutlet parola chiave, fallirà;
  2. Se si tenta di rinominare un'altra proprietà che non è IBOutlet, ma al di sopra della sua dichiarazione si ha una proprietà che è IBOutlet, la rinomina avrà esito negativo;
  3. Se si tenta di rinominare un metodo dichiarato sotto la proprietà IBOutlet e di fare clic con il pulsante destro del mouse sul metodo nel file .h, la rinomina avrà esito negativo;
  4. Se si tenta di rinominare una classe che #importa una classe che ha alcune dichiarazioni IBOutlet nel file di intestazione, la rinomina avrà esito negativo (evidenziato poiché questo è il caso, la domanda originale riguarda).

Per fortuna ho trovato anche alcune soluzioni:

  1. Se si sposta la dichiarazione della vostra proprietà sopra dichiarazioni IBOutlet, rinominare avrà successo;
  2. Se è necessario rinominare IBOutlet, è possibile spostarlo sopra tutti gli altri IBOutlet e rimuovere la parola chiave IBOutlet prima di rinominarlo. La rinomina avrà successo (e lo cambierà anche in Storyboard), quindi potrai aggiungere la parola chiave IBOutlet;
  3. Se si sposta la dichiarazione del metodo sopra qualsiasi proprietà IBOutlet, la rinomina avrà esito positivo dal file .h, ma in alternativa sembra funzionare anche se si tenta di rinominarlo durante la selezione in un file .m (quest'ultimo caso funziona anche se metodo è dichiarato nel file .h sotto le proprietà di IBoutlet);
  4. Quando si rinomina la classe che importa un'altra classe con IBOutlet, è possibile effettuare le seguenti operazioni: spostare gli IBOutlet dell'altra classe dal file .h al file .m. Quindi rinominare le opere. In alternativa, rimuovere tutte le parole chiave IBOutlet prima di ridenominarle, quindi aggiungerle di nuovo dopo.

Nota: Quando dico che rinomina riesce, voglio dire - esso non indicherò "la selezione non è un tipo che può essere rinominato".Tuttavia continua a non funzionare regolarmente la maggior parte del tempo:

  1. Non mostra le modifiche da apportare nei file, come era solito fare;
  2. Si può lamentare del fatto che i file siano stati modificati da un'altra applicazione mentre Xcode ha modifiche non salvate. Come ho scoperto, di solito devi scegliere "Mantieni la versione Xcode";
  3. Potrebbe non riuscire a rinominare la proprietà in tutti i file in cui è stata utilizzata. Questo è il più importante, che in alcuni casi rende inutili tutti i workaround. In particolare l'ho visto quando si rinomina le proprietà di IBOutlet con il metodo che ho descritto sopra.

Speranza che aiuta :)

+0

Dovrebbe essere la risposta accettata. +1 – Yoko

+0

salvato il mio giorno ... – iBug

+0

Per IBOutlets, la ricerca/sostituzione globale è un'alternativa ragionevole, sebbene sia necessario fare attenzione poiché è solo basata sul testo e può corrispondere a più di quella desiderata – Jon

5

Un modo per risolvere questo problema fino a quando non viene corretto in Xcode è aggiungere una dichiarazione anticipata al file di intestazione (in una riga separata sopra la linea @interface). In questo modo:

@class ClassName 

Dopo averlo aggiunto, eseguire la ridenominazione su questo, anziché sulla riga @interface. È possibile rimuovere la dichiarazione di inoltro dopo la ridenominazione

+0

Quale versione di Xcode hai testato su questo? – Stunner

+1

Non funziona su Xcode 7.2 –

+0

Sto anche usando 7.2. Immagino che fino a quando non sarà corretto da Apple, le persone dovranno solo provare le diverse opzioni, e speriamo che uno di loro funzioni per te. Probabilmente la prossima volta che cercherò di usare la dichiarazione forward, non funzionerà. – MSimic