iOS 학습 - Notification 보완

  • 방법 정의
  •      -(void) update{      } 
  • 개체 등록 및 연결 메시지
  •     [[NSNotificationCenter defaultCenter] 
        addObserver:self selector:@selector(update) name:@"update"object:nil]  
  • 알림 메시지를 보낼 곳
  •     [[NSNotificationCenter defaultCenter] 
        postNotificationName:@"update" object:nil];

    Notifications 사용 방법http://blog.sina.com.cn/s/blog_5df7dcaf0100c0q2.html
    사용자는 RaiseMan을 사용해서 몇 개의 문서를 열었을 수도 있다. 그리고 그는 보라색 배경색이 문서의 본문을 읽는 데 정말 불리하다는 것을 발견했다.그래서 그는 Preferencespanel을 열어 배경색을 수정했지만, 실망스럽게도 이미 존재하는 문서의 배경색은 바뀌지 않았다.그래서 이 사용자는 너에게 이런 것들을 알려주는 편지를 쓸 수도 있다.답장할 수도 있습니다: "defualts는document을 만들 때 읽습니다. 파일을 열고 저장합니다."실제로 사용자가 설명하고자 하는 것은 프로그램이 열려 있는 문서를 즉시 리셋하기를 바라는 것입니다.만약 이렇다면 어떻게 해야 합니까?열려 있는 모든 문서를 리스트로 기록해야 합니까? -Notification이란? -이 요구는 사실 실현되기도 쉽다.실행 중인 모든 응용 프로그램에는 NSNotificationCenter의 구성원 변수가 있는데, 그 기능은 공공 표시줄과 유사하다.대상 등록은 어떤 확실한 notification에 주목한다. (강아지 한 마리를 주운 사람이 있으면 나에게 말해라.)우리는 이 등록 대상들을observer라고 부른다.다른 대상들은 센터에 notifications를 보낼 것이다.center는 이 notifications를 등록된 모든 notification에 관심 있는 대상에게 전송합니다.우리는 이 notification을 보내는 대상을poster Notification 대상이라고 하는데 매우 간단하다.이것은poster가observer에 제공할 정보 패키지입니다.notification 대상에는 두 가지 중요한 구성원 변수가 있습니다:name과object.일반적인object는poster를 가리키기 때문에 notification을 받아들일 때poster로 되돌릴 수 있는 두 가지 방법이 있습니다
       - (NSString *)name    - (id)object

    NSNotificaiton Cernter는 구조된 뇌입니다.이것은 우리가 observer 대상을 등록하고 notification을 보낼 수 있도록 합니다. observer 대상의 등록을 취소하는 것은 아래에 자주 사용하는 방법입니다
        + (NSNotificationCenter *)defaultCenter
    

    notification center [클래스 방법, 전역 대상 되돌리기, 단일 모드.coa의 많은 전역 대상은 유사한 방법으로 이루어진다]
    - (void)addObserver:(id)anObserver selector:(SEL)aSelector name:(NSString *)notificationName object:(id)anObject

    anObserver 객체 등록: 이름이 notificationName이고 보낸 사람이 anObject인 notification을 받습니다.anObject가 notificationName의 notification을 보낼 때 anObserver의 aSelector 방법을 호출합니다. 파라미터는 이 notification입니다. 만약 notificationName이nil이면.그러면 notification center는 anObject가 보낸 모든 notification을 observer에 전송합니다. 만약 anObject가nil이라면.그러면 notification center는 모든 이름이 notificationName인 notification을 observer에 전송합니다
    - (void)postNotification:(NSNotification *)notification

    notification 센터에 notification 보내기
    - (void)postNotificationName:(NSString *)aName object:(id)anObject

    notification 만들기 및 보내기
    - (void)removeObserver:(id)observer

    observer 제거
    - Notification 보내기 - Notification을 보내는 것이 가장 간단한 절차이기 때문에 우리는 그것을 실현하기 시작한다.change Background Color: 메시지를 받았을 때Preference Controller 대상이 notification을 보냅니다.우리는 notification을 @ "BNRcolorChanged"라고 명명하고, 전역 상수를 사용합니다.(경험이 있는 프로그래머는 다른 구성 요소가 정의한 notification과 혼동되지 않도록 접두사를 사용한다.)Preference Controller를 엽니다.h 다음 외부 설명 extern NSString * const BNRcolorChangedNotification 추가;Preference Controller.m에서 상수 NSString * const BNRcolorChanged Notification = @ "BNRcolorChanged"를 정의합니다.Preference Controller.m 수정 changeBackgroundColor:메서드
    - (IBAction)changeBackgroundColor:(id)sender
    {
        NSColor *color = [colorWell color];
        NSData *colorAsData =
                      [NSKeyedArchiver archivedDataWithRootObject:color];
        [[NSUserDefaults standardUserDefaults] setObject:colorAsData
                                              forKey:BNRTableBgColorKey];
        NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
        NSLog(@"Sending notification");
        [nc postNotificationName:BNRColorChangedNotification object:self];
    }

    - Observer로 등록 - observer를 등록하려면 몇 가지 요수를 제공해야 합니다. observer의 대상이 되어야 합니다.관심 있는 notification의 이름;notification을 보낼 때 호출할 방법입니다.우리도 어떤 대상에 주목할 notification을 지정할 수 있습니다.(예를 들어 특정한 window의resize의 notification에 주목해야 한다) My Document 클래스를 편집하는 init 방법
    - (id)init
    {
        if (![super init])
            return nil;
        employees = [[NSMutableArray alloc] init];
        NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
        [nc addObserver:self
               selector:@selector(handleColorChange:)
                   name:BNRColorChangedNotification
                 object:nil];
        NSLog(@"Registered with notification center");
        return self;
    }

    dealloc 메서드에서 MyDocument를 notification center에서 제거합니다.
    - (void)dealloc
    {
        [self setEmployees:nil];
        NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
        [nc removeObserver:self];
        [super dealloc];
    }

    - Notification 처리 - notification이 발생할 때handleColorChange: 방법이 호출됩니다.현재 우리는 방법에서 간단하게 로그를 인쇄하고 있다.
    - (void)handleColorChange:(NSNotification *)note { NSLog(@"Received notification: %@", note); }

    컴파일 실행 프로그램, 우리가 원하는 로그를 보았죠
    -userInfo Dictionary – notification 대상의object 변수는poster입니다. 만약에 notification 대상이 더 많은 정보를 전달하고 싶다면user info dictionary를 사용할 수 있습니다.모든 notification 대상은userInfo라는 변수가 있습니다. 이것은 NSDictionary 대상입니다. 이것은 notification과 함께observer에 전달하고자 하는 다른 정보를 저장하는 데 사용됩니다.MyDocument에서 그것을 사용하여 변경할 color를 얻을 것입니다.Preference Controller.m userInfo 추가
    - (IBAction)changeBackgroundColor:(id)sender
    {
        NSColor *color = [sender color];
        NSData *colorAsData;
        colorAsData = [NSKeyedArchiver archivedDataWithRootObject:color];
        [[NSUserDefaults standardUserDefaults] setObject:colorAsData
                                              forKey:BNRTableBgColorKey];
        NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
        NSLog(@"Sending notification");
        NSDictionary *d = [NSDictionary dictionaryWithObject:color
                                                      forKey:@"color"];
        [nc postNotificationName:BNRColorChangedNotification
                          object:self
                        userInfo:d];
    }

    MyDocument.m, userInfo에서 color로 읽기
    - (void)handleColorChange:(NSNotification *)note
    {
        NSLog(@"Received notification: %@", note);
        NSColor *color = [[note userInfo] objectForKey:@"color"];
        [tableView setBackgroundColor:color];
    }

    좋은 웹페이지 즐겨찾기