7

非常基本的东西,但我无法解决问题所在。在我的项目中,我有一个名为“TheFeedStore”的类,具有以下两种方法:

- (BOOL)hasItemBeenRead:(RSSItem *)item
{
   ............
}

- (void)markItemAsRead:(RSSItem *)item
{
  .........
}

我正在使用以下类方法,因此其他类可以使用它访问这些方法:

+ (TheFeedStore *) sharedStore
{
    static TheFeedStore *feedStore = nil;

    if (!feedStore) {
        feedStore = [[TheFeedStore alloc] init];
    }
    return feedStore;
}

在我的另一堂课中,我可以通过编写轻松访问上述方法

if ([[TheFeedStore sharedStore] hasItemBeenRead:item]) 

或者

[[TheFeedStore sharedStore] markItemAsRead:entry];

但是在另一个类中,如果我尝试以类似方式访问这些方法,我会收到错误消息“'TheFeedStore' 的无可见 @interface 声明选择器'hasItemBeenRead:”

1)我已经在类中导入了 TheFeedStore.h 文件,我正在访问 TheFeedStore 类的这些方法。

2)我检查了 10 次,没有错字。

3) 我正在访问的方法也在 TheFeedStore.h 的头文件中声明

更新:为了检查,我在 TheFeedStore.h 中声明了另一种测试方法,结果相同,一个类可以访问新创建的方法,而其余三个类不能。

更新:我尝试在 TheFeedStore.h 中创建更多方法来解决此问题。其他类也无法访问新方法。但是,如果这些新方法的返回类型是 (RSSChannel*),它是我项目中的另一个模型类,那么它们就可以访问了。如果它们的返回类型不是 (void) 和 (BOOL) 之类的类,则它们不可访问。这是我的 TheFeedStore.h https://gist.github.com/jessicamoore112/5558473

4

5 回答 5

7

您说过您在头文件中使用@class 而不是#import,您尝试访问的方法在头文件中声明,并且没有任何类型的拼写错误。

在这种情况下,通常没有人指出这个问题,但无论如何我都会这样做,因为我已经多次面临这样的问题。您可能已经创建了许多项目副本来处理每个功能并保留一个工作项目。

当你这样做时,有时 Xcode 仍在使用少数文件的旧副本。这意味着当您未声明您尝试访问的方法时,它仍在使用 TheFeedStore.h 的旧副本。

如何解决这个问题非常简单。转到您尝试从中访问方法的文件以及声明这些方法的文件。

在右侧的实用程序部分,检查“身份和类型”区域下的位置和完整路径。

首先检查项目的名称,如果它与您正在处理的项目名称不同,这意味着 Xcode 仍在从项目的先前版本中提取文件的旧副本。在我的例子中,请参阅项目名称为 13SampleMoreRequests 的蓝色箭头。

公用事业

如果此名称与您的项目名称相同,那么我的回答并不能解决您的问题。如果不同,您应该使用红色箭头所指的标志浏览新位置来使用文件的新副本。

浏览并使用新文件后,您的问题将得到解决,您将能够访问这些方法。如果仍然不能,请复制这些文件,从项目中删除,然后再次添加它们,您将不会遇到此问题。

希望这可以帮助!

于 2013-05-13T14:36:11.370 回答
2

周期性进口,例如A.h进口B.h同时B.h进口A.h是最常见的问题。

在 C 中,循环导入不起作用,其中一个导入将被默默忽略。确保您没有周期性导入。如果你这样做,解决它(例如使用前向声明)。

如果您生成预处理输出(您可以在 Xcode 菜单之一中找到它),也可以轻松检查导入问题。

于 2013-05-11T00:22:05.710 回答
1

就我而言,我有一些非常奇怪的路径条目

  • 框架搜索路径
  • 图书馆搜索路径

(目标 -> YOUR_APP_NAME ->“搜索路径”部分中的构建设置)

我删除了它们,错误消息消失了。

于 2014-11-30T04:30:40.020 回答
1

伙计们,我遇到了完全相同的问题。在 SO 和搜索引擎上进行了一些搜索后,我能够解决它。

就我而言,我有四个文件:

  • RadioStation.h
  • RadioStation.m
  • 视图控制器.h
  • 视图控制器.m

我的错误是将我所有的方法都放在 RadioStation.m 中,并且只将我的变量放在 radioStation.h 上所以当我在 ViewController.m 上导入 radioSation.h 并尝试定义按钮单击我的应用程序的方法时,这就是问题开始的地方. 每次构建或运行应用程序模拟器时,我都会收到错误/警告“ARC 语义问题:没有可见的 @interface for Class 声明选择器”。

我的解决方案是回到 RadioStation.h 文件并在那里声明我的所有方法。因为它们已经在 RadioStation.m 上定义了,所以我很高兴。

因此,请确保您已在将要在 viewControllers 上导入的文件上正确声明了您的方法。希望有帮助。

于 2013-07-18T04:55:15.650 回答
1

这可能听起来很傻,但我偶尔会遇到类似的情况,有时只是简单的退出和启动 xcode 会有所帮助,有时它往往会卡住。此外,有时清理项目会有所帮助。因为我和你的单例代码非常相似,而且效果很好。

于 2013-05-08T03:37:05.600 回答