通知中心(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:通知發佈者。若是爲anObject和aName都爲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,好比iPod、iPhone等)、設備的系統(systemVersion)
經過[UIDevice currentDevice]能夠獲取這個單粒對象
UIDevice對象會不間斷地發佈一些通知,下列是UIDevice對象所發佈通知的名稱常量:
UIDeviceOrientationDidChangeNotification // 設備旋轉
UIDeviceBatteryStateDidChangeNotification // 電池狀態
UIDeviceBatteryLevelDidChangeNotification // 電池電量
UIDeviceProximityStateDidChangeNotification // 近距離傳感器(好比設備貼近了使用者的臉部)
1、URL
1.什麼是URL?
URL是某個資源的惟一路徑,經過這個路徑就能訪問對應的資源
2.URL的組成
協議頭://全路徑
* 協議頭就表明資源的類型,好比http表明網絡服務器資源,ftp表明ftp文件服務器資源,file表明本地資源
3.舉例
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內部默認有個UIImageView、UILabel控件,能夠分別用下面屬性訪問:
@property(nonatomic,readonly,retain) UIImageView *imageView;
@property(nonatomic,readonly,retain) UILabel *titleLabel;
2> UIButton之因此能顯示文字,徹底是由於它內部的titleLabel
也就是說,UIButton的setTitle:forState:方法設置的字符串就是顯示到了titleLabel上
3> UIButton的setImage: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聊天佈局
1.技術點:
1.1聊天列表
UITableView
自定義UITableViewCell (兩個按鈕,一個UIImageView)
1.1底部工具條
3.1帶有中文的路徑須要轉碼
3.2拼接URL須要添加協議頭
3.2 自動拼接文件協議頭的方法
3.3 經過程序主包加載URL
3.4 將plist文件解析成數組
7.1 若是上下兩條消息時間相同,下一條消息不須要計算時間的frame,並且cell的高度也須要減少,怎麼作才能一箭雙鵰了,能夠給frame模型添加一個BOOL類型屬性,判斷是否計算時間,若是不計算時間,意味着時間frame的最大y值爲0,頭像的y值就是一個邊距了跟時間無關了,這樣cell的高度也弄好了,cell的高度是跟頭像或者內容的最大y值相關的。
而這個BOOL類型的屬性在哪賦值了,應該在將字典轉換成消息模型的地方,根據上下兩條消息時間判斷是否應該計算時間frame。
7.2根據message模型中的type改變頭像和內容的x值
7.3按鈕的寬度和高度,根據內容決定的,若是想更改按鈕的寬度和高度,咱們只須要修改內容的寬度和高度,可是加寬了按鈕,按鈕內部的寬度也會加寬,若是想要內容的寬度保持不變,須要設置按鈕的內邊距。
contentEdgeInsets
注意:cell子控件的字體必須和cellFrame計算的字體保持一致。
1.更換控制器爲普通的UIViewController。
2.拖入UITableView進去
3.在拖入底部一個UIView進去,在拖入一個UIImageView,3個按鈕進去。
4.監聽鍵盤彈出和退出的通知
5.在監聽彈出鍵盤的方法中挪動UIView的位置
6.監聽ScrollView滾動,在滾動的時候,退出鍵盤
7.在監聽退出鍵盤的方法中將UIView位置還原。
某個對象發生一個事情時,經過通知中心,發送給其餘對象。
其餘對象必須主動監聽通知,才能監聽通知。