2013-04-11 22 views
7

Ben uygulama (soru 2.) tüm UIViewController parametreleri toInterfaceOrientation ve duration (soru 1.) ile bildirim @"willAnimateRotationToInterfaceOrientation" göndermek gerekir. Bunun için kod nasıl yazılır?Objective-C'de parametrelerle bir bildirim nasıl gönderilir?

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

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

İlgili soru: http://stackoverflow.com/questions/15957077/event-willanimaterotationtointerfaceorientation-isnt-calling – Dmitry

cevap

19

Kullanım postNotificationName:object:userInfo: ve userInfo sözlüğe içine geçmesine istediğiniz herhangi bir parametre paket.

Örnek: Bu

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

gibi bir bildirim gönderebilir Sonra yaparak, geçtin bilgilerini alabilir

: Yukarıda gördüklerimizden

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

Özetlemek gerekirse seçici Bir bildirimi işlemek için kullanılan, NSNotification türünde isteğe bağlı bir parametre alır veiçinde dolaşmak istediğiniz bilgileri saklayabilirsinizsözlük.

+0

Teşekkürler, cevap için Gabriele! Örnek kodunuz var mı? – Dmitry

+1

Evet, bir saniye :) –

+0

Kodunda aşağıdaki hatalar var: 1. Programda beklenmeyen '@'. 2. 'UIInterfaceOrientation' (aka 'enum UIInterfaceOrientation') türündeki koleksiyon öğesi bir Objective-C nesnesi değildir. – Dmitry

0

Daha az argüman alan ve sizin için karmaşık bir çağrı yapan çağrı yöntemini daha kolay hale getiriyorsunuz.

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

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

Gerçi kendini willAnimateRotationToInterfaceOrientation: çağıran edilmemelidir. Bunun yerine, döndürme sırasında ve diğer zamanlarda etkinleştirmek istediğiniz kodu içeren bu yöntemi içeren bir yöntem oluşturun.

+0

Ama parametreler 'userInfo' kullanılarak nasıl geçilir? – Dmitry

1

Bu, sizin düşündüğünüz şekilde çalışmaz.

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

bildirim nesnesi ilgili bilgi aktarmak için kullanılabilir bir sözlük olan bir özellik, userInfo sahiptir: bir bildirim mesajı çağrısı NSNotification nesnedir bir isteğe bağlı parametre vardır. Ancak bildirim merkezi tarafından çağrılacak keyfi seçicileri kaydedemezsiniz. Bu sözlüğü, -postNotificationName:object: yerine -postNotificationName:object:userInfo: kullanarak bildirimle iletirsiniz; userInfo parametresi, yalnızca oluşturduğunuz bir NSDictionary parametresidir.

+0

Teşekkürler, ama uygulamanın tüm (veya tüm görünür) 'UIViewController's bir bildirim göndermek mümkün mü? – Dmitry

+0

Yalnızca bu bildirim için kayıtlı olsalardı. '[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]' ı (ancak yine de her bir görüntü denetleyicisini bunun için kaydettirmeniz gerekir) diyerek bunu sorarsanız, varolan bir bildirim olan 'UIDeviceOrientationDidChangeNotification' olduğunu unutmayın. –

+0

'UIDeviceOrientationDidChangeNotification', bir dönüşten sonra - dönüş içinde" willAnimateRotationToInterfaceOrientation "olarak değil.Muhtemel noob sorusu için özür dileriz, ancak 'objectNotificationName' ile' object: self' parametresi'ni çağırıyoruz - sadece 'self' nesnesine gönderilecek mi? – Dmitry

İlgili konular