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


posted @ 2015-09-29 17:04  captivity  阅读(74)  评论(0)    收藏  举报