2012-04-15 25 views
25

Mam dwa obiekty, z których oba są kontrolerami widoku. Pierwszy (Ill call it viewController1) deklaruje protokół. Drugi (który nieoczekiwanie nazwałbym viewController2) jest zgodny z tym protokołem.Nie można znaleźć deklaracji protokołu dla

XCode daje mi błąd kompilacji: „Nie można odnaleźć deklarację protokołu dla viewController1”

widziałem różne pytania na ten temat i jestem pewien, że ma do czynienia z błędem pętli, ale po prostu może „t go zobaczyć w moim przypadku ...

kod poniżej ..

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 

Początkowo miało linii importu w viewController1 powyżej tego zgłoszenia protokołu. To uniemożliwiło budowanie projektu. Po wyszukaniu na SO, zdałem sobie sprawę z problemu i zmieniłem obie linie. Otrzymuję teraz ostrzeżenie (w przeciwieństwie do błędu). Projekt dobrze się układa i działa idealnie. Ale nadal uważam, że musi być coś złego, aby otrzymać ostrzeżenie.

Teraz, o ile widzę, kiedy kompilator dostaje się do viewController1.h, pierwszą rzeczą, którą widzi jest deklaracja protokołu. Następnie importuje plik viewController.h i widzi, że implementuje ten protokół.

Gdyby kompilował je na odwrót, najpierw obejrzałby viewController2.h, a pierwszą rzeczą, jaką zrobiłby to import viewController1.h, którego pierwszą linią jest deklaracja protokołu.

Czy brakuje mi czegoś?

Odpowiedz

67

Usuń ten wiersz z viewController1.h:

#import "viewController2.h" 

Problem polega na tym, że interfejs viewController2 „s jest wstępnie przetworzone przed deklaracją protokołu.

Ogólna struktura pliku powinno być tak:

@protocol viewController1Delegate; 
@class viewController2; 

@interface viewController1 
@end 

@protocol viewController1Delegate <NSObject> 
@end 
+1

Nie mogę ... (Powinienem był powiedzieć) ... viewController1 musi być w stanie przedstawić viewController2. –

+2

Do tego jest dyrektywa '@class viewController2;'. Zaimportuj plik nagłówkowy w 'viewController1.m'. – Costique

+1

Zaktualizowałem odpowiedź, aby zilustrować ten punkt. – Costique

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

Czy możesz dodać komentarze lub szczegóły? Poprawiłoby to jakość Twojej odpowiedzi i lepiej edukowało wszystkich. – NonCreature0714

1

Dla tych, którzy mogą go potrzebować:

Możliwe jest również, aby rozwiązać ten problem poprzez przesuwanie importu ViewController1. h w pliku ViewController2 (.m) zamiast pliku nagłówkowego (.h).

tak:

ViewController1.h

#import ViewController2.h 

@interface ViewController1 : UIViewController <ViewController2Delegate> 
@end 

ViewController2.h

@protocol ViewController2Delegate; 

@interface ViewController2 
@end 

ViewController2.m

#import ViewController2.h 
#import ViewController1.h 

@implementation ViewController2 
@end 

To rozwiąże sprawę gdzie błąd się dzieje, ponieważ ViewController1.h jest importowany w ViewController2.h przed deklaracją protokołu.

Powiązane problemy