2012-04-15 475 views
25

我有兩個對象,它們都是視圖控制器。第一個(我稱之爲viewController1)聲明一個協議。第二個(我不會驚訝地命名viewController2)符合這個協議。找不到協議聲明

Xcode是給我的生成錯誤:「無法找到viewController1協議聲明」

我已經看到了關於這個問題的各種問題,我敢肯定這是一個循環的錯誤的事,但我就是「T看到它在我的情況...以下

代碼..

viewController1.h

@protocol viewController1Delegate; 

#import "viewController2.h" 

@interface viewController1 { 

} 

@end 

@protocol viewController1Delegate <NSObject> 

// Some methods 

@end 

viewController2.h

#import "viewController1.h" 

@interface viewController2 <viewController1Delegate> { 

} 

@end 

最初,我有以上,該協議聲明在viewController1導入行。這阻止了該項目的建設。在搜索結果後,我意識到了這個問題,並轉換了兩條線。我現在得到一個警告(而不是一個錯誤)。該項目建立良好,實際運行完美。但我仍然覺得必須有什麼錯誤才能給予警告。

現在,據我所知,當編譯器訪問viewController1.h時,它看到的第一件事就是協議的聲明。然後它導入viewController.h文件並且看到它實現了這個協議。

如果以相反方式編譯它們,它首先會查看viewController2.h,它會做的第一件事是導入viewController1.h,其中第一行是協議聲明。

我錯過了什麼嗎?

回答

67

viewController1.h刪除此行:

#import "viewController2.h" 

的問題是,viewController2的接口協議聲明之前預處理。

文件的一般結構應該是這樣的:

@protocol viewController1Delegate; 
@class viewController2; 

@interface viewController1 
@end 

@protocol viewController1Delegate <NSObject> 
@end 
+1

我不能......(我應該說)... viewController1確實需要能夠呈現一個viewController2。 – 2012-04-15 09:39:16

+2

這裏有'@class viewController2;'指令。在'viewController1.m'中導入頭文件。 – Costique 2012-04-15 09:41:01

+1

我更新了答案來說明這一點。 – Costique 2012-04-15 09:44:23

1
A.h: 
    #import "B.h" // A 

    @class A; 

    @protocol Delegate_A 
     (method....) 
    @end 

    @interface ViewController : A 
    @property(nonatomic,strong)id<ViewControllerDelegate> preViewController_B;(protocol A) 
    @end 


    B.h: 
    #import "A.h" // A 

    @class B; 

    @protocol Delegate_B 
     (method....) 
    @end 

    @interface ViewController : B 
    @property(nonatomic,strong)id<ViewControllerDelegate> preViewController_A;(protocol B) 
    @end 

    A.m: 
    @interface A()<preViewController_B> 
    @end 

    @implementation A 
    (implement protocol....) 
    end 


    B.m: 
    @interface B()<preViewController_A> 
    @end 

    @implementation B 
    (implement protocol....) 
    @end 
+0

你可以添加一些評論或細節?它會提高你答案的質量,並更好地教育每個人。 – NonCreature0714 2016-07-15 03:50:41

1

對於那些誰可能需要它:

它也可以通過移動ViewController1的進口來解決這個問題。 h in ViewController2的實現文件(.m)而不是頭文件(.h)。

像這樣:

ViewController1.h

#import ViewController2.h 

@interface ViewController1 : UIViewController <ViewController2Delegate> 
@end 

ViewController2.h

@protocol ViewController2Delegate; 

@interface ViewController2 
@end 

ViewController2。米

#import ViewController2.h 
#import ViewController1.h 

@implementation ViewController2 
@end 

這將解決在誤差發生,因爲ViewController1.hViewController2.h導入的協議聲明之前的情況。

相關問題