zoukankan      html  css  js  c++  java
  • objective-c 通告

    1. 通告和委托的区别

    通告也能传递与事件相关的数据。通告不同于委托的地方在于,通告是在对象执行完成动作之后产生,而不是之前。受到通告的对象没有机会建议是否要执行动作,而且对象的通告可以有多个监听者(observer),但是只有一个委托对象。

    2. 通告的工作机制

    a. 对应用程序中其他地方发生的事件(比如增加一条数据库记录)感兴趣的对象,会向通告中心(Notification Center,NSNotificationCenter类的实例)注册,从而成为该事件的监听者。在注册过程中,监听者需要指定方法供通告中心在事件发 生时调用。


    b.给数据库添加记录(或者类似事件)的对象给通告中心发一个通告(NSnotification的实例)。该通告对象包括识别通告的标志、发布通告的对象ID和可选的附加信息字典。


    c.通告中心发送消息到每个已注册的监听者,调用监听者指定的方法会将通告传给这些监听者。


    3.如何使用通告

    a.通告如何工作

       发布通告的类在头文件中将要通告的名称定义为静态NSString对象。例如NSWindow类在它的头文件中定义了16个通告,使其他对象可以监视该窗口的状态变化。

    APPKIT_EXTERNNSString *NSWindowWillBeginSheetNotification;

     

    b.通告的执行

     

    下面的例子,通告中心一旦收到NSWindowWillBeginSheetNotification通告,就调用sheetDidBegin:方法。

     

      - (id)initWithFrame:(NSRect)frame {

     

        self = [super initWithFrame:frame];

     

        if (self) {

     

     

     

    NSNotificationCenter *center = [NSNotificationCenterdefaultCenter];

     

    [centeraddObserver:selfselector:@selector(sheetDidBegin:)name:NSWindowWillBeginSheetNotificationobject:nil];

     

        }

     

       returnself;

     

    }

     


     

    - (void)sheetDidBegin:(NSNotification *)notification

     

    {

     

    NSLog(@"Notification: %@",[notificationname]);

     

    }

     


     

    c.要记得从通告中心删除对象

     

    - (void)dealloc{

     

    //防止通告中心将消息发给不存在的对象

     

    [[NSNotificationCenterdefaultCenter]removeObserver:self];

     

    [superdealloc];

     

    }

     


     

     

     

    4.自定义通告

     

    a.首先定义通告的名称-- (在动作发送的那个类里面定义)

     

    如我做的简单例子是View里面的一个按钮点击的时候通知主界面

     

    extern NSString*ButtonClickedNotification //@"ButtonClicked"

     

    b.注册通告

     

         NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];

     

         [ncaddObserver:selfselector:@selector(responseButtonClick:) name:ButtonClickedNotification object:nil];

     

     

     

    c.处理通告

     

    - (void)responseButtonClick:(NSNotification *)nt {

     

         TestViewCtrl *currentViewCtrl = [nt object];

     

         NSString *result = [currentViewCtrl value];

     

         NSLog(@"valuefrom view:%@",result);

     

    }

     

     

     

    d.动作发生的时候发送通知给监听者

     

    - (IBAction)clickBtn:(id)sender {

     

         NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];

     

         self.value = @"Hello world";

     

         [ncpostNotificationName:ButtonClickedNotification object:self];

     

    }

     

     

     

    f.最后,同上,dealloc的时候要从通告中心删除对象

     

     

  • 相关阅读:
    day18:json模块&time模块&zipfile模块
    Color Changing Sofa Gym
    Gym
    Gym
    Java的awt包的使用实例和Java的一些提示框
    分组背包 例题:hdu 1712 ACboy needs your help
    UVA1401 Remember the Word 字典树维护dp
    CodeForces833 B. The Bakery 线段树维护dp
    hdu4719 Oh My Holy FFF 线段树维护dp
    Little Difference Gym
  • 原文地址:https://www.cnblogs.com/watchdatalearn2012620/p/3336440.html
Copyright © 2011-2022 走看看