Переименовать класс в Xcode: Refactor… неактивен (отключен). Зачем?

Ответы:

181

Выберите символ класса в его заголовочном файле, то есть бит сразу после него @interface. Затем следует включить рефакторинг.

Ной Уизерспун
источник
В заголовочном файле моего класса есть только @interface, без @class. Но выбор символа после @interface, похоже, работает.
Эллиот
3
@class if для форвардных объявлений ... s
Джонатан Стерлинг
Меня это тоже давно беспокоит. Спасибо!
Джонатан Хедборг,
Даже это не позволяет провести рефакторинг в xcode 4. Я теряю надежду, почему Apple не улучшает свои вещи рефакторинга. Есть Eclipse, чтобы следовать, как это делать!
Карим
@karim - это никогда не работало в Xcode, см. мой ответ ниже для обходного пути, который работает каждый раз
Адам
26

Если вы используете Objective-C ++ (то есть смешиваете Objective-C с кодом C ++), то рефакторинг в xcode отключен, поскольку он не поддерживает рефакторинг кода C ++.

Волкер Вокинг
источник
Очень печально, прошло почти 2 года, а объект Objective-C по-прежнему не рефакторинг.
christophercotton
@christophercotton Попробуйте почти 8 лет спустя, и это все еще не реализовано.
Alex
7

Рефакторинг также может быть отключен, если затронутые файлы (скорее всего, файл с вашим классом в нем) не сохранены.

Klaaspieter
источник
1
Сохранение файла xib в Interface Builder снова включило рефакторинг для меня, когда даже перезапуск Xcode не помог, спасибо!
Винсент Гейбл
1
+1 за это. В некоторых углах XCode все еще есть шероховатости, и это одна из них. Иногда, если сохранение не позволяет выполнить рефакторинг, будет выполнено восстановление.
memmons
6

Я использую Xcode уже 5 лет, и рефакторинг никогда не работал должным образом (даже в xcode 4.6 есть серьезные ошибки, из-за которых он ВЕРНЕТ ваш исходный код!).

Обходной путь всегда был (все еще работает на 100%, даже в случаях, когда код Apple дает сбой)

  1. используйте shift-command-f, чтобы найти все варианты использования файла
  2. в настройках поиска выберите «заменить»
  3. "заменить все"
  4. сделайте следующее для файла .h и ПОВТОРИТЕ ЭТО ДЛЯ ФАЙЛА .m (если он у вас есть):
    1. щелкните правой кнопкой мыши исходный файл и выберите «показать в поисковике»
    2. удалить файл из xcode (при появлении запроса выберите «удалять только ссылки»)
  5. переименуйте .h (и .m, если он у вас есть) в Finder
  6. в Xcode выберите «Продукт -> (удерживая нажатой клавишу Alt) -> Очистить папку сборки»
  7. выйти из xcode (обычно можно обойтись без этого, но ПРИМЕЧАНИЕ: в Xcode есть и другие ОСНОВНЫЕ ошибки, из-за которых он вылетает, если вы этого не сделаете)
  8. повторно открыть xcode
  9. перетащите / отпустите .h и .m обратно в Xcode
  10. подождите несколько секунд (некоторые из основных методов Xcode асинхронны, что позволяет повредить ваш проект)
  11. наконец, когда кажется, что он ничего не делает (и ваш жесткий диск больше не шумит): cmd-b для повторной сборки

У меня 100% успех этого метода. Я просто попробовал провести рефакторинг с помощью Apple «Refactor -> Rename» в последней версии xcode, и это снова не удалось!

(на этот раз с неправильной ошибкой: «Невозможно определить язык», одно из тех сообщений об ошибках, в которых Apple вставила неправильный текст на место)

Адам
источник
Да, я пробовал это недавно (май 2014 г.), и официальная опция меню «рефакторинг» Xcode все еще не работает, она все еще портит ваш исходный код. Я удивлен, что сотрудников Apple это не беспокоит.
Adam
3

Я перехожу к своему проекту в Finder, затем меняю имя файла, получая информацию .

После этого в xcode -> Project Navigator я удаляю файлы.

В конце я щелкаю правой кнопкой мыши по классу, добавляю файлы в ... и снова добавляю эти файлы.

У меня это сработало.

смещение
источник
2

Для меня я понял, что рефакторинг был отключен, потому что проект Xcode, который я открыл, ссылался на отсутствующий базовый SDK. Измените настройки проекта и на вкладке «Сборка» установите для базового SDK тот, который у вас есть (например, для меня это была iOS 4.2). Это позволило мне выполнить рефакторинг.

пользователь591345
источник
1

Кроме того, может случиться так, что вы переименовали имя файла для класса либо вне xcode, либо щелкнув имя файла, удерживая Ctrl, а затем переименовав его. xcode отказывается от рефакторинга, если имя файла не совпадает с именем класса.

carlos_ms
источник
1

Перейдите в файл заголовка вашего класса и найдите строку, которая выглядит примерно так:

@interface YourClassName

Щелкните правой кнопкой мыши символ класса (например, YourClassName), и вы сможете выбрать Refactor -> Rename ...

Я просто попробовал это, и он работает в Xcode 5.

легкая цель
источник
0

Была и эта проблема. Я пытался найти недостающие SDK, сохранять файлы и искать код Objective-C ++, как упоминалось выше, и все, что потребовалось для исправления моей машины, это перезагрузка XCode.

По-прежнему кажется немного глючным.

Кстати, это было для XCode 4.0.1

gdavis
источник
-1

Рефакторинг работает Если вы сначала измените имя файла в навигаторе проекта.

Крис
источник