Подтвердить что ты не робот

Objective-C функция вызова в другом классе?

Вот мои классы objective-c:

AppDelegate
SomeScript

Как я могу вызвать функцию loggedIn в классе SomeScript из приложения-делегата или любого другого класса?

Спасибо, Кристиан Стюарт

4b9b3361

Ответ 1

(Я предполагаю, что loggedIn - это метод экземпляра без параметров.) Во-первых, несколько терминологических проблем:

  • Это не функции, они методы (тем не менее, идея).
  • Вы не вызываете методы, вы отправляете сообщения (обычно та же идея).
  • Самое главное, мы обычно отправляем сообщения не классам, а экземплярам этих классов. (Если вы не можете визуализировать разницу, представьте, что вы размещаете письмо в идее почтовых ящиков или размещаете письмо в своем почтовом ящике. Только один имеет смысл!)

Итак, наш новый план состоит в том, чтобы сначала создать экземпляр SomeScript, а затем отправить сообщение экземпляру.

SomeScript* myScript = [[SomeScript alloc] init]; //First, we create an instance of SomeScript
[myScript loggedIn]; //Next, we send the loggedIn message to our new instance

Это хорошо. Однако! Бьюсь об заклад, вы хотите, чтобы ваш script придерживался для последующего использования. Таким образом, мы должны действительно сделать его переменной экземпляра вашего делегата приложения. Итак, вместо этого в AppDelegate.h добавьте это внутри фигурных скобок:

SomeScript* myScript;

Теперь наша переменная будет придерживаться, и наша первая строка из нее будет просто:

myScript = [[SomeScript alloc] init];

Последнее осложнение: мы не хотим создавать новый script каждый раз, когда вызываем loggedIn (предположим)! Итак, вы должны разместить экземпляр где-то, он будет запускаться только один раз (например, application:DidFinishLaunchingWithOptions:). Та-да!

Ответ 2

У вас должна быть инициализированная ссылка на объект SomeScript в вашем классе AppDelegate (если вы не нуждаетесь в том, чтобы SomeScript был Singleton класс, как ваш AppDelegate). Что-то вроде:

SomeScript * myScript;

как ivar в вашем интерфейсе AppDelegate, а в application:DidFinishLaunchingWithOptions:

вы его запустили (предположим, что со списком вызовов по умолчанию alloc/init):

myScript = [[SomeScript alloc] init]

Выполнено все это, когда вам нужно вызвать метод myScript, вы можете просто сделать:

[myScript myMethod:myParameter]

Здесь вы можете найти хороший путеводитель для новичков от Apple

Ответ 3

Если вы не хотите использовать экземпляры SomeScript... вы можете следовать другому подходу. Используйте NSNotificationCenter для отправки уведомления на ваш объект SomeScript и после этого запустите селектор.

В вашем - (void) awakeFromNib {} методе, из SomeScript поместите следующий код:

  [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(mySelector:)
                                                 name:@"aUniqueNameForTheNotification"
                                               object:nil];

Создайте метод "mySelector:" и поместите вызов на ваш метод loggedIn. (Или, если хотите, вы можете заменить "mySelector:" на loggedIn напрямую)

-(void) mySelector:(id)elem
{
    [self loggedIn];
}

Затем не забудьте удалить наблюдателя на dealloc, поэтому поместите следующий фрагмент кода в свой класс SomeScript:

- (void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

Затем вы можете отправить уведомление от любого другого, например:

 [[NSNotificationCenter defaultCenter] postNotificationName:@"aUniqueNameForTheNotification"  object:self];

Эта последняя часть кода отправляет уведомление SomeScript, и ваш селектор выполнен.

Надеюсь, это поможет вам, ребята!

Ответ 4

Мы можем назвать его как [self loggedIn]
Когда метод loggedIn находится в классе SomeScript, используя простые синтаксисы в последнем xcode.

[[SomeScript new] loggedIn];