2010-07-25 38 views
5

Tôi có một lớp điều khiển xem (MyViewController) mà đề với một lớp con UIView (MyView). Tôi không muốn để cho bất kỳ lớp nào ngoại trừ lớp điều khiển xem biết về lớp con UIView, vì vậy tôi không thể nhập MyView.h trong MyViewController.h.Giao thức "riêng tư" mục tiêu-C?

Vì vậy, trong MyViewController.m, tôi đặt

#import "MyViewController.h" 
#import "MyView.h" 

@interface MyViewController (PrivateObjects) 

MyView *myView; 

@end 

... 

Tuy nhiên, để nhận được phản hồi từ MyView, tôi sử dụng một đại biểu. Đại biểu đó phải triển khai giao thức MyViewDelegate.

Làm cách nào để triển khai giao thức MyViewDelegate bên trong MyViewController mà không cần phải #importMyView.h trong MyViewController.h?

Trả lời

14
@interface MyViewController (PrivateObjects) <MyViewDelegate> 
.... 

0

Tạo một giao thức (.h) bên ngoài MyView.h và sử dụng trong tờ khai ( .h) của MyViewController, ví dụ:

#import "MyViewDelegate.h" 
@interface MyViewController : UIViewController <MyViewDelegate> 

--Frank

+0

gì nếu các đại biểu chứa một phương thức '(BTW, bạn không thể khai báo một Ivar mới trong một danh mục.) - (void) MyView : (MyView *) myView textDidChange: (NSString *) text'? – ryyst

2

Bạn có thể sử dụng khai báo phần mềm giả mạo trong MyViewController.h

@class MyView; 

@interface MyViewController { 
    MyView *myView; 
} 

@end 
-4

Tại sao bạn thậm chí muốn sử dụng giao thức? Chỉ cần đặt các phương thức trong danh mục PrivateObjects của bạn.

Sửa: Apple đề cập đến kỹ thuật này là "informal protocol"

+0

Bởi vì "chỉ cần đặt các phương pháp có" là phong cách lập trình xấu, cộng với 'MyView' nên được tái sử dụng, do đó, một đại biểu chắc chắn là hữu ích ở đây. – ryyst

+0

Aha, có vẻ như tôi hiểu lầm "Tôi không muốn để bất kỳ lớp nào ngoại trừ lớp điều khiển xem biết về lớp con UIView" – user123444555621

1

Tôi biết nó my âm thanh lạ, nhưng theo kinh nghiệm tôi có thể nói bạn đừng bận tâm quá nhiều về phân cấp sự riêng tư trong Cocoa.

Vì vậy, trong ứng dụng hoặc trong khung nội bộ, chỉ cần ghi lại lớp học về cách sử dụng nó.

Đó là bởi vì bạn không thể có sự riêng tư thực sự khi các con trỏ C dài xung quanh để Objective-C được thiết kế không có cú pháp chỉ cho bạn một số ảo ảnh về nó. Ví dụ: các biến outlet IB của bộ điều khiển xem thường chỉ có thể truy cập được bởi chính bộ điều khiển, nhưng chúng luôn được công khai, vì chúng phải được truy cập từ các lớp không lưu trữ và khởi tạo các tệp nib và liên kết các cửa hàng với trường hợp tương ứng.

[bao gồm gợi ý từ bbum bên dưới]

+0

Nó không phải là ngôn ngữ là không đủ trong hỗ trợ của nó cho việc triển khai cá nhân, nó là rất nhiều ngôn ngữ được thiết kế để * không * cú pháp lãng phí khi tạo ảo ảnh về sự riêng tư, đó là tất cả những gì bạn muốn có trong ngôn ngữ C. – bbum

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