Objective-C "частные" протоколы? - PullRequest
5 голосов
/ 25 июля 2010

Я получил класс контроллера представления (MyViewController), который имеет дело с подклассом UIView (MyView).Я не хочу, чтобы какой-либо класс, кроме класса контроллера представления, знал о подклассе UIView, поэтому я не могу импортировать MyView.h в MyViewController.h.

Итак, в MyViewController.m я помещаю

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

@interface MyViewController (PrivateObjects)

MyView *myView;

@end

...

Однако, чтобы получить отзыв от MyView, я использую делегата.Этот делегат должен реализовать протокол MyViewDelegate.

Как я могу реализовать протокол MyViewDelegate внутри MyViewController без необходимости #import MyView.h в MyViewController.h?

Ответы [ 5 ]

14 голосов
/ 25 июля 2010
@interface MyViewController (PrivateObjects) <MyViewDelegate>
....

(Кстати, вы не можете объявить новый ivar в категории.)

2 голосов
/ 25 июля 2010

Вы можете использовать декларацию forware в MyViewController.h

@class MyView;

@interface MyViewController {
    MyView *myView;
}

@end
1 голос
/ 25 июля 2010

Я знаю, это звучит странно, но по своему опыту я могу сказать вам, чтобы вы не слишком беспокоились об иерархиях конфиденциальности в Какао.

Таким образом, в приложении или во внутренних каркасах просто документируйте класс с указанием того, как его следует использовать.

Это потому, что вы не можете иметь настоящую конфиденциальность, так как длинные указатели C находятся вокруг, поэтому Objective-C был разработан без синтаксиса, который мог бы только дать вам некоторую иллюзию этого.контроллеров представления обычно должны быть доступны только самому контроллеру, но они всегда общедоступны, потому что они должны быть доступны из классов, которые разархивируют и создают экземпляры файлов nib и связывают выходы с соответствующими экземплярами.включая предложения от Bumum ниже]

0 голосов
/ 25 июля 2010

Почему вы даже хотите использовать протокол? Просто поместите методы в вашу категорию PrivateObjects.

Редактировать : Apple называет эту технику " неофициальный протокол "

0 голосов
/ 25 июля 2010

Создайте протокол ( .h) вне MyView.h и используйте его в объявлении ( .h) MyViewController, например:

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

- Frank

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...