目标C语言 未知类型名称在Xcode(即使有@class声明)



我在一个简单的应用程序设置数据控制器时遇到了麻烦。我在BirdsListViewController.h的@property (strong, nonatomic) BirdsListDataController *dataController;上得到一个错误。我已经尽我所能使用BirdsListDataController的@class声明,以及试图从。h文件中删除任何#import语句,并试图删除一个循环#import,你可以在BirdsListViewController.h的顶部找到注释。我猜是很简单的。

BirdsListViewController.h

#import <UIKit/UIKit.h>
@class BirdsListDataController;
@interface BirdsListViewController : UITableViewController <UITextFieldDelegate>
{
// NSMutableArray *listOfBirds;
IBOutlet UITextField *addNewBirdTextField;
}
//@property (nonatomic, retain) NSIndexPath *checkedIndexPath;
@property (nonatomic, retain) NSString *textLabelContents;
@property (nonatomic, retain) NSMutableArray *workingArray;
@property (strong, nonatomic) BirdsListDataController *dataController;
@property (strong, nonatomic) IBOutlet UITableView *birdListTableView;
@end

BirdsListViewController.m

#import "BirdsListViewController.h"
#import "BirdsListDataController.h"
@interface BirdsListViewController ()
@end
@implementation BirdsListViewController
- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
...

BirdsListDataController.h

#import <Foundation/Foundation.h>     
@class BirdName;
@interface BirdsListDataController : NSObject
@property (nonatomic, copy) NSMutableArray *listOfBirds;
-(NSUInteger)countOfList;
-(BirdName *)objectInListAtIndex:(NSUInteger)theIndex;
-(void)addBirdNameWithName:(BirdName *)bName;
@end

BirdsListDataController.m

#import "BirdsListDataController.h"
//#import "BirdsListViewController.h"
#import "Bird.h"
@implementation BirdsListDataController
-(id)init
{...

我对iOS和Objective C还是个新手,所以希望我的代码不会太糟糕以至于无法排除故障。谢谢你的帮助。

对于寻找比注释/取消注释代码更好的答案的人来说,一个更好的解决方案是清理您的项目并删除派生数据。一旦你固定了你的循环引用,击键Command+Shift+K将清理你的项目,或者你可以去选择Product->Clean

要删除派生数据,请打开"管理器",单击"项目"选项卡,在侧边栏中导航到您的项目。您应该在项目名称标题下看到"派生数据"。右边应该有一个按钮,上面写着删除。如果启用,删除派生数据还可以删除挂起错误。

作为一种解释,有时Xcode似乎与项目不同步,坚持不再存在的错误。这在最近的版本中更好,但仍然偶尔发生。

我不确定是什么导致了你的问题,但有几件事:

  • 在你所呈现的代码中,没有理由不在BirdListViewController.h中导入birdlistdataconcontroller .h,因为在birdlistdataconcontroller .h中没有对BirdListViewControllers的引用。因此,请尝试用#import语句替换@class声明。

  • 在BirdListDataController.h中你声明@class BirdName,但是在BirdListDataController中。如果你导入Bird.h而不是BirdName.h。似乎有什么地方出了问题,尽管我必须看到BirdName.h和Bird.h的代码才能确定。

在我的例子中,我在不同的文件夹结构中有重复的类名,一旦我删除了新类并以不同的方式命名它,一切就又正常了。

因此,为了将其转化为实际的解决方案,如"shA。t"的评论:

如果你注释/取消注释你的代码,或者像上面那样清理项目建议的答案,但仍然没有解决它:

  1. 采取步骤回顾最近的类更改并仔细检查所有的类名都是唯一的,即使在不同的目录中检查

  2. 如果发现重复的类名:做一个备份代码,删除该类(不仅是引用,而且也是垃圾)
  3. 创建一个具有唯一名称的新类并合并备份的类代码

对于这个特殊的重复类名的场景,这将为您省去导入和注释#import "class.h"

的麻烦。

最新更新