8通告机制与自动转屏
通告机制与自动转屏
多个对象“关注“同一个对象
让发生事件的对象向通告中心notification center发布通告,告知自己在做什么。其他感兴趣的对象可以针对某个特定的通告,或者某个特定的对象,将自己注册为观察器,以便在相应的通告被发布时,或者相应的对象发布通告时收到指定的消息。
通告中心
每个应用都有一个NSNotificationCenter实例,其工作模式类似智能公告栏。任何对象都可以将自己注册成观察器。在某个对象发布通告后,NSNotificationCenter实例会将该通告转发给已注册的观察器。
这里的通告是指NSNotificationCenter对象。每个NSNotification对象都有自己的名称和一个指针,指回发布该通告的对象。将某个对象注册为观察器时,需要指定通告名称、发布通告额度对象和接收相应通告的方法和方法名。
注册观察器时,nil起通配作用。当nil作为name参数传入,无论通告中心转发的通告名称是什么,观察器都会收到消息。将nil作为name参数和object参数传入,观察器会收到所有的转发通告。
Notification对象可以包含一个名为userInfo的NSDictionary对象。通过这个字典对象,通告可以传递额外的信息。
通告中心会保留指向观察器的引用。如果程序释放了某个已经注册成为观察器的对象,但没有将其移出通告中心,那么当通告中心转发该对象曾经关心的事件时,就会向保留的引用发送指定的消息。但是,因为该对象已经不存在,所以会导致程序崩溃。因此,如果程序将某个对象注册成为观察器,就必须在释放该对象时将其移出通告中心。
重点提示:NSNotification对象和NSNotificationCenter对象与用户可以看到的“通告”无关。这类可以看到的通告包括推送通告(push notification),本地推送通告(local notification)等。NSNotification和NSNotificationCenter构成了另一种设计模式。
UIDevice通告 Notifications
UIKit框架中的UIDevice对象可以不间断地发布通告。下面列出的是UIDevice对象所发布通告的名称常量:
UIDeviceOrientationDidChangeNotification
UIDeviceBatteryStateDidChangeNotification
UIDeviceBatteryLevelDidChangeNotification
UIDeviceProximityStateDidChangeNotification。
每当设备发生转动,或者贴近使用者面部时,UIDevice对象就会发布上述报告。
// Override point for customization after application launch.
//得到UIDevice对象
UIDevice *device = [UIDevice currentDevice];
//要求UIDevice对象开启加速感应器并监视方向变化
[device beginGeneratingDeviceOrientationNotifications];
//得到应用的NSNotification对象
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
//将self注册为观察器
[nc addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:device];
这样,当设备方向发生变化时,AppDelegate实例就会收到orientationChanged:消息。
构建并运行应用,因为模拟器无法模拟所有的转动方向,可以使用Hardware菜单上的Rotate Left和right来改变方向。
将self注册成观察器时,使用了@selector指令。该指令可以将传入的方法名字符串转成SEL类型的数据。这里这样做是因为:1.因为SEL类型的变量可以作为实参传入方法。2.某些方法和函数只接受SEL类型的方法名实参。
Cocoa Touch中的很多类都会发布通告,其中包括UIApplication、NSManagedObjectContext、MPMoviePlayerController、NSFileHandle、UIWindow、UITextField和UITextView。
自动转屏Autorotation

浙公网安备 33010602011771号