【问题标题】:unknown type name in objective c目标c中的未知类型名称
【发布时间】:2012-02-06 17:59:46
【问题描述】:

我对目标 c 很陌生,并且遇到了一些基本问题。

我使用导航器编写了一个简单的程序,一切正常。 然后我添加了几行代码(甚至不记得究竟是什么,而且似乎与问题无关)并且问题发生了。我试了ctrl+z,问题依旧:

我运行程序并得到这些错误:

1. unknown type name "mainController"
2. property with 'retain (or strong)' attribute must be of object type

而 mainController 是要加载的第一个屏幕。

这是 appDelegate.h 文件:

#import <UIKit/UIKit.h>
#import "mainController.h"
#import "WishesList.h"
#import "Wish.h"

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) IBOutlet UINavigationController *navController;
@property (strong, nonatomic) IBOutlet mainController *viewController; // this line creates the errors
@property (strong, nonatomic) WishesList *WishesArray;
@property (strong, nonatomic) NSIndexPath *temp;

@end

这是 appDelegate.m 文件的相关部分:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:    (NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]];
    WishesArray = [[WishesList alloc]init];
    temp = nil;
    [self setViewController:[[mainController alloc]init]];
    [self setNavController:[[UINavigationController alloc]initWithRootViewController:self.viewController]];
    [self.window setRootViewController:navController];
    [self.window makeKeyAndVisible];
    return YES;
}

这是 mainController.h:

#import <UIKit/UIKit.h>
#import "addWishController.h"
#import "displayWish.h"
#import "WishesList.h"
#import "Wish.h"

@interface mainController : UIViewController

@property (nonatomic, weak) WishesList *list;
@property (nonatomic, strong) IBOutlet UITableView *wishTable;

- (void)addWish;

@end

它已经起作用了...
你能弄清楚吗?

谢谢

【问题讨论】:

  • 请告诉我们mainController.h
  • 是否定义了一个名为mainController的类?
  • 我添加了 mainController.h,所以你也可以看到它

标签: objective-c types delegates navigator


【解决方案1】:

我发现,如果你有一个导入周期,也会出现同样的错误:

Class_A.h:#import "Class_B.h"

Class_B.h:#import "Class_A.h"

要修复:查找违规类的任何导入(错误选项卡是您的朋友,展开相关错误以获取导入列表)。相应地删除#import's

【讨论】:

    【解决方案2】:

    这个问题发生在我身上一次。

    我在我的 h 文件中导入“APPDelegate.h”,在我的 APPDelegate.h 中我也在导入该文件(这应该不是问题,但是......)

    我做了什么:我将 Import 从我自己的 .h 更改为 .m 并且它起作用了 :)

    【讨论】:

    • 除了这个答案。如果您需要在标题中包含该类型但又想避免导入周期,请使用前向声明。例如:@class mainController;
    【解决方案3】:

    正如其他人所提到的,这确实是由循环导入引起的。要解决此问题,请删除其中一个类中的导入。但有时这还不够。如果类相互依赖,只需在另一个类中前向声明一个类:

    A类:

    #import <UIKit/UIKit.h>
    @class B; //<- this is essential here
    
    @interface A: NSObject
    
    @property(nonatomic, strong) B *b;
    //...
    

    在 B 类中,我们有:

    #import "A.h"
    @interface B: NSObject
    
    @property(nonatomic, strong) A *a;
    

    【讨论】:

      【解决方案4】:

      @JustAStranger 和@NathanielSymer,都是正确的!

      无论如何,值得记住的是,下面的这个案例也有同样的问题:

      Class_A.h:#import "Class_B.h"

      Class_B.h:#import "Class_C.h"

      Class_C.h:#import "Class_A.h"

      这个问题向我们揭示了在我们的班级关系中照顾所有者的重要性。使用 ObjC 标头很容易产生循环问题。

      【讨论】:

        【解决方案5】:

        检查目标及其正在编译的文件。也许 mainController 已经从该目标中删除了一些方法。如果是这样,在构建时,您会收到找不到它的消息。

        【讨论】:

          【解决方案6】:

          这个问题看起来像是一个错字,因为类名通常以大写字符开头。因此,mainController 可以/应该是 MainController。检查类名,看看错误是否确实是拼写错误,因为编译器告诉你它找不到任何名为 mainController 的类。

          【讨论】:

            猜你喜欢
            • 2018-10-27
            • 1970-01-01
            • 1970-01-01
            • 2013-09-25
            • 1970-01-01
            • 1970-01-01
            • 2021-07-21
            • 2013-04-26
            相关资源
            最近更新 更多