Xcode 4.4 не может переименовывать классы/переменные

Как в Xcode 4.4, так и в 4.4.1 у меня возникает одна и та же проблема: в конкретном проекте, над которым я работаю, я, похоже, не могу переименовать какие-либо классы или переменные из пункта меню Refactor.

Каждый раз, когда я пытаюсь выполнить переименование, я ввожу новое имя класса/переменной и нажимаю Preview, после чего в левом нижнем углу начинается счетчик с Finding files.... Однако затем я получаю сообщение о том, что:

Выбор не является типом, который можно переименовать.

Сделайте другой выбор и повторите попытку.

Я почти уверен, что это не проблема с моей конкретной установкой Xcode, потому что я могу хорошо рефакторить другие проекты, просто я не могу рефакторить этот конкретный проект.

У кого-нибудь есть идеи? У меня нет какой-то особенно экзотической конфигурации для этого проекта, это просто случайная беда. Я удалил все свои производные данные и переиндексировал, но это, похоже, не помогает.

Поскольку в других проектах он работает нормально, я думаю, что я мог бы попытаться повторно сгенерировать сам файл (файлы) проекта. Я не знаю, есть ли способ сделать это автоматически?


person Jonathan Ellis    schedule 10.08.2012    source источник
comment
Вариант рефакторинга Xcode - дерьмо, однако он должен работать прилично для Obj-C. Является ли ваш класс простым Obj-C (а не Obj-C++ или C++)?   -  person Olotiar    schedule 10.08.2012
comment
Кстати говоря, вы можете попробовать AppCode от JetBrains. Его поддержка рефакторинга намного превосходит поддержку Xcode.   -  person Cris    schedule 11.08.2012


Ответы (6)


Если они в дропбоксе, уберите их оттуда. Он коверкает файлы проекта. У меня это случалось много раз, и иногда рефакторинг > переименование не работал.

person smileBot    schedule 29.09.2013
comment
Является ли это ошибкой со стороны Apple или Dropbox? В любом случае, F предложение просто не использовать ни того, ни другого. - person ArtOfWarfare; 07.11.2013
comment
Все, что я знаю, это то, что Dropbox — плохое место для хранения файлов активных проектов. В конце концов они борются. Это был мой опыт, и другие также сообщают об этом. - person smileBot; 07.11.2013
comment
Это хороший ответ @philosopherdog. Помещение его в раскрывающийся список с Mac A и доступ к нему с Mac B действительно приведет к тому, что Mac B не сможет переименовать. Это связано с тем, что моментальный снимок не активируется Mac B. Вы можете решить эту проблему и продолжать использовать Dropbox, (1.) Просто перенеся проект в другую папку за пределами Dropbox. (2.) Откройте переданный проект с помощью Xcode. (3.) Выполните рефакторинг, чтобы активировать функцию моментального снимка. (4.) Закройте Xcode (5.) Перенесите скопированный проект обратно в Dropbox (6.) Наслаждайтесь рефакторингом на Mac A и Mac B, продолжая использовать Dropbox. - person Axel; 13.11.2013
comment
@Axel Я храню проекты в Dropbox, которые я НЕ АКТИВНО РАЗРАБАТЫВАЮ. Я обнаружил, что если вы АКТИВНО работаете над приложением и храните его в Dropbox, в конечном итоге возникают сбои. Многие люди сообщают об этом. Это имеет смысл. Dropbox — это хорошо, но есть слишком много причин, по которым что-то может пойти не так, если сохранять каждые несколько минут по сети. Я переместил все активные проекты в соответствующий репозиторий git, например BitBucket или Github. У меня была та самая проблема, опубликованная здесь OP, и она была вызвана тем, что мой проект находился в Dropbox. Выкинув его, проблема решена. - person smileBot; 13.11.2013
comment
Я переместил свой активный проект из Dropbox, и теперь рефакторинг снова работает. - person vomako; 24.02.2015
comment
Работал на меня. Я все еще хотел, чтобы мой проект был синхронизирован с Dropbox, поэтому я использовал символическую ссылку, указывающую из папки моего проекта за пределами Dropbox в мою папку Dropbox. Вот как: dropboxwiki.com/tips-and-tricks/sync-other -папки - person Tyler White; 31.08.2015
comment
@TygerWhite Я пробовал символические ссылки с помощью Dropbox, но у меня это не сработало. Ключ, я думаю, в том, что если у вас есть два устройства, получающие доступ к магазину одновременно, это то место, где вы столкнетесь с проблемами с Dropbox. Если вы действительно будете осторожны и убедитесь, что все синхронизировано перед доступом с другого устройства, вы можете избежать проблем. Лично я обнаружил, что лучше использовать Bitbucket. Это бесплатно для частных репозиториев и не испортит ваши файлы. - person smileBot; 31.08.2015

Мне удалось решить эту проблему, попробовав множество разных вещей (настройка параметров проекта, pch и т. д.), и оказалось, что существует очень простой (и совершенно нелогичный) метод решения этой проблемы.

Все, что я сделал, это: -

  1. Скопируйте всю папку моего проекта (от Project до Project Copy).
  2. Переместите Project (исходную папку) в корзину.
  3. Переименуйте Project Copy в Project.

Как ни странно, теперь все работает нормально.

Я действительно не могу понять, почему это работает. Как упоминалось ранее, я уже удалил все производные данные и т. д., поэтому я не знаю, почему это должно самопроизвольно работать, но это работает.

Был бы признателен любому, кто может пролить свет на это, поскольку он показывает, насколько неудобным может быть Xcode, и любое понимание того, что происходит под капотом, всегда полезно.

person Jonathan Ellis    schedule 20.08.2012
comment
Эта проблема исправлена ​​в последних версиях Xcode. - person Jonathan Ellis; 20.10.2012
comment
Какая версия? Я только что установил версию 4.5.1 (4G1004), и она все еще демонстрирует ту же проблему. - person adib; 21.10.2012
comment
Это абсурдно, но у меня это тоже сработало в Xcode 5.0.1 @philosopherdog ниже упомянул, что хранение проектов в Dropbox может вызвать проблемы - у меня, а у вас? - person Grezzo; 01.11.2013
comment
Не помогло, XC 6.2, ос 10.9 - person Richard Topchii; 12.05.2015

Звучит как сбитый индекс.

Обычно я использую опцию nuke from space, чтобы удалить все в каталоге производных данных.

Если вы не изменили его (я меняю свой на /tmp/bbum-derived), он будет находиться по адресу:

~/Library/Developer/Xcode/DerivedData

Таким образом, я выйду из Xcode и сделаю:

rm -rf ~/Library/Developer/Xcode/DerivedData

Да, это немного грубая сила, но она работает. Вероятно, вы можете заставить Xcode перестроить индекс из пользовательского интерфейса, но я никогда не беспокоюсь. Конечно, я также устанавливаю довольно много «странных» сборок того или иного в рамках своей повседневной работы…

(это rm -rf. На языке Unix это означает "уничтожить все и не спрашивать". Это опасно. Не допускайте ошибок при вводе этой команды.)

person bbum    schedule 10.08.2012
comment
Нет, это не исправило! (Я уже удалил DerivedData с помощью Finder.) Теперь я попытался rm -rf выполнить его в соответствии с вашими инструкциями, но после перестроения индекса я все еще получаю ту же проблему. - person Jonathan Ellis; 10.08.2012

Кажется, у вас есть активный выбор где-то в графическом интерфейсе, возможно, выбраны некоторые из ваших файлов или классов? Попробуйте отменить выбор в каждом подокне и повторите попытку рефакторинга.

person Jojje    schedule 10.08.2012
comment
Я проверил это, больше ничего не выбрано. Он также отлично работает в других проектах, насколько я вижу, с идентичной настройкой. - person Jonathan Ellis; 10.08.2012
comment
Ммм, тогда какой тип (интерфейс, класс...) цели для вашего рефакторинга? Правильно ли указано всплывающее имя рефакторинга? - person Jojje; 10.08.2012
comment
Неважно, что я пытаюсь переименовать, будь то интерфейс, реализация, локальная переменная, имя метода и т. д. Но да, имя правильно отображается во всплывающем окне рефакторинга. Только когда я иду к Preview, он терпит неудачу... - person Jonathan Ellis; 10.08.2012
comment
Мне несколько раз приходилось прибегать к опции «Заменить» в представлении навигатора поиска. Кажется, можно получить плохой проект, особенно если вы возитесь с типом файла и где-то используете Objective-C++. - person Jojje; 10.08.2012
comment
Я нигде не использую Objective-C++ или тип файла. Это довольно простой и понятный проект, поэтому я не могу понять, почему эта проблема затрагивает только этот конкретный проект. Мне интересно, есть ли способ очистить или восстановить метаданные проекта. (Очевидно, что пробовали производные данные). - person Jonathan Ellis; 10.08.2012
comment
Если можете, заархивируйте проект и отправьте сообщение об ошибке с прикрепленным проектом и пояснением. (Или пришлите мне -- bbum @ apple... и я зарегистрирую ошибку). Что-то не так; Подозреваю ПЧ. - person bbum; 11.08.2012

Я немного опоздал на эту ветку, но сегодня я столкнулся с той же проблемой, и мне удалось, наконец, правильно провести рефакторинг, думаю, я делюсь ею.

Так что в значительной степени я сделал то, что сказал bbum, я закрыл xCode, уничтожил производные данные для проекта, в котором находились файлы классов, и снова открыл проект. Делая именно это, это не сработало; Ключ, который я обнаружил (по крайней мере, для себя), заключается в том, что мне нужно было выполнить очистку (командный сдвиг k) после перезапуска xCode. После этого я смог снова переименовать файлы классов :)

Также в качестве примечания мой проект разделен на основной проект и статическую библиотеку. Когда мне пришлось переименовывать классы в статической библиотеке, мне пришлось выйти из основного проекта и сделать то, что я описал в самой статической библиотеке. Каким-то образом я получил ту же ошибку, описанную в вопросе, когда пытался выполнить рефакторинг/переименование из основного проекта.

Удачи!

person Khon Lieu    schedule 19.06.2013

Эта тема очень помогла мне в определении проблемы.

Оказалось, что мне пришлось восстановить диск с помощью Дисковой утилиты. Ранее я посещал сайт, который взломал Safari, и мне предлагали позвонить по номеру для срочного ремонта, что было очевидным мошенничеством.

Я следовал инструкциям Дисковой утилиты для восстановления диска (включая перезапуск с нажатой CMD-R). Еще одна подсказка заключалась в том, что я пытался закоммитить git, а Xcode сказал «нет», Хосе.

После этого я смог провести рефакторинг и зафиксировать изменения, как будто ничего и не было. Я надеюсь, что это поможет кому-то еще в качестве возможной причины для расследования.

person robMontesinos    schedule 23.08.2015