iPhone SDK: доступ к методам в других классах - PullRequest
0 голосов
/ 24 октября 2009

В моем приложении для iPhone у меня есть несколько файлов классов, у меня есть файлы классов моего основного приложения, а затем у меня есть файлы классов UIView. У меня есть простой - (void) метод, объявленный в моих файлах классов UIView, как я могу получить к нему доступ из файлов моих основных приложений?

Немного подробнее: в моем приложении видео воспроизводится, когда воспроизведение видео заканчивается, отправляется уведомление и выполняются действия, которые я уже успешно настроил, однако, когда фильм заканчивается, я бы хотел, чтобы метод был объявлен другой файл класса, который будет предварительно сформирован. Если бы метод был объявлен в том же файле класса, я бы просто использовал этот код: [self mySimpleVoidMethod]; Но очевидно, что это не работает, если метод объявлен в другом файле класса. Я считаю, что можно получить доступ к методу, объявленному в другом файле класса, но я просто не знаю, как это сделать. Извините, если я использую совершенно неправильные термины, чтобы назвать вещи. Но я относительно новичок в программировании все вместе.

Ответы [ 3 ]

3 голосов
/ 24 октября 2009

У вас есть несколько вариантов, в зависимости от ваших настроек. Вот некоторые из них:

1) Добавьте ссылку на класс с помощью функции (вызываемого) в качестве свойства в классе вызывающего:

Caller.h

@interface Caller : SomeObject {
    Callee *myCallee;
    ...
}
@property(nonatomic, retain) Callee *myCallee;

Caller.m

@synthesize myCallee;
-(void)someAction {
    [myCallee doSomething];
}

То, что устанавливает Caller после инициализации обоих классов:

caller.myCallee = callee;

2) Используйте другое событие уведомления, как будто вы уже знаете, как это сделать.

3) Используйте протокол, если у вас есть куча разных классов, которые Caller может вызвать, которые все поддерживают один и тот же метод:

DoesSomething.h

@protocol DoesSomething
    -(void)doSomething;
@end

Callee.h

@interface Callee : NSObject<DoesSomething> {  // NSObject or whatever you're using...
    ...
}
-(void)doSomething;

Caller.h

@interface Caller : SomeObject {
    id<DoesSomething> *myCallee;
    ...
}
@property(nonatomic, retain) id<DoesSomething> *myCallee;

... Тогда по примеру 1.

4) Используйте executeSelector для отправки сообщения классу.

Caller.h

@interface Caller : NSObject {
    SEL action;
    id callee;
}
-(void)setupCallbackFor:(id)target action:(SEL)callback;

Caller.m

-(void)setupCallbackFor:(id)target action:(SEL)callback {
    callee = target;
    action = callback;
}

-(void)someAction {
    if([callee respondsToSelector:action]) {
        [callee performSelector:action];
}

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

1 голос
/ 24 октября 2009

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

Передача значений и сообщений между представлениями на iPhone

0 голосов
/ 24 октября 2009

Вам понадобится экземпляр другого класса, доступный из кода, который запускается по окончании фильма. Зачастую это достигается сохранением экземпляра другого класса как поля в классе, установленного либо через «установщик», либо во время конструирования. Вы также можете использовать наблюдение значения ключа , наблюдая за ключом, представляющим состояние воспроизведения фильма; экземпляр другого класса может зарегистрироваться, чтобы наблюдать за изменениями этого ключа.

Специально для шаблонов, использующих UIView, ваш UIViewController для представления будет иметь к нему доступ (через метод view). Если ваши «файлы классов основного приложения» имеют указатель на контроллер - что они, вероятно, установят через Interface Builder - тогда это простой способ получить доступ к экземпляру UIView.

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