2013-04-11 1 views
7

Ho bisogno di inviare la notifica @"willAnimateRotationToInterfaceOrientation" con i parametri toInterfaceOrientation e duration (domanda # 1) a tutti i UIViewController sull'applicazione (domanda # 2). Come scrivere il codice per questo?Come inviare una notifica con parametri su Objective-C?

[[NSNotificationCenter defaultCenter] 
    addObserver:self 
    selector:@selector(willAnimateRotationToInterfaceOrientation:toInterfaceOrientation:duration) 
     name:@"willAnimateRotationToInterfaceOrientation" 
     object:nil]; 

[[NSNotificationCenter defaultCenter] 
    postNotificationName:@"willAnimateRotationToInterfaceOrientation" 
       object:self]; 
+0

Domanda correlata: http://stackoverflow.com/questions/15957077/event-willanimaterotationtointerfaceorientation-isnt-calling – Dmitry

risposta

19

Usa postNotificationName:object:userInfo: e bundle qualsiasi parametro che si desidera passare all'interno del dizionario userInfo.

Esempio:

È possibile inviare una notifica come questo

NSDictionary * userInfo = @{ @"toOrientation" : @(toOrientation) }; 
[[NSNotificationCenter defaultCenter] postNotificationName:@"willAnimateRotationToInterfaceOrientation" object:nil userInfo:userInfo]; 

e quindi recuperare le informazioni che hai passato, facendo:

- (void)willAnimateRotationToInterfaceOrientation:(NSNotification *)n { 
    UIInterfaceOrientation toOrientation = (UIInterfaceOrientation)[n.userInfo[@"toOrientation"] intValue]; 
    //.. 
} 

Riassumendo quanto visto sopra, il selettore utilizzato per gestire una notifica accetta un parametro opzionale di tipo NSNotification ed è possibile memorizzare tutte le informazioni che si desidera trasferire all'interno dello userInfo dizionario.

+0

Grazie, Gabriele per la risposta! Hai un codice di esempio? – Dmitry

+1

Sì, solo un secondo :) –

+0

Il codice ha i seguenti errori: 1. Inaspettato '@' nel programma. 2. L'elemento Collection di tipo "UIInterfaceOrientation" (noto anche come "enum UIInterfaceOrientation") non è un oggetto Objective-C. – Dmitry

0

È possibile semplificare il metodo di chiamata, che richiede meno argomenti e richiama il complesso.

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

- (void)doStuff { 
    [self willAnimateRotationToInterfaceOrientation:someOrientation 
            toOrientation:someOtherOrientation 
             duration:1]; 
} 

Non si dovrebbe essere chiamata willAnimateRotationToInterfaceOrientation: da soli però. Invece, fai un metodo chiamato form quel metodo che contiene il codice che vuoi attivare a rotazione e anche altre volte.

+0

Ma come passare i parametri usando 'userInfo'? – Dmitry

1

Questo non funziona come credi. Una chiamata messaggio di notifica ha un parametro opzionale, che è un oggetto NSNotification:

-(void)myNotificationSelector:(NSNotification*)note; 
-(void)myNotificationSelector; 

L'oggetto di notifica ha una proprietà, userInfo, che è un dizionario che può essere utilizzato per passare informazioni rilevanti. Ma non è possibile registrare selettori arbitrari da chiamare dal centro notifiche. Si passa quel dizionario con la notifica utilizzando -postNotificationName:object:userInfo: anziché -postNotificationName:object:; il parametro userInfo è solo uno NSDictionary creato.

+0

Grazie, ma è possibile inviare una notifica a tutti (o tutti visibili) 'UIViewController's dell'applicazione? – Dmitry

+0

Solo se sono tutti registrati per tale notifica. Nota che esiste una notifica esistente, 'UIDeviceOrientationDidChangeNotification' che è disponibile se la chiedi chiamando' [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications] '(ma devi comunque registrare ogni controller di visualizzazione per esso). –

+0

'UIDeviceOrientationDidChangeNotification' chiama dopo una rotazione - non all'interno della rotazione come' willAnimateRotationToInterfaceOrientation'.Ci scusiamo per la possibile domanda di noob, ma stiamo chiamando 'postNotificationName' con il parametro' object: self' - verrà inviato solo all'oggetto 'self'? – Dmitry