选择不是可以重命名为Xcode 7的类型

Stu*_*ner 25 objective-c ios xcode7

尝试通过选择类名(ViewController)后重命名一个类@interface:

@interface ViewController : UIViewController
Run Code Online (Sandbox Code Playgroud)

右键单击,在以下错误警告窗口中选择Refactor - > Rename results:

在此输入图像描述

这在Xcode 6中运行得很好,这是某种回归吗?我试过Xcode 4的这个解决方案无济于事.有人知道任何工作吗?

And*_*tis 27

是的,重构在Xcode 7中严重破坏.

尝试重命名属性,方法和类时,我发现了类似的问题.昨天我下载了7.1.1,希望到目前为止可能会有一些改进.

我在Xcode 7.1.1上的Objective-C中的示例单视图项目中做了一些测试,发现了以下内容:

  1. 如果您尝试重命名具有IBOutlet关键字的属性,它将失败;
  2. 如果你试图重命名另一个不是IBOutlet的属性,但是在它的声明之上,你有任何属性是IBOutlet,重命名将失败;
  3. 如果您尝试重命名在IBOutlet属性下面声明的方法并右键单击.h文件中的方法,则重命名将失败;
  4. 如果您尝试重命名一个类#imports一个在头文件中有一些IBOutlet声明的类,则重命名将失败(突出显示,因为这是原始问题所在的情况).

幸运的是,我也找到了一些解决方法:

  1. 如果您将属性声明移到IBOutlet声明之上,则重命名将成功;
  2. 如果您需要重命名IBOutlet - 您可以将其移动到所有其他IBOutlet之上,并在重命名之前删除它的IBOutlet关键字.重命名将成功(并且还将在Storyboard中重命名),然后您可以添加IBOutlet关键字;
  3. 如果您将方法的声明移到任何IBOutlet属性之上,则重命名将从.h文件成功,但是如果您在.m文件中选择时尝试重命名它也似乎有效(后一种情况即使在方法声明的情况下也适用) .h文件在IBoutlet属性下面);
  4. 重命名使用IBOutlets导入另一个类的类时,可以执行以下操作 - 将另一个类的IBOutlet从.h文件移动到.m文件.然后重命名工作.或者 - 在重命名之前删除所有IBOutlet关键字,然后在它之后添加它们.

注意:当我说重命名成功时,我的意思是 - 它不会显示"选择不是可以重命名的类型".但是大部分时间它仍然不能顺利运行:

  1. 它没有显示文件中的更改,就像以前一样;
  2. 当Xcode有未保存的更改时,它可能会抱怨文件已被其他应用程序修改过.正如我所发现的,通常你需要选择"保持Xcode版本";
  3. 它可能无法在已使用的所有文件中重命名该属性.这是最重要的,在某些情况下使所有的变通方法都无用.具体来说,我在使用上面描述的方法重命名IBOutlet属性时已经看到了它.

希望能帮助到你 :)


MSi*_*mic 5

解决此问题的一种方法是在Xcode中更正之前向头文件添加前向声明(在@interface行上方的单独行中).像这样:

@class ClassName
Run Code Online (Sandbox Code Playgroud)

添加后,在此处重命名,而不是在@interface线上.您可以在重命名后删除前向声明