?1. 不可變數組 轉變為可變數組數組中取數據
?2.獲取字符串長度
?3.將單獨的某個視圖上的視圖控制器的導航條隱藏
?4. //邊帽法 (拉伸圖片) 將某一像素點兒不斷地復制 其他像素點不變 拉伸之後不會是圖片變形
?5. 監聽系統發送的通知
?6.通過字符串繪制矩形 MAXFLOAT 無限
?7.視圖層級切換 .視圖的可交互性
?8.二進制數據轉變類型
?9.如何刪除一個視圖上的所有子視圖 所有代碼
?10.將某個視圖放在最前邊
?11.頁面跳轉(需要找window) . 導航控制器:push ,pop 模態彈出 :precent, dismiss
?12.將數據庫文件拷貝到沙盒中
?13:直接進入網頁 網頁加載
?14:將結構體轉換成字符串再輸出
?15: 角度轉弧度 . 獲取橢圓的 x y 坐標
?16: 交叉導入
?17: center + bounds = frame ;
?18: 查詢父視圖
?19.重新添加 xib 文件
?20.屏幕獲取觸摸對象
?21.判斷對象之間聯系常用的屬性
?22.獲取系統當前時間
?23. 分割(返回值類型 - 數組) . 拼接字符串 字符串去除空格
?24 .定時器 .延遲加載
?25 .文本框結束編輯的時候 讓鍵盤下去
?26:向相冊中保存圖片
?27.輸出當前所在的方法名:
?28.三目運算符
?29.在數組中隨機取出數據
?30.視圖修剪 .透明度 隱藏視圖 移除視圖
?31: 字符串拼接輸出控件屬性值
?32:第一響應
?33 .導航控制器相關控件內容
?34.彈框
?35. 九宮格
?36.布爾類型接判斷
?37.服務器 - 去掉out.println -- 句中的ln換行符
?38.如果URL中路徑的字符串拼接的時候 有中文 需要編碼
?39.獲取沙盒文件中某個文件夾下的所有內容 contentsOfDirectoryAtPath
?40 .獲取沙盒文件中某個文件的屬性
?41: 輸出對象的時候 設置輸出字符串格式 調用的方法
?42: 沙盒文件中路徑查找的便捷方式
?43: 對象序列化 歸檔
?44:強制數據及時存儲到沙盒
?44:NSUserDefaults儲存數據 (儲存輕量級的數據(賬號 密碼 是否登錄))
?45: NSUserDefaults 實戰中存取文件
?46:判斷某路徑下是否存在文件 是不是文件夾 關鍵詞 :fileExistsAtPath
?47 .網絡請求中網絡超時設置
?48. 單元格關鍵控件摘要
?49. btn 按鈕的失去響應
?50.在為URL添加字符串時 包含特殊字符或中文的 需要編碼轉換
?51.圖片轉化為二進制數據
?52.斷點下載個別屬性摘要
?53.OC中對用戶名和密碼編碼 和加密常用的方法 base64 MD5
?54.在web請求體重 截取某個字段
?55.判斷授權token 和 過期時間的兩種方式
?56.如果需要設置多個tag值時
?57.向上取整
?58.查找某個具體文件(eg:圖片)路徑的方法
?59.在導航條上添加控件
?60.視圖留白
?61.漢字轉拼音相關內容
?62.設備寬高宏定義
?63.給button按鈕添加背景圖片的時候 防止圖片變形的方法
//——————————————————詳細內容
1.不可變數組轉變為可變數組
//聲明實例變量的數組 必須記得實現
//對於遍歷數組找到對象後 如果還需要查找 記得先結束 再查找(return/break)
NSArray * arr = @[@"人在囧途",@"煎餅俠",@"西游記",];
NSMutableArray * arr = [NSMutableArrayarrayWithArray:arr];
//在數組中取數據的時候 需要通過後綴 將數組中的對象轉化為數字類
p11.age= [newArr[1]intValue];
2.獲取字符串長度
NSString * str = nameLabel .text;
CGSizesize= [strsizeWithAttributes:@{NSFontAttributeName: [UIFont systemFontOfSize:17]}];
此時即可得到size .width(字符串的寬 即 字符串長度)
3.將單獨的某個視圖上的視圖控制器的導航條隱藏
-(void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated == NO];
[self .navigationController setNavigationBarHidden:YES];
}
4. //邊帽法 (拉伸圖片) 將某一像素點兒不斷地復制 其他像素點不變 拉伸之後不會是圖片變形
UIImage * image =[[UIImage imageNamed:@"bubble.png"]stretchableImageWithLeftCapWidth:20 topCapHeight:20];
//再把得到的圖片賦給控件
bubbleImageView .image = image;
//圖片拉伸
UIImage* image =[UIImageimageNamed:@"7.jpg"];
[imageresizableImageWithCapInsets:UIEdgeInsetsMake(0, image.size.width, 0, 0)];
5. 監聽系統發送的通知
// 監聽鍵盤frame發生變化的通知 並可以通過鍵盤的屬性獲得對象
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(KeyboardWillChangeFrame:) name:UIKeyboardWillChangeFrameNotification object:nil];
-(void)KeyboardWillChangeFrame: (NSNotification *)noti
{
// NSLog(@"-------%@",noti.userInfo);
// UIKeyboardAnimationCurveUserInfoKey = 7;
// UIKeyboardAnimationDurationUserInfoKey = "0.25";
// UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {320, 216}}";
// UIKeyboardCenterBeginUserInfoKey = "NSPoint: {160, 588}";
// UIKeyboardCenterEndUserInfoKey = "NSPoint: {160, 372}";
// UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 480}, {320, 216}}";
// UIKeyboardFrameChangedByUserInteraction = 0;
// UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 264}, {320, 216}}";
//一旦鍵盤發生改變的時候 _inputView 和 _tableView 的坐標都要發生改變
//通過字典 獲取對象
NSDictionary * dic = noti .userInfo;
//獲取動畫時長
float time = [[dic objectForKey:UIKeyboardAnimationDurationUserInfoKey]floatValue];
//獲取動畫速率
int curve = [[dic objectForKey:UIKeyboardAnimationCurveUserInfoKey]intValue];
//獲取鍵盤坐標
CGRect rect = [[dic objectForKey:UIKeyboardFrameEndUserInfoKey]CGRectValue];
6.通過字符串繪制矩形 MAXFLOAT 無限
NSString * str = _chatArr[indexPath .row];
CGRect rect = [str boundingRectWithSize:CGSizeMake(200, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName: [UIFont systemFontOfSize:15]} context:nil];
7.視圖層級切換
關鍵點:
[self .window exchangeSubviewAtIndex:0 withSubviewAtIndex:1];
1.如果父視圖不可交互 那麼放在其上邊的子視圖也不可交互
2. 如果父視圖可以交互 那麼放在上邊的子視圖的可交互性由自己決定
關鍵詞 :userInteractionEnabled
image .userInteractionEnabled=YES;
8.二進制數據轉變類型
字符串轉變為二進制數據:
NSString * str =@"girls";
NSData * data =[str dataUsingEncoding:NSUTF8StringEncoding];
二進制數據轉變為字符串
NSString * str2 =[[NSString alloc]initWithData:data1 encoding:NSUTF8StringEncoding];
將圖片轉變為二進制數據
1.需要獲得圖片路徑 調用[ NSBundle main..]path…….
NSString * imageViewPath =[[NSBundle mainBundle]pathForResource:@"18" ofType:@"jpg"];
NSData * data =[[NSData alloc]initWithContentsOfFile:imageViewPath];
2.直接將添加在工程中的圖片轉化為二進制數據類型
UIImage* image =[UIImageimageNamed:@"20.jpg"];
NSData* data =UIImageJPEGRepresentation(image,1);
將轉變為二進制數據的圖片轉變回圖片
方法1 可以直接調用 從路徑中取出圖片
UIImage * image = [UIImage imageWithContentsOfFile:dataPath];
方法2 : 先將路徑中的二進制數據取出 然後 通過ImageWithData 屬性轉變為圖片類型
NSData * data =[NSData dataWithContentsOfFile:[self getFilePath:@"data.plist"]];
UIImage * image =[UIImage imageWithData:data];
9.如何刪除一個視圖上的所有子視圖 所有代碼:
獲取視圖上存放的所有子視圖 遍歷數組 找到所有對象 找到 views
NSArray * arr = _scrollerView.subviews;
for (UIImageView * imageView in arr) {
[imageView removeFromSuperview];
}
10.將某個視圖放在最前邊
[self .view bringSubviewToFront:_tableView];
11.頁面跳轉(需要找window)
//找window
方法1:
UIWindow * window =[[[UIApplication sharedApplication]delegate]window];
window .rootViewController = aViewController;
方法2:
UIApplication* app = [UIApplicationsharedApplication];
AppDelegate* delegate = app .delegate;
UIWindow* window = delegate .window;
window .rootViewController= aViewController;
1.頁面翻轉
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1];
[UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:window cache:YES];
[UIView commitAnimations];
2. 模態彈出 (present 展示 dismiss 消失 )
3. 導航控制器 (push 壓棧 pop 出棧 )
//通過導航控制器控制視圖切換的時候
1. 返回上一界面:
[self.navigationControllerpopViewControllerAnimated:YES];
2. 返回根視圖控制器:
[self.navigationControllerpopToRootViewControllerAnimated:YES];
3.返回指定視圖:
//首先獲取目前所有的視圖控制器對象
NSArray* arr =self.navigationController.viewControllers;
//從數組中找到需要返回的根視圖
FirestViewController* first = arr[0];
//返回指定視圖:
[self.navigationControllerpopToViewController:firstanimated:YES];
12.將數據庫文件拷貝到沙盒中
//首先需要獲取數據庫文件的路徑還有文件夾路徑
NSString * sourePath = [[NSBundle mainBundle]pathForResource:@"database" ofType:@"sqlite"];
if (![[NSFileManager defaultManager] fileExistsAtPath:[self filePath]])
{
NSError * error = nil;
if ( [[NSFileManager defaultManager]copyItemAtPath:sourePath toPath:[self filePath] error:&error]) {
NSLog(@"copy成功");
}
}
13:直接進入網頁
//網頁加載 :
//創建url NSURL: NSObject用來表示資源在互聯網的位置
NSURL * url = [NSURL URLWithString:@"http://www.baidu.com"];
//創建一個請求
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//加載請求
[webView loadRequest:request];
[[UIApplication sharedApplication]openURL:[NSURL URLWithString:@"http//www.baidu.com"]];
14:將結構體轉換成字符串再輸出
NSLog(@"-------%@",NSStringFromCGRect(rect));
15:角度轉弧度
可以定義為宏#define ANGLE_2_HUDU(X) (X)*M_PI/180.0
計算圓形軌跡上控件的中心點坐標時
中心點 圓的半徑 角度轉弧度 角度值
floatx = 160 + 100 *cos(ANGLE_2_HUDU(btn.angle));
floaty = 240 + 100 *sin(ANGLE_2_HUDU(btn .angle));
//x = 中心點x + 半徑 * cos@
//y = 中心點y + 半徑 *sin@
16:交叉導入
//為了防止交叉導入 @class 文件
//只是告訴了編譯器有這個類 但是該類的.h文件中有什麼東西 編譯器是不知道的 當真正需要使用這個類的時候 還必須在.m 文件 中導入#import "TwoViewController.h”這個頭文件
17: center + bounds = frame ;
//center(設置中心點) + bounds(設置寬.高) = frame;
image .center = CGPointMake(160, 120);
//bounds (x,y ,width ,height ),前兩個值x,y是無效的
image .bounds = CGRectMake(0, 0, 160, 120);
18:查詢父視圖
NSLog(@"==%@",image.superview);
查看view的子視圖
NSLog(@"==%@",self .window .subviews);
19.重新添加xib文件
如果創建的xib 文件的名字不同 需要在入口方法中調用一下方法
ViewController * vc = [[ViewController alloc]initWithNibName:@"Empty" bundle:nil];
20.屏幕獲取觸摸對象
//調用的方法:
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
// NSSet集合(容器)
//獲取觸摸對象
UITouch * touch =[touches anyObject];
//獲取觸摸對象在某一視圖上的一個點
CGPoint point = [touch locationInView:self .view];
//把結構體轉換為字符串輸出
NSLog(@"---%@",NSStringFromCGPoint(point));
//CGRectContainsPoint作用 :判斷CGRect 數據是否包含一個點point如果包含這個點函數值就是1
//類似屬性CGRectIntersectsRect(<#CGRect rect1#>, <#CGRect rect2#>)判斷兩個坐標是否有交集
//NO1.觸摸對象坐標 NO2.結構體
if (CGRectContainsPoint(_mainPlane .frame,point)) {
_mainPlane.center = point;
}
21:判斷對象之間聯系常用的屬性
1.判斷某個對象坐標時候包含某個點
CGRectContainsPoint(_mainPlane .frame,point)
2. 判斷兩個坐標是否有交集
CGRectIntersectsRect(<#CGRect rect1#>, <#CGRect rect2#>)
3.判斷兩個對象時候相等的時候
isEqualToString:<#(NSString *)#>
4. 判斷字符串類型數據長度的時候 需要調用length
22.獲取系統當前時間
NSDate * date = [NSDate date];
NSDateFormatter * formatter = [[NSDateFormatter alloc]init];
[formatter setDateFormat:@"yy-MM-dd HH-mm-ss"];
NSString *str = [formatter stringFromDate:date];
NSLog(@"-=-=-=-=-=-=-===%@",str);
時間格式年yyyy月MM日dd小時 HH 分鐘 mm 秒 ss
-
23. 分割(返回值類型 - 數組) . 拼接字符串
//分割:
NSArray * arr =[str componentsSeparatedByString:@" "];
//字符串之間用什麼隔開 分割時 在@“” 中就調用什麼 (eg: | 空格 等);
//拼接:
[NSString stringWithString:@"<#string#>"]
[NSString stringWithFormat:@"<#string#>"]
去掉字符串中間的空格
return [self stringByReplacingOccurrencesOfString:@" " withString:@""];
去掉字符串的換行符
str =[str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
24 .定時器 .延遲加載
//定時器開啟的時候 為防止點擊按鈕時開啟多個定時器造成混亂 所以在開啟定時器的時候可以先判斷時候有開啟定時器
方法1:
static BOOL isOk;
if (isOk == NO) {
_timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(onTimer) userInfo:nil repeats:YES];
//開啟定時器後 如果想要定時器立即開啟 可以調用
[_timer fire];
isOk = YES;
}
方法2 :
if (_timer) {
return;
}
_timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(onTimer) userInfo:nil repeats:YES];
//關閉定時器時 記得立即將其指為空
[_timer invalidate];
_timer = nil;
//定時器綁定方法的時候只能講自身傳過來
_timer= [NSTimerscheduledTimerWithTimeInterval:0.05target:selfselector:@selector(onTimer:)userInfo: buttonrepeats:YES];
-(void)onTimer: (NSTimer*)aTimer
{
//通過userInfo 獲取點擊的按鈕
ZYButton* clickBtn = aTimer.userInfo;
}
延遲加載 要點 需要調用performSelector
[selfperformSelector:@selector(參數)withObject:nilafterDelay:5];
25 .文本框結束編輯的時候 讓鍵盤下去
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self .window endEditing:YES];
}
26:向相冊中保存圖片
UIImageWriteToSavedPhotosAlbum([UIImage imageNamed:@"20.jpg"], self, @selector(image:didFinishSavingWithError:contextInfo:), NULL);
必要實現的協議方法
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo
{
}
27.輸出當前所在的方法名:
NSLog(@"-----%s---",__func__);
28.三目運算符
條件 ?(執行操作) : 其它操作
列: number = i <= 8 ?(i + 1) : 0 解釋 : 當i 小於等於8 時 執行 i+1 的操作 否則 執行冒號後面的操作 即 i = 0;
29.在數組中隨機取出數據
1) 首先先在數組中隨機出一個索引
int random = arc4random()%numberArray .count;
2) 將取出的數據轉化為想要的類型
int number = [numberArray [random]intvalue];
3) 將取出的數據在數組中刪除 以防止隨機重復
[numberArray removeObjectAtIndex : random];
30.視圖修剪 .透明度 隱藏視圖 移除視圖 :
clip 修剪 bounds 邊界
1.是否對視圖修剪
bigView .clipsToBounds=YES;
2.設置圓角半徑
bigView .layer.cornerRadius= 90;
bigView.layer.masksToBounds=YES;
3.透明度:
_view .alpha = 0;
4.移除視圖 :
[_view removeFromSuperview];
31: 字符串拼接輸出控件屬性值
NSLog(@" = %@",NSStringFromCGRect(nav.navigationBar.frame));
32:第一響應:
1.打開程序時 文本框處於編輯狀態 即 第一響應
成為第一響應 [_textfieldbecomeFirstResponder];
失去第一響應[_textfield resignFirstResponder];
2.在tocubegin協議方法中調用
self .window ending
33 .導航控制器相關控件內容
1.設置導航條的背景顏色
錯誤做法:nav .navigationBar.backgroundColor= [UIColorgrayColor];
正確做法:nav .navigationBar.barTintColor= [UIColorgrayColor];
2.設置導航條標題
self.title=@"導航條";
3. 設置左右欄按鈕項 (記得按鈕綁定方法的實現)
UIBarButtonItem* lifeItem = [[UIBarButtonItemalloc]initWithTitle:@"保存"style:UIBarButtonItemStylePlaintarget:selfaction:(@selector(baoCunBtnClick:))];
self.navigationItem.leftBarButtonItem= lifeItem;
UIBarButtonItem* rightItem = [[UIBarButtonItemalloc]initWithTitle:@"添加分組"style:UIBarButtonItemStylePlaintarget:self action:(@selector(addGrounpBtnClick:))];
self.navigationItem.rightBarButtonItem= rightItem;
4.隱藏導航條 :
//注意: 隱藏導航條的時候 不能混著用 怎麼讓導航條隱藏的 就怎麼讓導航條出現 :
方法1:
[self.navigationControllersetNavigationBarHidden:YES];
[self.navigationControllersetNavigationBarHidden:YESanimated:YES];
方法2:
self.navigationController.navigationBarHidden=YES;
self.navigationController.navigationBarHidden=NO;
補充 : 在視圖將要顯示的時候 隱藏導航條 :
-(void)viewWillAppear:(BOOL)animated
{
[superviewWillAppear:animated];
[self.navigationControllersetNavigationBarHidden:YES];
}
5.設置導航條按鈕項時候添加圖片 (圖片渲染)
UIImage* image = [[UIImageimageNamed:@"back"]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
UIBarButtonItem* backBar = [[UIBarButtonItemalloc]initWithImage:imagestyle:UIBarButtonItemStylePlaintarget:selfaction:@selector(backClick)];
self.navigationItem.leftBarButtonItem= backBar;
tImgView.contentMode=UIViewContentModeScaleAspectFit;//設置內容樣式,通過保持長寬比縮放內容適應視圖的大小,任何剩余的區域的視圖的界限是透明的
///按鈕設置背景圖片時 設置背景圖片大小 防止圖片變形
UIImage*btnImg =[UIImageimageNamed:[NSStringstringWithFormat:@"button_table_%d",i]];
UIImage* bbImg =[btnImgstretchableImageWithLeftCapWidth:100topCapHeight:100];
6. 隱藏導航條自定義的返回按鈕 :
self.navigationItem.hidesBackButton=YES;
7.導航條上添加控件
self..navigationItem..titleView =控件對象=filed;
34.彈框
樣式1: UIAlertView
UIAlertView *alertView =[[UIAlertView alloc]initWithTitle:@"提示" message:@"新建聯系人" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"確定", nil];
//彈框樣式:(帶輸入框)
alertView.alertViewStyle =UIAlertViewStyleLoginAndPasswordInput;
UITextField *field1 =[alertView textFieldAtIndex:0];
UITextField *field2 =[alertView textFieldAtIndex:1];
field1.placeholder =@"請輸入姓名";
field2.placeholder =@"請輸入電話";
field2.secureTextEntry=NO;
[alertView show];
//實現 alertView 首先在.h文件中 實現協議
實現協議方法:
-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex;
//通過buttonIndex 的索引值 判斷點擊的是哪個按鈕 0 ,1
樣式2:ActionSheet
//ActionSheet 不可以在viewDidLoad 方法中創建 這是因為 ActionSheet 是在self .view 上展示的 此時我們的viewDidLoad 方法還沒有走完 我們的self.view 就不能展示出來 self.view 還沒有展示 那麼我們放在self.view上的actionsheet 也就無法展示
UIActionSheet* actionSheet = [[UIActionSheetalloc]initWithTitle:@"提示"delegate:selfcancelButtonTitle:@"取消"destructiveButtonTitle:@"確定"otherButtonTitles:nil,nil];
[actionSheetshowInView:self.view];
7.設置cell的背景顏色
-(void)tableView:(UITableView*)tableView willDisplayCell:(UITableViewCell*)cell forRowAtIndexPath:(NSIndexPath*)indexPath
{
[cellsetBackgroundColor:[UIColorblackColor]];
}
35. 九宮格
//九宮格
方法1:嵌套for循環
for (int a = 0 ; a <2; a ++) {
for (int b = 0 ; b < 3 ; b++) {
UIButton * btn = [UIButton buttonWithType:UIButtonTypeSystem];
btn .backgroundColor = [UIColor redColor];
btn .frame = CGRectMake(30 + (320-70)*a, 80 + (60 + 40) * b, 40, 40);
[self .view addSubview:btn];
}
}
//方法2 .單個for循環
//三行三列
for (int a = 0; a < 9 ; a ++) {
float jiange = (320 - 40 *3)/4;
int x = a%3;
int y = a/3;
UIButton * btn = [UIButton buttonWithType:UIButtonTypeSystem];
btn .backgroundColor = [UIColor redColor];
btn .frame =CGRectMake(jiange + (40 + jiange) *x, jiange + (40 + jiange) * y, 40, 40);
36.直接在輸出中判斷布爾類型
n.sex?@"男鳥":@"女鳥"
37.服務器 - 去掉out.println --句中的ln換行符
str =[str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
38.如果URL中路徑的字符串拼接的時候 有中文 需要編碼
NSString*encodingString = [pathstringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
39.獲取沙盒文件中某個文件夾下的所有內容 contentsOfDirectoryAtPath
NSString*filePath =[NSHomeDirectory()stringByAppendingPathComponent:@"Documents"];
//返回值類型是數組
NSArray*arr = [F_McontentsOfDirectoryAtPath:filePatherror:nil];
NSLog(@"arr===%@",arr);
40 .獲取沙盒文件中某個文件的屬性
NSString*filePath =[NSHomeDirectory()stringByAppendingPathComponent:@"Documents/str.plist"];
//返回值類型是字典 所以我們可以通過字典內的鍵值 取出我們想要的數據
NSDictionary*dic = [F_MattributesOfItemAtPath:filePatherror:nil];
unsignedlonglongsize= [dicfileSize];
NSLog(@"----%llu",size);
// NSLog(@"dic====%@",dic);
41:輸出對象的時候設置輸出字符串格式調用的方法
//輸出對象的時候 會調用該對象的description 方法
-(NSString*)description
{
return[NSStringstringWithFormat:@"IP-----%p name----%@ age-----%d",self,self.name,self.age];
}
42:沙盒文件中路徑查找的便捷方式
1.獲取根目錄文件路徑
NSLog(@"-----%@",NSHomeDirectory());
2.獲取臨時文件路徑方法類似於獲取根目錄文件路徑
NSString* temp =NSTemporaryDirectory();
3.獲取資源包路徑
NSString *appPath = [[NSBundlemainBundle]bundlePath];
4.獲取某圖片或文件夾路徑
NSString * imageViewPath =[[NSBundle mainBundle]pathForResource:@"18" ofType:@"jpg"];
5.獲取某目錄下的文件—>文件路徑
NSDictionary * dic =[[NSFileManager defaultManager]attributesOfItemAtPath:[self getPath] error:nil];
43:對象序列化 歸檔
步驟 :
1. 創建可變的data (相當於一個空的袋子 )
NSMutableData* data= [[NSMutableDataalloc]initWithCapacity:0];
2.歸檔 關鍵詞 : archiver
NSKeyedArchiver* archiver = [[NSKeyedArchiveralloc]initForWritingWithMutableData:data];
3.編碼 : (就是將對象類轉變為二進制數據的過程)
[archiver encodeObject:_arr];
//如果有多個對象的時候 通過 設置 key值來區分
[archiverencodeObject:_arrforKey:@"arr"];
[archiverencodeObject:_viewforKey:@"view"];
4.結束編碼的時候 必須調用 接收方法 (完成編碼)
[archiverfinishEncoding];
5.可以將轉變為二進制數據類型的 對象類寫入沙盒中
[datawriteToFile: [selfgetFilePath]atomically:YES];
反序列化 (將二進制數據類型 轉換為對象類)
1. 在沙盒中取出data數據
NSData* data = [[NSDataalloc]initWithContentsOfFile:[selfgetFilePath]];
2.將取出的數據交給反序列化來讀
NSKeyedUnarchiver* unarchiver = [[NSKeyedUnarchiveralloc]initForReadingWithData:data];
3.解碼
NSArray * arr = [unarchiver decodeObject];
//如果有多個對象 (如上)
NSArray* arr = [unarchiverdecodeObjectForKey:@"arr"];
4.結束解碼 :
[unarchiverfinishDecoding];
補充 : 為了調取路徑方法方便 可以將獲取路徑封裝成方法 便於調用
-(NSString*)getFilePath
{
return[NSHomeDirectory()stringByAppendingPathComponent:@"Documents/arr.plist"];
2.自定義對象轉碼的時候
1. 需要在.h文件中必須實現的協議
2.在.m 文件中必須實現的兩個方法
//將people類中的屬性進行編碼
//aCoder 編碼器
//當用序列化器編碼對象的時候 , 該方法就會被調用
-(void)encodeWithCoder:(NSCoder*)aCoder
{
NSLog(@"3333333333");
[aCoderencodeObject:_nameforKey:@"name"];
[aCoderencodeInt:_ageforKey:@"age"];
}
//解碼
//aDecoder 解碼器
//反序列化時 將NSData 解碼成對象類型調用的方法
-(id)initWithCoder:(NSCoder*)aDecoder
{
//任意類型 初始化[super init] 方法
self= [superinit];
if(self) {
//需要 self.屬性 接收
self.name= [aDecoderdecodeObjectForKey:@"name"];
self.age= [aDecoderdecodeIntForKey:@"age"];
}
returnself;
}
補充 : 如果再創建一個類 繼承與自定義people類時
實現第二個協議方法時 (返回值為id 的協議方法 ) 需要先繼承父類方法 即:
-(id)initWithCoder:(NSCoder*)aDecoder
{
self= [superinitWithCoder:aDecoder];
if(self) {
[aDecoderdecodeObjectForKey:@"huzi"];
}
returnself;
}
快速轉碼 :
1.直接將對象放在沙盒中
[NSKeyedArchiverarchiveRootObject:_arrtoFile:[selfgetFilePath]];
2. 在反序列化中直接取出對象
NSArray* arr = [NSKeyedUnarchiverunarchiveObjectWithFile:[selfgetFilePath]];
44:NSUserDefaults儲存數據 (儲存輕量級的數據(賬號 密碼 是否登錄))
//1.NSUserDefaults 可以存儲的數據類型 : NSString 字典 數組 NSNumber BOOL NSData(二進制數據) NSDate(時間) int(integer) Double float URL(網址)
//2.強制數據及時存儲到沙盒
//userDefaults向沙盒中儲存數據是按照一定的時間戳定時儲存數據如果數據還沒來得及存儲而此時程序出現問題那麼數據就會丟失所以我們可以同步一下強制數據及時存儲到沙盒
//synchronize同步保證數據及時的儲存到沙盒中
[userDefaults synchronize];
45: NSUserDefaults實戰中存取文件
存數據:
[[NSUserDefaults standardUserDefaults]setObject:_nameField.text forKey:@"name"];
[[NSUserDefaults standardUserDefaults]setObject:_pswField.text forKey:@"psw"];
//同步數據
[[NSUserDefaults standardUserDefaults]synchronize];
取數據:
NSString * nameString = [[NSUserDefaults standardUserDefaults]objectForKey:@"name"];
NSString * pswString =[[NSUserDefaults standardUserDefaults]objectForKey:@"psw"];
46:判斷某路徑下是否存在文件 是不是文件夾 關鍵詞 :fileExistsAtPath
NSString*filePath1 =[NSHomeDirectory()stringByAppendingPathComponent:@"Documents/str.plist"];
NSString*filePath2 =[NSHomeDirectory()stringByAppendingPathComponent:@"Documents/ABC"];
BOOLisDirectory ;
BOOLisExist= [F_MfileExistsAtPath:filePath2isDirectory:&isDirectory];
if(isExist==YES) {
NSLog(@"存在文件");
if(isDirectory==YES) {
NSLog(@"是個文件夾");
}else{
NSLog(@"不是文件夾");
}
}else{
NSLog(@"不存在文件");
}
47 .網絡請求中網絡超時設置
request .timeoutInterval = 10;
48.單元格關鍵控件摘要
1.分割線顏色樣式:
tableVew .separatorColor=[UIColorredColor];
tableVew .separatorStyle=UITableViewCellSeparatorStyleNone;
2.單元格背景View 可以設置圖片 下拉的時候顯示
tableVew .backgroundView=imageView;
3.單元格表頭背景View可以設置圖片因為需要設置坐標可以通過封裝方法然後在ViewDidLoad 方法中調用
tableVew.tableHeaderView=imageView;
4.視圖修剪
cell.imageView.layer.cornerRadius=50;
cell.imageView.layer.masksToBounds=YES;
5.cell小掛件
cell .accessoryType=UITableViewCellAccessoryDetailButton;
6.點擊單元格時候的樣式:
cell .selectionStyle=UITableViewCellSelectionStyleNone;
7.如果想把單元格的白色背景去掉的話 需要將tableView 和cell 上的背景顏色都設置為clearColor
8.點擊單元格上的按鈕時候在按鈕綁定的方法中找到點擊的是哪一行上的按鈕需要通過按鈕找到cell 再通過cell 找到IndexPath
eg:
UITableViewCell* cell =(UITableViewCell*)btn.superview.superview;
NSIndexPath* indexPath =[_tableViewindexPathForCell:cell];
9.區頭區尾相關內容
//也需要重用
區頭和區尾的設置中 相關的控件設置和添加需要放在view .contentView
e.g:
1.view .contentView.backgroundColor= [UIColorgrayColor];
2.[view.contentViewaddSubview:img];
10.單元格索引:
將索引標示放在數組中
eg:
self.arr= @[@"A",@"B",@"C",@"D",@"E",@"F",@"G",@"H",@"I",@"J",@"K",@"L",@"M",@"N",@"O",@"P",@"Q",@"R",@"S",@"T",@"U",@"V",@"W",@"X",@"Y",@"Z",@"#",];
區索引調用的方法:
-(NSArray*)sectionIndexTitlesForTableView:(UITableView*)tableView
{
return_arr;
}
49. btn按鈕的失去響應
btn .enabled = NO;
//默認值 YES
btn.enabled = YES;
50.在為URL添加字符串時 包含特殊字符或中文的 需要編碼轉換
string =[string stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
51.圖片轉化為二進制數據
//一下的兩種方法都可以 但是 PNG的返回的圖片量與原圖大小差不多 而jpg 的 會壓縮參數
// NSData * data =UIImagePNGRepresentation(self.imageView.image);
//NSData * data =UIImageJPEGRepresentation(self.imageView.image, 0.00001);
52.斷點下載個別屬性摘要
1. 獲取已經下載文件的大小 文件較大的時候 可以用long long 創建實例變量
_receiveSize =[dic fileSize];
2.通過Range 頭 —> 可以指定每次從網上下載數據包的大小
[request addValue:[NSString stringWithFormat:@"bytes=%lld-",_receiveSize] forHTTPHeaderField:@"Range"];
3.期望從服務器中返回的剩余的數據expectedContentLength
long long lastSize = response.expectedContentLength;
4.受到響應的時候 需要創建對象 並給對象一個寫文件的路徑
_fileHandle = [NSFileHandle fileHandleForWritingAtPath:[self getPath]];
//找到已經下載文件的結尾數據
[_fileHandle seekToEndOfFile];
//寫入數據
[_fileHandle writeData:data];
//開始在接受數據的協議方法中不斷的追加數據
_receiveSize +=[data length];
5.下載進度賦值到進度條
//當前下載比例=接收數據/總數據
float progress =(float) _receiveSize /_totalSize;
self.weak.progress = progress;
self .persentLabel.text = [NSString stringWithFormat:@"%.2f%%",progress*100];
6.暫停數據綁定的方法中 暫停請求數據 同時將請求數據指為空 (類似於定時器)
[_connection cancel];
_connection = nil;
53.OC中對用戶名和密碼編碼和加密常用的方法 base64 MD5
//在需要加密內容的後面添加後綴
eg: _nameField.textbase64EncodedString編碼
_nameField.textbase64DecodedString解碼
_pswField.textMD5加密
54.在web請求體重 截取某個字段
eg:@"https://api.weibo.com/oauth2/authorize?client_id=1950801855&response_type=code&redirect_uri=http://www.baidu.com"該請求體中的code
NSRangerange =[request.URL.absoluteStringrangeOfString:@"code="];
NSString* code =[[request.URL.absoluteStringcomponentsSeparatedByString:@"="]lastObject];
55.判斷授權token 和 過期時間的兩種方式 :
//方式1:
NSString* token =[[NSUserDefaultsstandardUserDefaults]objectForKey:@"token"];
NSDate* time =[[NSUserDefaultsstandardUserDefaults]objectForKey:@"time"];
if(token ==nil||[tokenisEqualToString:@""]) {
returnNO;
}
if([[NSDatedate]compare:time]!=NSOrderedAscending) {
returnNO;
}
returnYES;
//方式2:
NSString* token = [[NSUserDefaultsstandardUserDefaults]objectForKey:@"token"];
//過期時間
NSDate* date = [[NSUserDefaultsstandardUserDefaults]objectForKey:@"date"];
if(token ==nil||[tokenisEqualToString:@""]) {
returnNO;
}
//當前時間
NSDate* currentDate =[NSDatedate];
//當前時間和過期時間對比
if([[currentDatelaterDate:date]isEqualToDate:currentDate]) {
returnNO;
}
returnYES;
56.如果需要設置多個tag值時
//一般設置tag值只需要設置為數字進行區分的話 就可以 但是如果接口較多 需要區分的話 單獨的設置為數字 時間久的話 不好辨認 所以我們可以模仿系統 來寫出一個枚舉來
eg:// NSInteger指的是枚舉中值的類型RequestType總的請求類型
typedefNS_ENUM(NSInteger, RequestType)
{
GetTokenRequestTag = 0,
GetStatusListRequestTag
需要再往下寫的時候 不需要設置數字就可以 因為系統會自動遞增
};
調用時:
對象.tag =GetTokenRequestTag;
57.向上取整
//首先可以先獲取矩形高度然後向上取整eg:
CGRectrect =[stringboundingRectWithSize:CGSizeMake(310,MAXFLOAT)options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeadingattributes:@{NSFontAttributeName: [UIFontsystemFontOfSize:17]}context:nil];
//向上取整
returnceilf(rect.size.height);
58.查找某個具體文件(eg:圖片)路徑的方法
NSString* directoryPath =[NSHomeDirectory()stringByAppendingPathComponent:@"Documents/ImageCache"];
//保證沙盒中的Documents中一定有一個ImageCache文件夾
if(![[NSFileManagerdefaultManager]fileExistsAtPath:directoryPath]) {
[[NSFileManagerdefaultManager]createDirectoryAtPath:directoryPathwithIntermediateDirectories:YESattributes:nilerror:nil];
}
//把圖片的地址字符串分割最後一個/之後的那段就是圖片的名字
NSString* fileName =[[urlStringcomponentsSeparatedByString:@"/"]lastObject];
NSString* filePath =[NSStringstringWithFormat:@"%@/%@",directoryPath,fileName];
returnfilePath;
59.在導航條上添加UI控件
self.navigationItem.titleView=segment;
60.視圖留白
self.automaticallyAdjustsScrollViewInsets=NO;
61.漢字轉為拼音相關內容
//城市列表通訊錄右邊索引字母或者拼音如何的到
NSMutableString* hanzi =[[NSMutableStringalloc]initWithString:@"中華人民共和國重慶長城單家莊"];
CFMutableStringRefhanziRef =(__bridgeCFMutableStringRef)hanzi;
//CFStringTransform字符串轉化
//kCFStringTransformMandarinLatin漢字轉拼音
//kCFStringTransformStripDiacritics拼音去音標
CFStringTransform(hanziRef,0,kCFStringTransformMandarinLatin,NO);
NSLog(@"---%@",hanziRef);
CFStringTransform(hanziRef,0,kCFStringTransformStripDiacritics,NO);
NSLog(@"111---%@",hanziRef);
62.設備寬高宏定義
#define DEVICE_WIDTH [UIScreen mainScreen].bounds.size.width
#define DEVICE_HEIGHT [UIScreen mainScreen].bounds.size.height
63: 給button 按鈕設置背景圖片時 設置背景圖片大小 防止圖片變形
UIImage*btnImg =[UIImageimageNamed:[NSStringstringWithFormat:@"button_table_%d",i]];
UIImage* bbImg =[btnImgstretchableImageWithLeftCapWidth:100topCapHeight:100];
[btnsetBackgroundImage:bbImgforState:UIControlStateNormal];
64: 異常處理
AppDelegate .m 文件
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
//輸出模擬器類型
NSLog(@"%@",[[UIDevicecurrentDevice]model]);
//綁定撲捉異常的函數當程序崩潰時會先調用這個函數
NSSetUncaughtExceptionHandler(&getException);
returnYES;
}
voidgetException(NSException*exception){
//遇到特殊情況時需要把異常的具體信息獲取並儲存
NSLog(@"名字----%@",exception.name);
NSLog(@"原因----%@",exception.reason);
NSLog(@"用戶信息----%@",exception.userInfo);
NSLog(@"棧內存地址----%@",exception.callStackReturnAddresses);
NSLog(@"棧描述----%@",exception.callStackSymbols);
NSString*string = [NSStringstringWithFormat:@"名字%@,原因%@,信息%@,棧內存地址%@,棧描述%@",exception.name,exception.reason,exception.userInfo,exception.callStackReturnAddresses,exception.callStackSymbols];
NSLog(@"%@",string);
NSDate*date = [NSDatedate];
//當前的系統版本號
NSString* verSion =[[UIDevicecurrentDevice]systemVersion];
//當前設備型號
[[UIDevicecurrentDevice]model];
//儲存崩潰信息
NSString* path =[NSHomeDirectory()stringByAppendingPathComponent:@"Library/exception.txt"];
[stringwriteToFile:pathatomically:YESencoding:NSUTF8StringEncodingerror:nil];
//當程序再次啟動時把崩潰信息發送給服務器
}
65:去除掉首尾的空白字符和換行字符
NSString* headerData=***;
headerData = [headerData stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; //去除掉首尾的空白字符和換行字符
headerData = [headerData stringByReplacingOccurrencesOfString:@"\r" withString:@""];
headerData = [headerData stringByReplacingOccurrencesOfString:@"\n" withString:@""];
66:為視圖view自定義矩形大小
self.edgesForExtendedLayout=UIRectEdgeNone;
CGRectviewBounds =self.view.bounds;
floatnavBarHeight =self.navigationController.navigationBar.frame.size.height+ 20;
viewBounds.size.height= ([[UIScreenmainScreen]bounds].size.height) - navBarHeight;
self.view.bounds= viewBounds;
67: 根據圖片的大小設置按鈕的大小 ..