web-dev-qa-db-ja.com

Objectivecの不明なタイプ名

私はObjective 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

それはすでに機能しました...
わかりますか?

ありがとう

18
Amit Hagin

この問題は私に一度起こります。

「APPDelegate.h」をhファイルとAPPDelegate.hにインポートしていましたが、ファイルもインポートしていました(問題にはなりませんが...)

私がしたこと:インポートを自分の.hから.mに変更しましたが、機能しました:)

17
João Nunes

インポートサイクルがある場合にも同じエラーが表示されることがわかりました。

Class_A.h:#import "Class_B.h"

Class_B.h:#import "Class_A.h"

修正するには:問題のあるクラスのインポートを探します(エラータブは友だちです。インポートのリストについては、関連するエラーを展開してください)。削除する #importそれに応じて

35
JustAStranger

他の人が述べたように、これは確かに循環輸入によって引き起こされます。これを修正するには、クラスの1つでインポートを削除します。しかし、これで十分でない場合もあります。クラスが相互に依存している場合は、一方のクラスをもう一方のクラスで前方宣言するだけです。

クラス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;
3
Tash Pemhiwa

@JustAStrangerと@NathanielSymer、どちらも正しいです!

とにかく、以下のこのケースにも同じ問題があることを覚えておく価値があります。

Class_A.h:#import "Class_B.h"

Class_B.h:#import "Class_C.h"

Class_C.h:#import "Class_A.h"

この問題は、クラスの関係で所有者に注意することがいかに重要であるかを示しています。非常に簡単で、ObjCヘッダーを使用してサイクルの問題を引き起こします。

1
seufagner

ターゲットとそれがコンパイルしているファイルを確認してください。おそらく、mainControllerはそのターゲットから何らかの方法で削除されています。もしそうなら、構築するときに、それが見つからないというメッセージが表示されます。

0
drekka