Подтвердить что ты не робот

Выбор не тип, который можно переименовать Xcode 7

Попытка переименовать класс, выбрав имя класса (ViewController) после @interface:

@interface ViewController : UIViewController

Щелкните правой кнопкой мыши, выбрав Refactor → Rename, появится следующее окно предупреждения об ошибке:

введите описание изображения здесь

Это отлично работает в Xcode 6, это какой-то регресс? Я попробовал это решение для Xcode 4 безрезультатно. Кто-нибудь знает о любой работе вокруг?

4b9b3361

Ответ 1

Да, рефакторинг сильно поврежден в Xcode 7.

Я нашел похожие проблемы при попытке переименовать свойства, методы и классы. Вчера я загрузил 7.1.1 с надеждой, что могут быть некоторые улучшения, но пока нет.

Я провел некоторое тестирование в одном проекте с одним представлением в Objective-C на Xcode 7.1.1 и нашел следующее:

  • Если вы попытаетесь переименовать свойство с ключевым словом IBOutlet, оно не будет выполнено;
  • Если вы попытаетесь переименовать другое свойство, которое не является IBOutlet, но над его объявлением вы имеете любое свойство, которое является IBOutlet, переименование не будет выполнено;
  • Если вы попытаетесь переименовать метод, объявленный ниже, свойство IBOutlet и сделайте это, щелкнув правой кнопкой мыши метод в файле .h, переименование не будет выполнено;
  • Если вы попытаетесь переименовать класс, который #imports класс, который имеет некоторые объявления IBOutlet в файле заголовка, переименование не будет выполнено (выделено, так как это так, этот оригинальный вопрос).

К счастью, я также нашел некоторые обходные пути:

  • Если вы переместите объявление своего свойства над объявлениями IBOutlet, переименование будет успешным;
  • Если вам нужно переименовать IBOutlet, вы можете переместить его выше всех других IBOutlets и удалить его ключевое слово IBOutlet перед его переименованием. Переименование будет успешным (и также переименует его в Storyboard), тогда вы можете добавить ключевое слово IBOutlet назад;
  • Если вы переместите объявление своего метода выше любого переименования свойств IBOutlet, оно будет успешным из файла .h, но, как альтернатива, оно также работает, если вы попытаетесь переименовать его при выборе в файле .m(последний случай работает, даже если метод объявляется в файле .h ниже свойств IBoutlet);
  • При переименовании класса, который импортирует другой класс с помощью IBOutlets, вы можете сделать следующее: переместите IBOutlets другого класса из файла .h в файл .m. Затем переименовывается. Альтернативно - удалите все ключевые слова IBOutlet перед переименованием и затем добавьте их обратно после него.

Примечание.. Когда я говорю, что переименование выполнено успешно, я имею в виду - он не покажет вам "Выбор не тип, который можно переименовать". Однако он все еще не работает гладко большую часть времени:

  • Он не показывает изменения, которые должны быть внесены в файлы, как это было раньше:
  • Он может жаловаться на то, что файлы были изменены другим приложением, в то время как Xcode имеет несохраненные изменения. Как я уже нашел, обычно вам нужно выбрать "Keep Xcode Version";
  • Он может не переименовать свойство во всех файлах, которые он использовал. Это наиболее важно, что в некоторых случаях делает все обходные пути бесполезными. В частности, я видел это при переименовании свойств IBOutlet с помощью метода, описанного выше.

Надеюсь, это поможет:)

Ответ 2

Один из способов обхода этой проблемы до тех пор, пока она не будет исправлена ​​в Xcode, добавит в заголовочный файл декларацию вперед (в отдельной строке над строкой @interface). Вот так:

@class ClassName

После того, как он будет добавлен, переименуйте это, а не на строку @interface. Вы можете удалить переднюю декларацию после переименования