2012-04-15 42 views
25

Tôi có hai đối tượng, cả hai đều là bộ điều khiển chế độ xem. Việc đầu tiên (Ill gọi nó viewController1) tuyên bố một giao thức. Thứ hai (mà không ngạc nhiên là tôi sẽ đặt tên viewController2) phù hợp với giao thức này.Không thể tìm thấy khai báo giao thức cho

XCode là đem lại cho tôi một lỗi build của: 'Không thể tìm thấy lời tuyên bố giao thức cho viewController1' câu hỏi khác nhau

Tôi đã thấy về chủ đề này và tôi chắc chắn nó là để làm với một lỗi vòng lặp, nhưng tôi chỉ có thể 't nhìn thấy nó trong trường hợp của tôi ...

Mã dưới đây ..

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 

Ban đầu, tôi đã có dòng nhập khẩu viewController1 trên của tờ khai giao thức. Điều này đã ngăn cản dự án xây dựng ở tất cả. Sau khi tìm kiếm trên SO, tôi nhận ra vấn đề và chuyển đổi hai dòng xung quanh. Tôi hiện đang nhận được một cảnh báo (trái với một lỗi). Dự án xây dựng tốt và thực sự chạy hoàn hảo. Nhưng tôi vẫn cảm thấy có điều gì đó sai trái khi được cảnh báo.

Bây giờ, theo như tôi thấy, khi trình biên dịch nhận được viewController1.h, điều đầu tiên nó thấy là khai báo giao thức. Sau đó nó nhập khẩu tập tin viewController.h và thấy điều này thực hiện giao thức này.

Nếu nó biên dịch chúng theo cách khác, nó sẽ xem xét viewController2.h trước tiên, và điều đầu tiên nó sẽ làm là import viewController1.h dòng đầu tiên trong số đó là khai báo giao thức.

Tôi có thiếu gì đó không?

Trả lời

67

Hủy bỏ dòng này từ viewController1.h:

#import "viewController2.h" 

Vấn đề là giao diện viewController2 's được xử lý trước khi khai báo giao thức.

Cấu trúc chung của tập tin cần được như thế này:

@protocol viewController1Delegate; 
@class viewController2; 

@interface viewController1 
@end 

@protocol viewController1Delegate <NSObject> 
@end 
+1

Tôi không thể ... (Tôi nên nói) ... viewController1 không cần hiển thị viewController2. –

+2

Có '@class viewController2;' chỉ thị cho điều đó. Nhập tệp tiêu đề trong 'viewController1.m'. – Costique

+1

Tôi đã cập nhật câu trả lời để minh họa điểm. – 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

Bạn có thể thêm một số nhận xét hoặc chi tiết không? Nó sẽ cải thiện chất lượng câu trả lời của bạn và giáo dục tốt hơn mọi người. – NonCreature0714

1

Đối với những người có thể cần nó:

Nó cũng có thể khắc phục điều này bằng cách di chuyển nhập khẩu ViewController1. h trong ViewController2 tệp triển khai (.m) thay vì tệp tiêu đề (.h).

Giống như vậy:

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 

này sẽ sửa chữa các trường hợp lỗi xảy ra vì ViewController1.h được nhập khẩu trong ViewController2.h trước khi khai giao thức.

Các vấn đề liên quan