Вызов метода на «владение» классом? - PullRequest
1 голос
/ 15 января 2011

Есть ли способ вызвать метод "владеющего" класса? (класс, который создал объект).

Вот ситуация: мое приложение использует UIScrollView. Мне нужно обрабатывать сенсорные события, поэтому вместо непосредственного использования UIScrollView я создаю его подкласс и использую MyScrollView (чтобы я мог реализовать метод touchesEnded:). Экземпляр MyScrollView создается в моем классе View Controller. Вот где возникает мой вопрос: в методе touchesEnded: (в MyScrollView.m) я хочу вызвать метод из класса View Controller. Есть ли прямой способ сделать это? Что-то вроде:

[owner myMethod];

Теперь я включаю MyViewController.h в MyScrollView.m и создаю его экземпляр:

MyViewController *controller;
[controller myMethod];

Не кажется правильным. Любое понимание?

Ответы [ 2 ]

3 голосов
/ 15 января 2011

После нескольких исследований я понял, что в UIScrollView встроен протокол делегирования. Это означает, что вам вообще не нужно создавать подклассы.

В вашем заголовочном файле контроллера вида найдите эту строку:

@interface MyViewController : UIViewController {

И измените его на:

@interface MyViewController : UIViewController <UIScrollViewDelegate> {

Предполагая, что вы используете Interface Builder, откройте его и найдите объект просмотра с прокруткой. Выберите его, откройте инспектор соединений и подключите розетку «делегат» к вашему контроллеру представления. Вернитесь в Xcode и откройте файл реализации вашего контроллера представления. Добавьте метод:

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
      NSLog(@"Here is where you do whatever it is that you're trying to do!");
}

Так и должно быть. Дайте мне знать, если вам нужно больше разъяснений.

Предыдущая версия моего ответа:

Лучший способ сделать это через система делегатов. Ваш скроллвью будет есть свойство как:

@property(nonatomic,assign) id<MyScrollViewDelegate> delegate;

Тогда вы можете определить протокол для Вашему делегату нравится так:

@protocol MyScrollViewDelegate <NSObject>
- (void)methodName;
@end

Примечание: вам нужно будет поставить прямая ссылка на делегата перед строкой свойств, затем определите методы потом. Вперед ссылка на это будет просто @protocol MyScrollViewDelegate;.

В заголовочном файле контроллера вашего представления, убедитесь, что импортировали заголовок прокрутите представление, а затем измените родительский класс объекта из UIViewController до UIViewController <MyScrollViewDelegate>.

Затем, когда вы создаете вид прокрутки на ваш взгляд контроллер, установите его делегировать свойство self (вы можете сделать это в Интерфейсном Разработчике, если это это то, как вы делаете свой интерфейс. В этом не забудьте добавить IBOutlet Ключевое слово перед id введите в вашем @property.)

Наконец, чтобы позвонить с вашего прокрутить вид до контроллера вида, вы бы запустили следующий код:

[self.delegate methodName];

И это все!

1 голос
/ 15 января 2011

Во-первых, ваш 0% -й коэффициент принятия даже для вопросов месяцев назад слишком плохо , и вы должны исправить это как можно скорее, чтобы люди с большей вероятностью отвечали на ваши будущие вопросы.

Даже если вы не упомянули, какой язык программирования вы используете, в парадигме ОО нет способа обратиться к создателю объекта, если вы ничего не сделаете с ним.

Раствор 1

Если вы можете, сделайте так, чтобы ваш конструктор принял параметр creator или parent , который передается как this объектом, который создает новый экземпляр вашего учебный класс. Вы должны иметь полный контроль над создателем и созданным.

Решение 2

Возможно, не подходит для вашего случая на 100%, но это шаблон factory . В общем случае фабрика - это одноэлементный класс, поэтому все объекты, созданные фабрикой, должны иметь средства доступа к экземпляру фабрики. Вы можете смешать его с раствором 1.

Раствор 3

Отражение. В зависимости от вашего языка программирования, когда вызывается ваш конструктор, вы можете попытаться проанализировать трассировку стека и попытаться получить ссылку на объект, вызвавший ваш метод.

Раствор 4

Принять шаблон Контейнер . Если вы можете отказаться от концепции создатель , вы можете, по крайней мере, как это делают WinForms и WebForms, рассматривать элемент управления как контейнер других элементов управления. Таким образом, у вас есть двойная ссылка из объекта-контейнера на все содержащиеся в нем объекты и обратная ссылка (устанавливается после конструктора с определенным методом установки / * property *). Таким образом, вы получите не ссылку на объект, который создал ваш, но ссылку на объект, который содержит ваш. Опять же, вы должны иметь полный контроль над кодом.

Я бы пошел на решение 1 или 4, если бы я был тобой

[Редактировать]: когда я впервые написал ответ, я не мог прочитать, что вы используете Objective-C. Я не эксперт в этом, я не знаю, есть ли лучшее решение, но мое (возможно, кроме 3) возможно

...