2011-01-08 20 views
6

Tôi muốn mở rộng hoặc thêm phương thức khác vào giao thức hiện có. Mặc dù giao thức đặc biệt là không quan trọng, đây là những gì tôi đang cố gắng làm.Cách thêm phương thức vào giao thức hiện có trong Cocoa?

@protocol NSMatrixDelegate 
- (void)myNewMethod:(id)sender; 
@end 

Trình biên dịch cảnh báo rằng tôi có bản khai trùng lặp của cùng một giao thức. Làm thế nào tôi sẽ làm điều này đúng cách?

Cảm ơn.

Trả lời

12

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]; 
} 
+0

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

+0

@David câu trả lời đã chỉnh sửa –

+0

Bạn thật tuyệt vời. Làm việc như một say mê. Cảm ơn bạn. – David

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