我是iOS工程師,
我想要知道使用者按了多少下按鈕, 但統計按鈕按下的次數的任務又在Controller上, 要怎麼樣讓Button按鈕被按下時, 可以通知Controller統計按鈕按下的次數? |
我是通知中心NSNotificationCenter,
只要向我註冊一個訊息, 當我接收到這個訊息時, 我就會通知Controller, 請Controller做事。 |
我是Controller, 那我就向通知中心NSNotificationCenter註冊一個訊息, 等你來通知我做事了。 |
那我也會在我被按下時, 發出一個訊息給通知中心NSNotificationCenter, 這樣Controller就會被通知中心NSNotificationCenter告知, 使用者又按下我這個Button按鈕一次, 好讓Controller記錄被按下的次數。 |
第1步:建立一個名為"NSNotificationCenter"的"Single View Application"專案
第2步:加入Label文字標籤與Button按鈕,分別為Label標籤建立IBOutlet,取名為label,為Button按鈕建立Touch Up Inside事件的IBAction,取名為touch
第3步:將Label標籤文字拉到最寬,並且設定為置中,以顯示給予所有的文字,如下圖:
第4步:於"ViewController.m"中,為contoller準備一個統計按鈕次數的方法 - didCount
- 先宣告一個count實體變數,儲存按鈕被下的次數
- didCount方法,統計次數後,將統計的資訊顯示在Label文字標籤上,如下:
@interface ViewController ()
{
NSInteger count;
}
@end
@implementation ViewController
-(void) didCount
{
count = count + 1;
[self.label setText:[NSString stringWithFormat:@"按鈕被按下%d次!", count]];
}
@end
第5步:於"ViewController.m"中,為Controller向NSNotificaitonCenter註冊統計按鈕被按下次數的"CountNotification"通知
- [NSNotificaitonCenter defaultCenter]會取得預設的NSNotificaitonCenter,注意,在整個iOS的設計上,會有一個預設的NSNotificaitonCenter供所有APP共用
- 透過addObserver::::訊息,向NSNotificaitonCenter向註冊一個通知
- 第1個Observer參數:是通知誰要通知誰,在此為self即是Controller本身
- 第2個selector參數:選取"didCount"訊息,Controller被通知後將傳送此訊息
- 第3個name參數:此參數即是通知的名稱,在此為"CountNotification",當NSNotificaitonCenter收到此通知名稱時,則知道要向controller發送"didCount"訊息
- 第4個object參數:通知時傳入的物件,在此為nil
- (void)viewDidLoad
{
[super viewDidLoad];
NSNotificationCenter * center = [NSNotificationCenter defaultCenter];
[center addObserver:self
selector:@selector(didCount)
name:@"CountNotification"
object:nil];
}
第6步:於"ViewController.m"中,找到Button按鈕的"touch"方法,當按鈕被按下時,則會發出"CountNotification"通知給NSNotificationCenter
- [NSNotificaitonCenter defaultCenter]會取得預設的NSNotificaitonCenter
- 發送"postNotificationName::"訊息給NSNotificationCenter,表示按鈕再次被按下的通知
- (IBAction)touch:(id)sender {
NSNotificationCenter * center = [NSNotificationCenter defaultCenter];
[center postNotificationName:@"CountNotification" object:nil];
}
第5步:執行後按下Button按鈕,你會發現每按下一次,Label文字標籤顯示按鈕次數的文字就會被改變,當然這是因為Button按鈕被按下時,會發向NSNotificationCenter發出通知,而後NSNotificationCenter就會發送"didCount"訊息給controller,讓Label文字標籤顯示按鈕次數加1
第6步:最後別忘了改寫dealloc方法,讓Controller在被銷毀釋放時,向NSNotificationCenter取消通知的註冊,避免未使用的通知還一直註冊在NSNotificationCenter中
- (void)dealloc
{
NSNotificationCenter * center = [NSNotificationCenter defaultCenter];
[center removeObserver:self
name:@"CountNotification"
object:nil];
}
檔案連結:NSNotificationCenter.zip
誰可以註冊一個通知訊息?
- 只要是任何的物件皆可以註冊通知訊息,比如你可以自訂一個類別,這個類別也可以向NSNotificationCenter註冊一個訊息
- 常見的應用是在一個ViewController在進入,會註冊某個通知的訊息,而離開時則會取消訊息,比如說ViewController進入時,會接收一些來自系統的地理位置變更的通知訊息,而離開時就不需要了,因此會移除這個已註冊的通知