fb_license

技術標籤

@selector (1) 初使化區塊 (1) 物件 (1) 物件導向 (2) 型別 (4) 封裝 (1) 流程控制 (1) 陣列 (3) 推論型別 (2) 實機測試 (1) 蓋索林(gasolin) (1) 模組 (1) 憑證 (1) 轉型 (1) 羅康鴻 (121) 類別 (1) 變數 (5) Accelerometer (1) ActiveRecord (1) Activity (1) AFNetworking (1) alloc (1) Android (3) Animation (1) App (1) App ID (1) APP上傳 (1) ASP.NET (1) AVAudioPlayer (1) block (1) C# (2) class (1) CLLocationManager (1) CLLocationManagerDelegate (1) CMMotionManager (4) Controller (1) delegate (1) DELETE語法 (1) Device Motion資料 (1) Dialog (1) DropDownList (1) dynamic language (2) Facebook SDK (9) FBRequest (5) FBRequestConnection (2) FMDB (1) Gesture Recognizers (6) GROUP BY (2) Gyro (1) HAVING (1) IBAction (1) IBOutlet (1) id (3) inheritance (1) init (1) Insert (1) instance variable (1) Interface Builder (1) iOS (70) iOS idea (7) iOS Introduction (1) Layout (1) Magnetometer (1) Menu (2) Method (2) MKMapView (1) MKPointAnnotation (1) MS SQL (5) Nil (1) NSArray (1) NSDictionary (1) NSError (1) NSFileManager & .plist (1) NSMutableArray (1) NSMutableDictionary (1) NSNotificationCenter (1) NULL (1) object (2) Objective-C (16) Objective-C idea (1) ORDER BY (1) Parameter (1) property (1) protocol (2) Provisioning (1) Proximate Sensor (1) Q and A (2) R類別 (1) Rails (9) RESTful SOA (9) Ruby (8) Scene (1) SEELECT (1) Segue (2) SEL (1) SELECT語法 (1) Shake (1) Simulator (1) SOA (8) SQL (6) SQL Server (5) SQL函數 (1) SQL彙總函數 SQL (1) SQLite (1) Storyboard (1) Style (1) Swift (1) Table (1) target & action (1) Theme (1) Toast (1) TRUNCATE TABLE語法 (1) UIActionSheet (1) UIActionSheetDelegate (1) UIActivityIndicatorView (1) UIAlertView (1) UIBarButtonItem (1) UIButton (1) UICollectionView (1) UICollectionViewDataSource (1) UIControl (9) UIDatePicker (1) UIImage (1) UIImagePickerController (2) UIImagePickerControllerDelegate (2) UIImageView (1) UILabel (1) UILongPressGestureRecognizer (1) UINavigationController (2) UIPanGestureRecognizer (1) UIPinchGestureRecognizer (1) UIProgressView (1) UIResponder (1) UIRotationGestureRecognizer (1) UISegmentedControl (1) UISlider (1) UIStepper (1) UISwipeGestureRecognizer (1) UISwitch (1) UITabBarController (1) UITableView (1) UITableViewDataSource (1) UITapGestureRecognizer (1) UITextField (1) UITextFieldDelegate (1) UITextView (2) UITextViewDelegate (1) UIToolBar (1) UIView (8) UIWebView (1) UPDATE語法 (1) var (2) VB.NET (7) View (4) WHERE子句 (1) XML (1)

2014/03/25

[iOS] 讓我通知您 - 通知中心NSNotificationCenter


idea...



我是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進入時,會接收一些來自系統的地理位置變更的通知訊息,而離開時就不需要了,因此會移除這個已註冊的通知
NSNotificationCenter資訊: