iOS通知的例子

一、通知

通知是iOS中的一種消息傳遞方式,通過消息中心(NSNotificationCenter)對消息的監聽,當某些類發送出消息的時候,消息中心監聽到這些消息,然後進行相應的操作,這些操作對於發送出這些消息的類來說是相同的。

下面通過一個demo來說明通知的實現

                                 

就是點擊按鈕,彈出彈窗,然後點擊彈窗中的按鈕打印出一些信息。 這個信息是由前面自定義的alertView發出給到控制器的,我們用通知來實現這之間的數據傳遞。


//viewController.m
- (IBAction)buttonDidClicked:(UIButton *)sender {
    
    LSRAlertView * view = [LSRAlertView alertWithTitle:@"操作完成" andTitleImageName:@"gou"];
    [view addTopButtonWithTitle:@"確定"];
    [view addBottomButtomWithTitle:@"取消"];
    [view show];
    //這裏向消息中心註冊消息
    //obsever:觀察者,誰來監聽這個消息
    //selector:監聽到發出的對應的消息後要做什麼
    //name:監聽的消息的名稱
    //obeject:保存在消息中心的數據,一般傳一個nil
    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(sureButtonDidClicked) name:@"SureButtonClickedNotificationName" object:nil];
    //取消按鈕我們需要傳遞一些參數
    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(cancelButtonClicked:) name:@"CancelButtonClickedNotificationName" object:nil];
    
}

首先在控制器中添加一個按鈕點擊事件,然後設置彈窗視圖(至於如何自定義彈窗視圖,請查看我的上一篇文章),接着我們在這裏向消息中心註冊消息,爲什麼在這裏註冊呢?因爲我們是要在控制器中獲取到彈窗視圖的數據,在控制器中註冊相應的消息後,控制器就會監聽發出我們註冊消息的對象,然後執行相應的方法,所以在控制器中註冊消息。

接着我們在自定義彈窗視圖的類寫發送消息的代碼,那麼又該在哪裏寫呢?應該在彈窗視圖上的按鈕被點擊了之後寫,所以:


//LSRAlertView.m
- (IBAction)topButonClicked:(UIButton *)sender {
     [self dismiss];
    //這裏按鈕被點擊了,此時需要發出消息
    //name:消息的名稱,必須和所監聽的消息的名稱相同
    //object:需要回調的數據
    //userInfo:也是需要回調的數據
    [[NSNotificationCenter defaultCenter]postNotificationName:@"SureButtonClickedNotificationName" object:nil userInfo:nil];
   
}
- (IBAction)bottomButtonClicked:(UIButton *)sender {
    //發出消息的時候回調參數
    [self dismiss];
    [[NSNotificationCenter defaultCenter]postNotificationName:@"CancelButtonClickedNotificationName" object:@"object" userInfo:@{@"name":@"jack"}];
    
}

發送消息我們用postNotificationName,這裏需要注意的是發送消息的名稱一定要和之前在控制器中註冊的消息名對應起來,另外如果我們需要傳遞一些數據,就將傳遞的數據寫在 object 或者  userInfo 中,前者是一個字符串類型,後者是一個字典類型。

然後是我們在控制器監聽到彈窗視圖發出的消息後執行的操作:

//ViewController.m
-(void)sureButtonDidClicked{
    //這裏不需要回調參數
    NSLog(@"確定按鈕被點擊了");
    
    //在這裏移除消息
    [[NSNotificationCenter defaultCenter]removeObserver:self name:@"SureButtonClickedNotificationName" object:nil];
} 
-(void)cancelButtonClicked:(NSNotification *)notification{
    //這裏將傳遞過來的參數打印出來
    NSLog(@"%@",notification.object);
    NSLog(@"%@",notification.userInfo);
    
    //同樣在這裏移除消息
    [[NSNotificationCenter defaultCenter]removeObserver:self name:@"CancelButtonClickedNotificationName" object:nil];
    
}

這裏需要注意兩點,一是如何取出消息中的數據,我們使用notification的屬性object和userInfo來取得相應的數據。第二點也是非常重要的就是一定要將消息中的消息移除,一定要將消息中的消息移除,一定要將消息中的消息移除。如果不移除就會導致點擊一次按鈕觸發多次事件,因爲有多個相同的消息同時註冊了。

最後是打印的信息:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章