2013-04-11 2 views
7

мне нужно отправить уведомление @"willAnimateRotationToInterfaceOrientation" с параметрами toInterfaceOrientation и duration (вопрос № 1) всем UIViewController по применению (вопрос # 2). Как написать код для этого?Как отправить уведомление с параметрами Objective-C?

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

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

Связанный вопрос: http://stackoverflow.com/questions/15957077/event-willanimaterotationtointerfaceorientation-isnt-calling – Dmitry

ответ

19

Использование postNotificationName:object:userInfo: и перевяжите любой параметр, который вы хотите передать внутри userInfo словаря.

Пример:

Вы можете отправить уведомление как этот

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

А затем получить информацию, которую вы прошли, выполнив:

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

Подводя итог, что мы видели выше, селектор используемый для обработки уведомления, принимает один необязательный параметр типа NSNotification, и вы можете хранить любую информацию, которую вы хотите пропустить внутри userInfo словарь.

+0

Спасибо, Габриэле за ответ! У вас есть образец кода? – Dmitry

+1

Да, всего лишь секунда :) –

+0

Код имеет следующие ошибки: 1. Неожиданный «@» в программе. 2. Элемент коллекции типа «UIInterfaceOrientation» (иначе называемый enum UIInterfaceOrientation) не является объектом Objective-C. – Dmitry

0

Вы делаете более простой способ вызова, который принимает меньше аргументов и делает комплексный вызов для вас.

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

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

Вы не должны называть себя willAnimateRotationToInterfaceOrientation: хотя. Вместо этого создайте метод, который называется формой, который содержит код, который вы хотите активировать при вращении, а также другие времена.

+0

Но как передать параметры с помощью 'userInfo'? – Dmitry

1

Это не работает так, как вы думаете. Вызов сообщения уведомления имеет один необязательный параметр, который является объектом NSNotification:

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

Объекта уведомления имеет свойство, userInfo, который является словарем, который может быть использован для передачи соответствующей информации. Но вы не можете зарегистрировать произвольные селекторы, которые будут вызываться центром уведомлений. Вы передаете этот словарь с уведомлением, используя -postNotificationName:object:userInfo: вместо -postNotificationName:object:; параметр userInfo - это всего лишь созданный вами NSDictionary.

+0

Спасибо, но можно ли отправить уведомление всем (или всем видимым) 'UIViewController'у приложения? – Dmitry

+0

Только если они все зарегистрировались для этого уведомления. Обратите внимание, что существует существующее уведомление 'UIDeviceOrientationDidChangeNotification', которое доступно, если вы запрашиваете его, вызывая' [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications] '(но вы все равно должны зарегистрировать для него каждый контроллер представления). –

+0

'UIDeviceOrientationDidChangeNotification' вызывается после вращения - не внутри вращения как' willAnimateRotationToInterfaceOrientation'.Извините за возможный вопрос noob, но мы вызываем 'postNotificationName' с параметром' object: self' - будет ли он отправлен только на 'self'? – Dmitry

Смежные вопросы