iOS的通知

首先,什么是通知呢,通知跟代理的功能是一樣的,都是傳值,調方法,但是我個人覺得通知比代理還是要簡便的,而且功能更強大,如果你代理弄懂了,那么通知也就非常容易理解了,我認為通知比代理書寫更容易,而且功能更強大.代理是一對一傳值,但是通知可以一對多或多對多,好了不多說了給大家具體講一下:

首先了解一下通知中心的概念:

每一個應用程序都有一個通知中心(NSNotificationCenter)實例,專門負責協助不同對象之間的消息通信
任何一個對象都可以向通知中心發布通知(NSNotification),描述自己在做什么。其他感興趣的對象(Observer)可以申請在某個特定通知發布時(或在某個特定的對象發布通知時)收到這個通知

這是一個通知的簡單的示意圖:

?

一個完整的通知一般包含3個屬性:

- (NSString *)name; // 通知的名稱
- (id)object; // 通知發布者(是誰要發布通知)
- (NSDictionary *)userInfo; // 一些額外的信息(通知發布者傳遞給通知接收者的信息內容)

初始化一個通知(NSNotification)對象
+ (instancetype)notificationWithName:(NSString *)aName object:(id)anObject;
+ (instancetype)notificationWithName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)aUserInfo;
- (instancetype)initWithName:(NSString *)name object:(id)object userInfo:(NSDictionary *)userInfo;

發布通知:

//通知中心(NSNotificationCenter)提供了相應的方法來幫助發布通知
- (void)postNotification:(NSNotification *)notification;
//發布一個notification通知,可在notification對象中設置通知的名稱、通知發布者、額外信息等- (void)postNotificationName:(NSString *)aName object:(id)anObject;
//發布一個名稱為aName的通知,anObject為這個通知的發布者- (void)postNotificationName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)aUserInfo;
//發布一個名稱為aName的通知,anObject為這個通知的發布者,aUserInfo為額外信息

注冊監聽通知器:

//通知中心(NSNotificationCenter)提供了方法來注冊一個監聽通知的監聽器(Observer)
- (void)addObserver:(id)observer selector:(SEL)aSelector name:(NSString *)aName object:(id)anObject;
//observer:監聽器,即誰要接收這個通知
//aSelector:收到通知后,回調監聽器的這個方法,并且把通知對象當做參數傳入
//aName:通知的名稱。如果為nil,那么無論通知的名稱是什么,監聽器都能收到這個通知
//anObject:通知發布者。如果為anObject和aName都為nil,監聽器都收到所有的通知

取消注冊監聽通知器:

//通知中心不會保留(retain)監聽器對象,在通知中心注冊過的對象,必須在該對象釋放前取消注冊。否則,當相應的通知再次出現時,通知中心仍然會向該監聽器發送消息。因為相應的監聽器對象已經被釋放了,所以可能會導致應用崩潰//通知中心提供了相應的方法來取消注冊監聽器
- (void)removeObserver:(id)observer;
- (void)removeObserver:(id)observer name:(NSString *)aName object:(id)anObject;//一般在監聽器銷毀之前取消注冊(如在監聽器中加入下列代碼):
- (void)dealloc {//[super dealloc];  非ARC中需要調用此句
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

UIDevice通知

//UIDevice類提供了一個單粒對象,它代表著設備,通過它可以獲得一些設備相關的信息,比如電池電量值(batteryLevel)、電池狀態(batteryState)、
設備的類型(model,比如iPod、iPhone等)、設備的系統(systemVersion)
//通過[UIDevice currentDevice]可以獲取這個單粒對象//UIDevice對象會不間斷地發布一些通知,下列是UIDevice對象所發布通知的名稱常量: UIDeviceOrientationDidChangeNotification // 設備旋轉 UIDeviceBatteryStateDidChangeNotification // 電池狀態改變 UIDeviceBatteryLevelDidChangeNotification // 電池電量改變 UIDeviceProximityStateDidChangeNotification // 近距離傳感器(比如設備貼近了使用者的臉部)

這是幾種經常用的關于鍵盤的通知:

//我們經常需要在鍵盤彈出或者隱藏的時候做一些特定的操作,因此需要監聽鍵盤的狀態//鍵盤狀態改變的時候,系統會發出一些特定的通知
UIKeyboardWillShowNotification // 鍵盤即將顯示
UIKeyboardDidShowNotification // 鍵盤顯示完畢
UIKeyboardWillHideNotification // 鍵盤即將隱藏
UIKeyboardDidHideNotification // 鍵盤隱藏完畢
UIKeyboardWillChangeFrameNotification // 鍵盤的位置尺寸即將發生改變
UIKeyboardDidChangeFrameNotification // 鍵盤的位置尺寸改變完畢//系統發出鍵盤通知時,會附帶一下跟鍵盤有關的額外信息(字典),字典常見的key如下:
UIKeyboardFrameBeginUserInfoKey // 鍵盤剛開始的frame
UIKeyboardFrameEndUserInfoKey // 鍵盤最終的frame(動畫執行完畢后)
UIKeyboardAnimationDurationUserInfoKey // 鍵盤動畫的時間
UIKeyboardAnimationCurveUserInfoKey // 鍵盤動畫的執行節奏(快慢)

通知和代理的各自特點:

共同點:
利用通知和代理都能完成對象之間的通信
(比如A對象告訴D對象發生了什么事情, A對象傳遞數據給D對象)

不同點:
代理 : 一對一關系(1個對象只能告訴另1個對象發生了什么事情)
通知 : 多對多關系(1個對象能告訴N個對象發生了什么事情, 1個對象能得知N個對象發生了什么事情)

?

另附一個關于鍵盤通知的實例:

//注冊一個通知
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(keyboardWillChangeFrame:) 
name:UIKeyboardWillChangeFrameNotification object:nil];
- (void)dealloc {//[super dealloc];  非ARC中需要調用此句
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}
//當鍵盤改變了frame的時候調用 - (void)keyboardWillChangeFrame:(NSNotification *)note{ //動畫時間 CGFloat duration = [note.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue]; //取得鍵盤最后的frame CGRect keyBoardFrm = [note.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue]; //計算控制器View需要平移的距離 CGFloat viewTransformY = keyBoardFrm.origin.y - self.view.frame.size.height; //執行動畫 [UIView animateWithDuration:duration animations:^{ self.view.transform = CGAffineTransformMakeTranslation(0, viewTransformY); }]; }

?

轉載于:https://www.cnblogs.com/ZMiOS/p/4833995.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/256671.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/256671.shtml
英文地址,請注明出處:http://en.pswp.cn/news/256671.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ValueStack基礎:OGNL

ValueStack基礎:OGNL 要了解ValueStack,必須先理解OGNL(Object Graphic Navigatino Language)! OGNL是Struts2中使用的一種表達式語言,它可以用于JSP的標簽庫中,以便能夠方便的訪問各種對象的屬性;它用于界…

4.H - 組合

題目連接:http://acm.hust.edu.cn/vjudge/contest/125308#problem/H 題目大意:下面是一個二人小游戲:桌子上有M堆撲克牌;每堆牌的數量分別為Ni(i1…M);兩人輪流進行;每走一步可以任意選擇一堆并取走其中的任…

結構體指針需要申請指針內存,結構體對象不需要申請對象內存

struct frame_info { char* data;//圖像數據 int bufsize;//圖像大小 }; 1、struct frame_info* finfoDT new struct frame_info; finfoDT->data new 1280*720 2、struct frame_info finfoDT new struct frame_info; finfoDT.data new 1280*720

圖論——連通圖

Tyvj 2059 元芳看電影 描述 神探狄仁杰電影版首映這天,狄仁杰、李元芳和狄如燕去看電影。由于人實在是太多了,入場的隊伍變得十分不整齊,一個人的前面可能會出現并排的好多人。“元芳,這隊伍你怎么看?”“大人&#xf…

linux-ftools查看Linux 的cached里面有哪些內容

最近,公司有幾臺java服務器經常出現can not allocate memory 的情況。導致SSH登錄失敗。 因此,有必要做點什么。 我們可以使用linux-ftools查看Linux 的cached里面有哪些內容(工具: https://code.google.com/p/linux-ftools/)&…

matlab常用函數——軟件常用函數

一、軟件操作函數 1)命令窗口函數: clc:清空命令窗口,使用向上箭頭翻看命令。 open:打開文件,文本文件(*.doc),可執行文件(*.exe),圖形文件(*.fig),超文本文件(*.html,*.htm),MATLAB數據庫文件(*.mat),simulink模型文件*.mdl),MATLAB p文件(*.p),…

stanford corenlp的TokensRegex

最近做一些音樂類、讀物類的自然語言理解,就調研使用了下Stanford corenlp,記錄下來。 功能 Stanford Corenlp是一套自然語言分析工具集包括: POS(part of speech tagger)-標注詞性NER(named entity recognizer)-實體名識別Parser樹-分析句子…

將Linux系統下交叉編譯的依賴庫推到ARM平臺下無法建立以來關系解決

問題:平常把opencv庫使用源碼交叉編譯好之后,從windows推到飛機里發現,該庫的依賴關系都沒有了,導致程序運行的時候報該庫大小有問題 解決辦法: 1、將linux下的庫推到ARM平臺中的一個文件夾中,然后將ARM平臺…

Java:switch語句例子

1、輸入一個名次,第1~4名,分別稱為冠軍、亞軍、季軍、殿軍,5名及5名以上,稱為其他名次。 import java.util.Scanner; public class switch1 {public static void main(String[] args){Scanner snew Scanner(System.in)…

SQL計算100以內的質數(可以把100換成任意的整數)

declare i int --定義局部變量ideclare j int --定義局部變量jset i1 --給變量i賦值while i<100 --最外層while循環控制計算20以內的質數&#xff0c;每循環一次提供一個數&#xff0c;判斷它是不是質數begin --最外層while循環開始set j1 --給變量j賦…

matlab常用函數——數據類型函數

三、基本數據類型函數 1)數值函數 double:轉換為雙精度浮點數 single:轉換為單精度浮點數 typecast:在不改變數據大小情況下轉換數據類型 Y=typecast(X,type) type可選范圍:uint8、int8、uint16、int16、uint32、int32、uint64、int64、single、double arrayfun:把函數…

Courses hdu 1083(匹配)

http://acm.hdu.edu.cn/showproblem.php?pid1083 題意&#xff1a;一共有N個學生跟P門課程,一個學生可以任意選一門或多門課,問是否達成: 1.每個學生選的都是不同的課(即不能有兩個學生選同一門課) 2.每門課都有一個代表(即P門課都被成功選過) 今天學姐講匹配時講的題目&#…

進程編譯連接動態庫,需要將動態庫改為lib***.so

1、本身該庫可能編譯成npuDetect.so,但是需要改其名字為libnpuDetect.so,CMakelists才能找到該庫 2、進程中連接動態庫&#xff0c;如果該庫還依賴別的動態庫&#xff0c;則需要繼續把其他的庫也要連接進來

Drbd+Pacemaker實現高可用

What is Pacemaker? Pacemaker是一個集群資源管理器。它利用集群基礎構件&#xff08;OpenAIS 、heartbeat或corosync&#xff09;提供的消息和成員管理能力來探測并從節點或資源級別的故障中恢復&#xff0c;以實現群集服務&#xff08;亦稱資源&#xff09;的最大可用性。 前…

matlab常用函數——矩陣函數

五、數組和矩陣函數 1)數組基本函數 display:顯示字符或者數組 isempty :判斷數組是否為空,空返回1,不空返回0 isequal :判斷數組是否相同 (認為NaN不同) isequalwithequalnans:判斷數組是否相同,把NaN看成相同的數 isfinite :判斷數組元素是否為有限數 isfloat…

記錄下面試中的回答的不好的問題

1 伙伴系統在linux中的作用&#xff0c;具體咋回事 2 tcp擁塞控制 滑動窗口 3 linux sed&#xff0c;awk的具體使用 4 ftp哪幾種模式 5 中斷與輪詢 6 C stl的vector是怎么是實現的 7 I/O多路復用是怎么回事&#xff0c;select(),epoll()具體怎么回事。 一個文件中每行一個單詞&…

Python 字符串操作(string替換、刪除、截取、復制、連接、比較、查找、包含、大小寫轉換、...

去空格及特殊符號 s.strip().lstrip().rstrip(,) 復制字符串 #strcpy(sStr1,sStr2)sStr1 strcpysStr2 sStr1 sStr1 strcpy2print sStr2 連接字符串 #strcat(sStr1,sStr2)sStr1 strcatsStr2 appendsStr1 sStr2print sStr1 查找字符 #strchr(sStr1,sStr2)# < 0 為未找到…

周賽題解

A - An easy problemTime Limit:3000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Practice HDU 2601Description When Teddy was a child , he was always thinking about some simple math problems ,such as “What it’s 1 cup of wa…