2012-03-06 25 views
32

Tôi đã triển khai giao thức với phương thức tùy chọn và trong phương thức gọi mà tôi muốn gửi respondsToSelector: tới self.delegate trước khi tôi gửi thư nhưng không biên dịch. Thông báo lỗi là:self.delegate respondsToSelector: ... không biên dịch

Không có phương pháp thể hiện đã biết nào cho bộ chọn 'respondsToSelector'.

Là một công việc xung quanh, tôi "vệ sinh" các đại biểu như hình dưới đây, trong đó biên dịch ...

//MyClass.h: 

@class MyClass; 

@Protocol MyClassDelegate 
- (void)myClass:(MyClass *)sender willDoSomething:(BOOL)animated; 
@end 

@interface MyClass : UIViewController 

@property (nonatomic, weak) id<MyClassDelegate> delegate; 

@end 

//MyClass.m: 

... 
@synthesize delegate = _delegate; 
... 

id sanitizedDelegate = self.delegate; //Hmmmm... why does this work? 

if ([sanitizedDelegate respondsToSelector:@selector(myClass:willDoSomething:)]) { 
    [self.delegate myClass:self willDoSomething:animated]; 
} 

.

Tôi đã kiểm tra một số bài đăng bao gồm this one nhưng nó không trả lời sự cố biên dịch thất bại.

Ngoài ra, bộ truy xuất thay thế không làm việc ...

[self delegate] 
//or 
_delegate 

Có ai thấy điều này hoặc có thể tư vấn một cách tốt hơn xử lý?

IOS 5.0: (9A334), Xcode 4.2.1 (4D502)

Trả lời

95

-respondsToSelector: là một phương pháp trên NSObject. Hoặc giả sử rằng id đại biểu của mình thực chất là một NSObject, và quăng:

[(NSObject*)self.delegate respondsToSelector:@selector(myClass:willDoSomething:)]

Hoặc, tốt hơn, làm cho đại biểu của mình một cách rõ ràng một NSObject:

@property (nonatomic, weak) NSObject<MyClassDelegate>* delegate;

Hoặc làm cho các giao thức được giao thức con của NSObject:

@protocol MyClassDelegate <NSObject>

+10

Ka-ching ... Tôi sẽ mở cửa số 3. – vmanjz

+0

Khai báo đại biểu là NSObject đã làm việc, cảm ơn bạn! – c0d3Junk13

14

Về cơ bản bạn đang nói rằng đại biểu của bạn bị hạn chế chỉ bởi giao thức <MyClassDelegate> của bạn để trình biên dịch giả định rằng đó là những phương pháp chỉ có sẵn. Những gì bạn cần làm là có giao thức mở rộng <NSObject> như vậy:

@Protocol MyClassDelegate <NSObject> 
- (void)myClass:(MyClass *)sender willDoSomething:(BOOL)animated; 
@end 

Bằng cách đó trình biên dịch biết rằng bất kỳ đối tượng nào phù hợp với giao thức của bạn cũng phù hợp với các giao thức <NSObject> trong đó xác định respondsToSelector:.

+1

Yep, hoàn thành mã khuyến khích thực hiện cùng một tiêu chuẩn ... từ giờ trở đi. – vmanjz

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