Funzione di chiamata Objective-C su un’altra class?

Ecco le mie classi di obiettivi-c:

AppDelegate SomeScript 

Come posso chiamare la funzione loggedIn nella class SomeScript dal delegato dell’app o da qualsiasi altra class?

Grazie, Christian Stewart

(Suppongo che loggedIn sia un metodo di istanza che non loggedIn parametri.) In primo luogo, diversi problemi terminologici:

  1. Non sono funzioni, sono metodi (stessa idea, però).
  2. Non si chiamano metodi, si inviano messaggi (di solito la stessa idea, però).
  3. Ancora più importante, di solito inviamo messaggi non alle classi, ma alle istanze di quelle classi. (Se non riesci a visualizzare la differenza, immagina di mettere una lettera nell’idea di caselle di posta o di mettere una lettera nella tua casella di posta .

Quindi, il nostro nuovo piano è prima istanziare SomeScript, quindi inviare un messaggio all’istanza.

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

Questo è buono. Però! Scommetto che vorresti che la tua sceneggiatura rimanesse per un uso futuro. Pertanto, dovremmo davvero renderlo una variabile di istanza del tuo delegato dell’app. Quindi, in AppDelegate.h, aggiungi questo all’interno delle parentesi:

 SomeScript* myScript; 

Ora la nostra variabile rimarrà triggers e la nostra prima linea da prima diventerà semplicemente:

 myScript = [[SomeScript alloc] init]; 

Ultima complicazione: non vogliamo creare un nuovo script ogni volta che chiamiamo loggedIn (presumo)! Pertanto, dovresti posizionare l’istanziazione da qualche parte in modo che venga eseguita una sola volta (ad esempio, application:DidFinishLaunchingWithOptions: . Ta-da!

Dovrai avere un riferimento inizializzato di un object SomeScript nella tua class AppDelegate (supponendo che non sia necessario che SomeScript sia una class Singleton come AppDelegate). Qualcosa di simile a:

SomeScript * myScript;

come un ivar nell’interfaccia di AppDelegate, mentre nella sua application:DidFinishLaunchingWithOptions:

lo hai inserito (supponiamo con la chiamata combo alloc / init predefinita):

myScript = [[SomeScript alloc] init]

Fatto tutto questo, quando hai bisogno di chiamare un metodo di myScript puoi semplicemente fare:

[myScript myMethod:myParameter]

Qui puoi trovare una buona guida per i principianti di Apple

Se non vuoi usare istanze di SomeScript … puoi seguire un approccio diverso. Utilizzare NSNotificationCenter per inviare una notifica al proprio object SomeScript e farlo eseguire successivamente un selettore.

Nel tuo metodo – (void) awakeFromNib {}, da SomeScript inserisci il seguente codice:

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

Creare il metodo “mySelector:” e posizionare la chiamata sul metodo di accesso. (O se preferisci, puoi sostituire “mySelector:” con login direttamente)

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

Quindi non dimenticare di rimuovere l’osservatore su dealloc, quindi inserisci anche la seguente parte di codice nella class SomeScript:

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

Quindi puoi inviare una notifica da qualsiasi altro in questo modo:

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

L’ultima parte di codice invia una notifica a SomeScript e il tuo selettore viene eseguito.

Spero che ti aiuti ragazzi!

Possiamo chiamarlo come [self loggedIn]
Quando il metodo loggedIn è in class SomeScript , si utilizzano syntax semplici nell’ultimo xcode.

 [[SomeScript new] loggedIn];