iOS基礎 - 通知中心(NSNotificationCenter)

通知中心(NSNotificationCenter)數組

每個應用程序都有一個通知中心(NSNotificationCenter)實例,專門負責協助不一樣對象之間的消息通訊服務器

任何一個對象均可以向通知中心發佈通知(NSNotification),描述本身在作什麼。其餘感興趣的對象(Observer)能夠申請在某個特定通知發佈時(或在某個特定的對象發佈通知時)收到這個通知網絡

 

通知(NSNotification)app

一個完整的通知通常包含3個屬性:工具

- (NSString *)name;  // 通知的名稱佈局

- (id)object; // 通知發佈者(是誰要發佈通知)post

- (NSDictionary *)userInfo; // 一些額外的具體信息字體

初始化一個通知(NSNotification)對象atom

+ (id)notificationWithName:(NSString *)aName object:(id)anObject;url

+ (id)notificationWithName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)aUserInfo;

 

發佈通知

通知中心(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:通知發佈者。若是爲anObjectaName都爲nil,監聽器都收到全部的通知

 

註冊通知監聽器

- (id)addObserverForName:(NSString *)name object:(id)obj queue:(NSOperationQueue *)queue usingBlock:(void (^)(NSNotification *note))block;

參數解析:

name:通知的名稱

obj:通知發佈者

block:收到對應的通知時,會回調這個block

queue:決定了block在哪一個操做隊列中執行,若是傳nil,默認在當前操做隊列中同步執行

 

取消註冊通知監聽器

通知中心不會保留(retain)監聽器對象,在通知中心註冊過的對象,必須在該對象釋放前取消註冊。不然,當相應的通知再次出現時,通知中心仍然會向該監聽器發送消息。由於相應的監聽器對象已經被釋放了,因此可能會致使應用崩潰

通知中心提供了相應的方法來取消註冊監聽器

- (void)removeObserver:(id)observer;

- (void)removeObserver:(id)observer name:(NSString *)aName object:(id)anObject;

通常在監聽器銷燬以前取消註冊(如在監聽器中加入下列代碼):

- (void)dealloc {

    [super dealloc];

    [[NSNotificationCenter defaultCenter] removeObserver:self];

}

 

UIDevice通知

UIDevice類提供了一個單粒對象,它表明着設備,經過它能夠得到一些設備相關的信息,好比電池電量值(batteryLevel)、電池狀態(batteryState)、設備的類型(model,好比iPodiPhone)、設備的系統(systemVersion)

經過[UIDevice currentDevice]能夠獲取這個單粒對象

UIDevice對象會不間斷地發佈一些通知,下列是UIDevice對象所發佈通知的名稱常量:

UIDeviceOrientationDidChangeNotification // 設備旋轉

UIDeviceBatteryStateDidChangeNotification // 電池狀態

UIDeviceBatteryLevelDidChangeNotification // 電池電量

UIDeviceProximityStateDidChangeNotification // 近距離傳感器(好比設備貼近了使用者的臉部)

 

 

 

 

1、URL

1.什麼是URL

URL是某個資源的惟一路徑,經過這個路徑就能訪問對應的資源

2.URL的組成

協議頭://全路徑

協議頭就表明資源的類型,好比http表明網絡服務器資源,ftp表明ftp文件服務器資源,file表明本地資源

3.舉例

http://www.baidu.com

http://www.sina.com/a.jpg

ftp://192.168.3.251/abc.mp4

file:///Users/apple/Desktop/abc.txt

4.得到項目中某個文件的資源路徑(URL

NSURL *url = [[NSBundle mainBundle] URLForResource:@"messages.plist" withExtension:nil];

5.將字符串路徑轉成URL

NSURL *url1 = [NSURL URLWithString:@"http://www.baidu.com"];

NSURL *url2 = [NSURL URLWithString:@"file:///Users/apple/Desktop/abc.txt"];

NSURL *url3 = [NSURL fileURLWithPath:@"/Users/apple/Desktop/abc.txt"];

6.轉碼

若是路徑中包含了中文,須要進行UTF-8轉碼

// 1.文件URL路徑字符串

NSString *path = @"file:///Users/apple/Desktop/哈哈.txt";

// 2.將中文進行轉碼(UTF-8),返回轉碼後的字符串

// 轉碼後path變成了:file:///Users/apple/Desktop/%E5%93%88%E5%93%88.txt

path = [path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

// 3.生成URL

NSURL *url = [NSURL URLWithString:path];

2、開發規範

1.枚舉

1> 當某個屬性的值只有固定的幾個取值時,應該用枚舉

2> 枚舉常量名 以 「枚舉類型名」 開頭 或者 以 」k + 枚舉類型名「 開頭

好比

typedef enum {

    MessageTypeMe = 0, // 我發的

    MessageTypeOther = 1 // 別人發的

} MessageType;

或者

typedef enum {

    kMessageTypeMe = 0, // 我發的

    kMessageTypeOther = 1 // 別人發的

} MessageType;

2.readonly

若是某個屬性的值只在類的內部修改\賦值,外界不須要修改\賦值、也不容許修改\賦值,儘可能加上readonly關鍵字

3、UIButton

1.內部結構

1> UIButton內部默認有個UIImageViewUILabel控件,能夠分別用下面屬性訪問:

@property(nonatomic,readonly,retain) UIImageView *imageView;

@property(nonatomic,readonly,retain) UILabel     *titleLabel;

2> UIButton之因此能顯示文字,徹底是由於它內部的titleLabel

也就是說,UIButtonsetTitle:forState:方法設置的字符串就是顯示到了titleLabel

3> UIButtonsetImage:forState:方法設置的圖片顯示到了內部的imageView

4> 注意

設置按鈕的文字或文字顏色,必須用下面的方法

- (void)setTitle:(NSString *)title forState:(UIControlState)state;

- (void)setTitleColor:(UIColor *)color forState:(UIControlState)state;

#warnning 不能直接拿到titleLabel設置文字和文字顏色,好比下面的作法是錯誤的:

button.titleLabel.text = @"12323";

button.titleLabel.textColor = [UIColor redColor];

設置按鈕內部的小圖片,必須用下面的方法

- (void)setImage:(UIImage *)image forState:(UIControlState)state;

#warnning 不能直接拿到imageView設置圖片,好比下面的作法是錯誤的:

button.imageView.image = [UIImage imageNamed:@"abc.png"];

2.其餘設置

1> 設置按鈕的文字自動換行

button.titleLabel.numberOfLines = 0;

2> 設置按鈕的文字字體

button.titleLabel.font = [UIFont systemFontOfSize:16];

3> 設置按鈕周邊有多少區域不顯示內容(不顯示裏面的小圖片和文字)

// 頂部 10,左邊 20,底部 10,右邊 20

button.contentEdgeInsets = UIEdgeInsetsMake(10, 20, 10, 20);

4、圖片拉伸

1.iOS 5.0以前的作法

- (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:(NSInteger)topCapHeight;

2.iOS 5.0的作法

- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets;

3.iOS 6.0的作法

- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets resizingMode:(UIImageResizingMode)resizingMode;

5、封裝思想

1.若是有一段代碼具有如下屬性,應該抽到一個單獨的類或者分類中:

1> 功能性:用來實現某個獨立的功能

2> 工具性:簡單易用實用

3> 全局性:整個項目中處處都用到這個功能

2.究竟這段功能代碼抽到哪個類或者分類,就看這個功能主要用到哪一個類的方法\API,哪一個類最清楚這個功能怎麼實現

好比返回拉伸好圖片的功能應該放在UIImage的分類中

 

 

模擬QQ

一:qq聊天佈局

1.技術點:

1.1聊天列表

UITableView

自定義UITableViewCell (兩個按鈕,一個UIImageView

1.1底部工具條

二:qq聊天佈局思路

  1. 更改控制器繼承UITableViewController,而後修改storyboard中的控制器。
  2. 實現數據源方法
  3. 利用URL加載plist文件

3.1帶有中文的路徑須要轉碼

3.2拼接URL須要添加協議頭

3.2 自動拼接文件協議頭的方法

3.3 經過程序主包加載URL

3.4 將plist文件解析成數組

  1. 建立Message模型
  2. 初始化一個可變數組,將字典轉成模型,而後存儲到可變數組中。
  3. 實現代理方法,設置cell的高度
  4. 建立每個cellframe模型

7.1 若是上下兩條消息時間相同,下一條消息不須要計算時間的frame,並且cell的高度也須要減少,怎麼作才能一箭雙鵰了,能夠給frame模型添加一個BOOL類型屬性,判斷是否計算時間,若是不計算時間,意味着時間frame的最大y值爲0,頭像的y值就是一個邊距了跟時間無關了,這樣cell的高度也弄好了,cell的高度是跟頭像或者內容的最大y值相關的。

而這個BOOL類型的屬性在哪賦值了,應該在將字典轉換成消息模型的地方,根據上下兩條消息時間判斷是否應該計算時間frame

7.2根據message模型中的type改變頭像和內容的x

7.3按鈕的寬度和高度,根據內容決定的,若是想更改按鈕的寬度和高度,咱們只須要修改內容的寬度和高度,可是加寬了按鈕,按鈕內部的寬度也會加寬,若是想要內容的寬度保持不變,須要設置按鈕的內邊距。

contentEdgeInsets

  1. 將控制器的可見數組存儲cellFrame模型

注意:cell子控件的字體必須和cellFrame計算的字體保持一致。

  1. 建立cell模型
    1. 先將全部控件添加進去
    2. 給模型提供一個frame模型,重寫它的set方法,在這裏設置子控件顯示的內容和子控件的位置。
  2. 補全數據源和代理方法。

三.設計思想,若是一個方法許多類都須要用到,能夠把這個方法擴展爲一個分類。

四.QQ聊天佈局添加底部工具條思路

1.更換控制器爲普通的UIViewController

2.拖入UITableView進去

3.在拖入底部一個UIView進去,在拖入一個UIImageView3個按鈕進去。

4.監聽鍵盤彈出和退出的通知

5.在監聽彈出鍵盤的方法中挪動UIView的位置

6.監聽ScrollView滾動,在滾動的時候,退出鍵盤

7.在監聽退出鍵盤的方法中將UIView位置還原。

五.通知

某個對象發生一個事情時,經過通知中心,發送給其餘對象。

其餘對象必須主動監聽通知,才能監聽通知。

相關文章
相關標籤/搜索