Bạn không thể xác định danh mục cho giao thức. Có 2 cách xung quanh này:
- sử dụng một giao thức chính thức mới
- sử dụng một giao thức không chính thức và thời gian chạy kiểm tra
Nghị định thư chính thức
Xác định một giao thức chính thức mới sẽ trông như thế này:
@protocol MyCustomMatrixDelegate <NSMatrixDelegate>
- (void) myNewMethod:(id)sender;
@end
Sau đó, bạn sẽ làm cho lớp tùy chỉnh của mình tuân thủ o <MyCustomMatrixDelegate>
thay vì <NSMatrixDelegate>
. Nếu bạn sử dụng phương pháp này, có điều cần lưu ý: [self delegate]
có thể sẽ được khai báo là id<NSMatrixDelegate>
. Điều này có nghĩa là bạn không thể làm [[self delegate] myNewMethod:obj]
, bởi vì <NSMatrixDelegate>
không khai báo phương thức myNewMethod:
.
Cách xung quanh việc này là nhập lại đối tượng delegate
thông qua truyền. Có lẽ cái gì đó như:
- (id<MyCustomMatrixDelegate>) customDelegate {
return (id<MyCustomMatrixDelegate>)[self delegate];
}
(Tuy nhiên, bạn có thể muốn làm một số loại kiểm tra đầu tiên, như:
if ([[self delegate] conformsToProtocol:@protocol(MyCustomMatrixDelegate)]) {
return (id<MyCustomMatrixDelegate>)[self delegate];
}
return nil;
)
Và sau đó bạn muốn làm:
[[self customDelegate] myNewMethod:obj];
Giao thức không chính thức
Đây thực sự là một cái tên ưa thích cho một loại trên NSObject
:
Sau đó, bạn không thực hiện phương pháp. Trong lớp học của bạn sẽ gửi phương thức, bạn sẽ làm:
if ([[self delegate] respondsToSelector:@selector(myNewMethod:)]) {
[[self delegate] myNewMethod:someSenderValue];
}
Nguồn
2011-01-08 20:12:17
Tôi đã thử phương thức Giao thức chính thức. Nó hoạt động, tuy nhiên trình biên dịch cảnh báo rằng không thể tìm thấy phương thức tùy chỉnh trong giao thức. Tôi đã thêm giao thức chính thức vào giao diện của đại biểu và bao gồm tiêu đề của đại biểu trong tệp triển khai của trình gỡ rối mà tôi đang gửi thư ủy quyền đến. Bạn có bất kỳ ý tưởng tại sao nó vẫn còn phàn nàn? Cảm ơn – David
@David câu trả lời đã chỉnh sửa –
Bạn thật tuyệt vời. Làm việc như một say mê. Cảm ơn bạn. – David