CGRect
CGRect frame = CGRectMake (origin.x, origin.y, size.width, size.height);矩形NSStringFromCGRect(someCG) 把 CGRect 結構轉變爲格式化字符串; CGRectFromString(aString) 由字符串恢復出矩形;
CGRectInset(aRect) 建立較小或較大的矩形(中心點相同),+較小 -較大 CGRectIntersectsRect(rect1, rect2) 判斷兩矩形是否交叉,是否重疊 CGRectZero 高度和寬度爲零的/位於(0,0)的矩形常量
CGPoint & CGSize
CGPoint aPoint = CGPointMake(x, y); CGSize aSize = CGSizeMake(width, height);
設置透明度
[myView setAlpha:value]; (0.0 < value < 1.0)
設置背景色
[myView setBackgroundColor:[UIColor redColor]];
(blackColor;darkGrayColor;lightGrayColor; whiteColor;grayColor; redColor; greenColor; blueColor; cyanColor;yellowColor; magentaColor;orangeColor;purpleColor; brownColor; clearColor; )
自定義顏色
UIColor *newColor = [[UIColor alloc]
initWithRed:(float) green:(float) blue:(float) alpha:(float)];
0.0~1.0
豎屏
320X480
橫屏
480X320
狀態欄高 (顯示時間和網絡狀態) 20 像素
導航欄、工具欄高(返回) 44 像素
隱藏狀態欄
[[UIApplication shareApplication] setStatusBarHidden: YES animated:NO]
橫屏
[[UIApplication shareApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight].
屏幕變更檢測
orientation == UIInterfaceOrientationLandscapeLeft
全屏
window=[[UIWindow alloc] initWithFrame:[UIScreen mainScreen] bounds];
自動適應父視圖大小:
aView.autoresizingSubviews = YES;
aView.autoresizingMask = (UIViewAutoresizingFlexibleWidth |
UIViewAutoresizingFlexibleHeight);
定義按鈕
UIButton *scaleUpButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; [scaleUpButton setTitle:@"放 大" forState:UIControlStateNormal]; scaleUpButton.frame = CGRectMake(40, 420, 100, 40);
[scaleUpButton addTarget:self
action:@selector(scaleUp) forControlEvents:UIControlEventTouchUpInside];
設置視圖背景圖片
UIImageView *aView;
[aView setImage:[UIImage imageNamed:@」name.png」]]; view1.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed:@"image1.png"]];
活動表單
<UIActionSheetDelegate>
- (IBActive) someButtonPressed:(id) sender {
UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@」Are you sure?」
delegate:self
cancelButtonTitle:@」No way!」 destructiveButtonTitle:@」Yes, I’m Sure!」 otherButtonTitles:nil];
[actionSheet showInView:self.view];
[actionSheet release]; }
警告視圖
<UIAlertViewDelegate>
- (void) actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger) buttonIndex
{
if(buttonIndex != [actionSheet cancelButtonIndex]) {
NSString *message = [[NSString alloc] initWithFormat:@」You can breathe easy, everything went OK.」];
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@」Something was done」
[alert show]; [alert release]; [message release];
}
}
動畫效果
-(void)doChange:(id)sender {
if(view2 == nil)
{
[self loadSec];
}
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:1];
[UIView setAnimationTransition:([view1 superview]?UIViewAnimationTransitionFlipFromLeft:UIViewAnimationTransitionFlipFromRigh t)forView:self.view cache:YES];
if([view1 superview]!= nil) {
[view1 removeFromSuperview]; [self.view addSubview:view2];
}else {
[view2 removeFromSuperview]; [self.view addSubview:view1]; }
[UIView commitAnimations];
}
Table View <UITableViewDateSource> #pragma mark -
#pragma mark Table View Data Source Methods //指定分區中的行數,默認爲 1
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [self.listData count]; }
設置每一行 cell 顯示的內容
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *SimpleTableIndentifier = @"SimpleTableIndentifier"; UITableViewCell *cell = dequeueReusableCellWithIdentifier:SimpleTableIndentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:SimpleTableIndentifier]
autorelease];
}
UIImage *image = [UIImage imageNamed:@"13.gif"]; cell.imageView.image = image;
[tableView
NSUInteger row = [indexPath row]; cell.textLabel.text = [listData objectAtIndex:row];
cell.textLabel.font = [UIFont boldSystemFontOfSize:20];
if(row < 5)
cell.detailTextLabel.text = @"Best friends"; else
cell.detailTextLabel.text = @"friends"; return cell;
}
判斷郵箱格式是否正確的代碼
利用正則表達式驗證
-(BOOL)isValidateEmail:(NSString *)email
{
NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES%@",emailRegex];
return [emailTest evaluateWithObject:email];
}
圖片壓縮
用法:UIImage *yourImage= [selfimageWithImageSimple:image scaledToSize:CGSizeMake(210.0, 210.0)];
壓縮圖片
- (UIImage*)imageWithImageSimple:(UIImage*)image scaledToSize:(CGSize)newSize
{
Create a graphics image context
UIGraphicsBeginImageContext(newSize);
Tell the old image to draw in this newcontext, with the desired
new size
[image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
Get the new image from the context
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
End the context
UIGraphicsEndImageContext();
Return the new image.
return newImage;
}
親測可用的圖片上傳代碼
- (IBAction)uploadButton:(id)sender {
UIImage *image = [UIImage imageNamed:@"1.jpg"]; 圖片名
NSData *imageData = UIImageJPEGRepresentation(image,0.5);壓縮比例
NSLog(@"字節數:%i",[imageData length]);
post url
服務器地址
setting up the request object now
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init] ;
[request setURL:[NSURL URLWithString:urlString]];
[request setHTTPMethod:@"POST"];
NSString *boundary = [NSString stringWithString:@"---------------------------14737809831466499882746641449"];
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data;boundary=%@",boundary];
[request addValue:contentType forHTTPHeaderField: @"Content-Type"];
NSMutableData *body = [NSMutableData data];
[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithString:@"Content-Disposition:form-data; name=\"userfile\"; filename=\"2.png\"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 上傳上去的圖片名字
[body appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[NSData dataWithData:imageData]];
[body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[request setHTTPBody:body];
NSLog(@"1-body:%@",body);
NSLog(@"2-request:%@",request);
NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];
NSLog(@"3-測試輸出:%@",returnString);
給imageView加載圖片
UIImage *myImage = [UIImage imageNamed:@"1.jpg"];
[imageView setImage:myImage];
[self.view addSubview:imageView];
對圖庫的操做
選擇相冊:
UIImagePickerControllerSourceTypesourceType=UIImagePickerControllerSourceTypeCamera;
if (![UIImagePickerControllerisSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
sourceType=UIImagePickerControllerSourceTypePhotoLibrary;
}
UIImagePickerController * picker = [[UIImagePickerControlleralloc]init];
picker.delegate = self;
picker.allowsEditing=YES;
picker.sourceType=sourceType;
[self presentModalViewController:picker animated:YES];
選擇完畢:
-(void)imagePickerController:(UIImagePickerController*)pickerdidFinishPickingMediaWithInfo:(NSDictionary *)info
{
[picker dismissModalViewControllerAnimated:YES];
UIImage * image=[info objectForKey:UIImagePickerControllerEditedImage];
[self performSelector:@selector(selectPic:) withObject:imageafterDelay:0.1];
}
-(void)selectPic:(UIImage*)image
{
NSLog(@"image%@",image);
imageView = [[UIImageView alloc] initWithImage:image];
imageView.frame = CGRectMake(0, 0, image.size.width, image.size.height);
[self.viewaddSubview:imageView];
[self performSelectorInBackground:@selector(detect:) withObject:nil];
}
detect爲本身定義的方法,編輯選取照片後要實現的效果
取消選擇:
-(void)imagePickerControllerDIdCancel:(UIImagePickerController*)picker
{
[picker dismissModalViewControllerAnimated:YES];
}
跳到下個View
nextWebView = [[WEBViewController alloc] initWithNibName:@"WEBViewController" bundle:nil];
[self presentModalViewController:nextWebView animated:YES];
建立一個UIBarButtonItem右邊按鈕
UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] initWithTitle:@"右邊"style:UIBarButtonItemStyleDone target:self action:@selector(clickRightButton)];
[self.navigationItem setRightBarButtonItem:rightButton];
設置navigationBar隱藏
self.navigationController.navigationBarHidden = YES;
iOS開發之UIlabel多行文字自動換行 (自動折行)
UIView *footerView = [[UIView alloc]initWithFrame:CGRectMake(10, 100, 300, 180)];
UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(10, 100, 300, 150)];
label.text = @"Hello world! Hello world!Hello world! Hello world! Hello world! Hello world! !";
背景顏色爲紅色
label.backgroundColor = [UIColor redColor];
設置字體顏色爲白色
label.textColor = [UIColor whiteColor];
文字居中顯示
label.textAlignment = UITextAlignmentCenter;
自動折行設置
label.lineBreakMode = UILineBreakModeWordWrap;
label.numberOfLines = 0;
代碼生成button
CGRect frame = CGRectMake(0, 400, 72.0, 37.0);
UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
button.frame = frame;
[button setTitle:@"新添加的按鈕" forState: UIControlStateNormal];
button.backgroundColor = [UIColor clearColor];
button.tag = 2000;
[button addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
讓某個控件在View的中心位置顯示
(某個控件,好比label,View)label.center = self.view.center;
好看的文字處理
以tableView中cell的textLabel爲例子:
cell.backgroundColor = [UIColorscrollViewTexturedBackgroundColor];
設置文字的字體
cell.textLabel.font = [UIFont fontWithName:@"AmericanTypewriter" size:100.0f];
設置文字的顏色
cell.textLabel.textColor = [UIColor orangeColor];
設置文字的背景顏色
cell.textLabel.shadowColor = [UIColor whiteColor];
設置文字的顯示位置
cell.textLabel.textAlignment = UITextAlignmentCenter;
隱藏Status Bar
讀者可能知道一個簡易的方法,那就是在程序的viewDidLoad中加入
[[UIApplication sharedApplication]setStatusBarHidden:YES animated:NO];
更改AlertView背景
UIAlertView *theAlert = [[[UIAlertViewalloc] initWithTitle:@"Atention"
message: @"I'm a Chinese!"
delegate:nil
cancelButtonTitle:@"Cancel"
otherButtonTitles:@"Okay",nil] autorelease];
[theAlert show];
UIImage *theImage = [UIImageimageNamed:@"loveChina.png"];
theImage = [theImage stretchableImageWithLeftCapWidth:0topCapHeight:0];
CGSize theSize = [theAlert frame].size;
UIGraphicsBeginImageContext(theSize);
[theImage drawInRect:CGRectMake(5, 5, theSize.width-10, theSize.height-20)];這個地方的大小要本身調
整,以適應alertview的背景顏色的大小。
theImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
theAlert.layer.contents = (id)[theImage CGImage];
鍵盤透明
textField.keyboardAppearance = UIKeyboardAppearanceAlert;
狀態欄的網絡活動風火輪是否旋轉
[UIApplication sharedApplication].networkActivityIndicatorVisible,默認值是NO。
截取屏幕圖片
建立一個基於位圖的圖形上下文並指定大小爲CGSizeMake(200,400)
UIGraphicsBeginImageContext(CGSizeMake(200,400));
renderInContext 呈現接受者及其子範圍到指定的上下文
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
返回一個基於當前圖形上下文的圖片
UIImage *aImage = UIGraphicsGetImageFromCurrentImageContext();
移除棧頂的基於當前位圖的圖形上下文
UIGraphicsEndImageContext();
以png格式返回指定圖片的數據
imageData = UIImagePNGRepresentation(aImage);
更改cell選中的背景
UIView *myview = [[UIView alloc] init];
myview.frame = CGRectMake(0, 0, 320, 47);
myview.backgroundColor = [UIColorcolorWithPatternImage:[UIImage imageNamed:@"0006.png"]];
cell.selectedBackgroundView = myview;
顯示圖像
CGRect myImageRect = CGRectMake(0.0f, 0.0f, 320.0f, 109.0f);
UIImageView *myImage = [[UIImageView alloc] initWithFrame:myImageRect];
[myImage setImage:[UIImage imageNamed:@"myImage.png"]];
myImage.opaque = YES; opaque是否透明
[self.view addSubview:myImage];
能讓圖片適應框的大小(待確認)
NSString*imagePath = [[NSBundle mainBundle] pathForResource:@"XcodeCrash"ofType:@"png"];
UIImage *image = [[UIImage alloc]initWithContentsOfFile:imagePath];
UIImage *newImage= [image transformWidth:80.f height:240.f];
UIImageView *imageView = [[UIImageView alloc]initWithImage:newImage];
[newImagerelease];
[image release];
[self.view addSubview:imageView];
實現點擊圖片進行跳轉的代碼:生成一個帶有背景圖片的button,給button綁定想要的事件!
UIButton *imgButton=[[UIButton alloc]initWithFrame:CGRectMake(0, 0, 120, 120)];
[imgButton setBackgroundImage:(UIImage *)[self.imgArray objectAtIndex:indexPath.row] forState:UIControlStateNormal];
imgButton.tag=[indexPath row];
[imgButton addTarget:self action:@selector(buttonClick:) forControlEvents:UIControlEventTouchUpInside];
多線程和結束後的更新UI操做
dispatch_async(dispatch_get_global_queue(0, 0), ^{
耗時操做
dispatch_async(dispatch_get_main_queue(), ^{
更新UI操做
});
});
修改PlaceHolder的默認顏色
[username_text setValue:[UIColor colorWithRed:1 green:1 blue:1 alpha:0.5] forKeyPath:@"_placeholderLabel.textColor"];
頁面上移解決文本框被鍵盤彈出擋住的問題
textfield的函數
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
[username_text resignFirstResponder];
[password_text resignFirstResponder];
When the user presses return, take focus away from the text field so that the keyboard is dismissed.
NSTimeInterval animationDuration = 0.30f;
[UIView beginAnimations:@"ResizeForKeyboard" context:nil];
[UIView setAnimationDuration:animationDuration];
CGRect rect = CGRectMake(0.0f, 0.0f, self.view.frame.size.width, self.view.frame.size.height);
self.view.frame = rect;
[UIView commitAnimations];
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
When the user presses return, take focus away from the text field so that the keyboard is dismissed.
NSTimeInterval animationDuration = 0.30f;
[UIView beginAnimations:@"ResizeForKeyboard" context:nil];
[UIView setAnimationDuration:animationDuration];
CGRect rect = CGRectMake(0.0f, 0.0f, self.view.frame.size.width, self.view.frame.size.height);
self.view.frame = rect;
[UIView commitAnimations];
[textField resignFirstResponder];
return YES;
}
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
CGRect frame = password_text.frame;
int offset = frame.origin.y + 32 - (self.view.frame.size.height - 216.0);//鍵盤高度216
NSTimeInterval animationDuration = 0.30f;
[UIView beginAnimations:@"ResizeForKeyBoard" context:nil];
[UIView setAnimationDuration:animationDuration];
float width = self.view.frame.size.width;
float height = self.view.frame.size.height;
if(offset > 0)
{
CGRect rect = CGRectMake(0.0f, -offset,width,height);
self.view.frame = rect;
}
[UIView commitAnimations];
}
iOS代碼加密經常使用加密方式,常見的iOS代碼加密經常使用加密方式算法包括MD5加密、AES加密、BASE64加密:
MD5 iOS代碼加密
建立MD5類,代碼以下
#import <Foundation/Foundation.h>
@interface CJMD5 : NSObject
+(NSString *)md5HexDigest:(NSString *)input;
@end
#import "CJMD5.h"
#import <CommonCrypto/CommonDigest.h>
@implementation CJMD5
+(NSString *)md5HexDigest:(NSString *)input{
const char* str = [input UTF8String];
unsigned char result[CC_MD5_DIGEST_LENGTH];
CC_MD5(str, strlen(str), result);
NSMutableString *ret = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH];
for(int i = 0; i<CC_MD5_DIGEST_LENGTH; i++) {
[ret appendFormat:@"%02X",result];
}
return ret;
}
@end
MD5是不可逆的只有加密沒有解密,iOS代碼加密使用方式以下
NSString *userName = @"cerastes";
NSString *password = @"hello Word";
MD5加密
NSString *md5 = [CJMD5 md5HexDigest:password];
NSLog(@"%@",md5);
END
AES加密iOS代碼加密
AES加密iOS代碼加密使用方法
AES加密
NSString *encryptedData = [AESCrypt encrypt:userName password:password];加密
NSString *message = [AESCrypt decrypt:encryptedData password:password]; 解密
NSLog(@"加密結果 = %@",encryptedData);
NSLog(@"解密結果 = %@",message);
END
BASE64加密iOS代碼加密
BASE64加密iOS代碼加密添加以下方法
.h
+ (NSString*)encodeBase64String:(NSString *)input;
+ (NSString*)decodeBase64String:(NSString *)input;
+ (NSString*)encodeBase64Data:(NSData *)data;
+ (NSString*)decodeBase64Data:(NSData *)data;
.m
+ (NSString*)encodeBase64String:(NSString * )input {
NSData *data = [input dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
data = [GTMBase64 encodeData:data];
NSString *base64String = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
return base64String;
}
+ (NSString*)decodeBase64String:(NSString * )input {
NSData *data = [input dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
data = [GTMBase64 decodeData:data];
NSString *base64String = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
return base64String;
}
+ (NSString*)encodeBase64Data:(NSData *)data {
data = [GTMBase64 encodeData:data];
NSString *base64String = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
return base64String;
}
+ (NSString*)decodeBase64Data:(NSData *)data {
data = [GTMBase64 decodeData:data];
NSString *base64String = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
return base64String;
}
BASE64加密iOS代碼加密使用方法
BASE64加密
NSString *baseEncodeString = [GTMBase64 encodeBase64String:password];
NSString *baseDecodeString = [GTMBase64 decodeBase64String:baseEncodeString];
NSLog(@"baseEncodeString = %@",baseEncodeString);
NSLog(@"baseDecodeString = %@",baseDecodeString);
RSA加密:
RSA是目前最有影響力的公鑰加密算法,它可以抵抗到目前爲止已知的絕大多數密碼攻擊,已被ISO推薦爲公鑰數據加密標準。
RSA公開密鑰密碼體制。所謂的公開密鑰密碼體制就是使用不一樣的加密密鑰與解密密鑰,是一種「由已知加密密鑰推導出解密密鑰在計算上是不可行的」密碼體制。
一般是先生成一對RSA 密鑰,其中之一是保密密鑰,由用戶保存;另外一個爲公開密鑰,可對外公開,甚至可在網絡服務器中註冊。爲提升保密強度,RSA密鑰至少爲500位長,通常推薦使用1024位。這就使加密的計算量很大。爲減小計算量,在傳送信息時,常採用傳統加密方法與公開密鑰加密方法相結合的方式,即信息採用改進的DES或IDEA對話密鑰加密,而後使用RSA密鑰加密對話密鑰和信息摘要。對方收到信息後,用不一樣的密鑰解密並可覈對信息摘要。
RSA算法是第一個能同時用於加密和數字簽名的算法,也易於理解和操做。RSA是被研究得最普遍的公鑰算法.
RSA算法是一種非對稱密碼算法,所謂非對稱,就是指該算法須要一對密鑰,使用其中一個加密,則須要用另外一個才能解密。
RSA的算法涉及三個參數,n、e一、e2。
其中,n是兩個大質數p、q的積,n的二進制表示時所佔用的位數,就是所謂的密鑰長度。
e1和e2是一對相關的值,e1能夠任意取,但要求e1與(p-1)*(q-1)互質;再選擇e2,要求(e2*e1)mod((p-1)*(q-1))=1。
(n,e1),(n,e2)就是密鑰對。其中(n,e1)爲公鑰,(n,e2)爲私鑰。[1]
RSA加解密的算法徹底相同,設A爲明文,B爲密文,則:A=B^e2 mod n;B=A^e1 mod n;(公鑰加密體制中,通常用公鑰加密,私鑰解密)
e1和e2能夠互換使用,即:
A=B^e1 mod n;B=A^e2 mod n;
1)本地數據加密
對NSUserDefaults,sqlite存儲文件數據加密,保護賬號和關鍵信息。)URL編碼加密
對程序中出現的URL進行編碼加密,防止URL被靜態分析
2)網絡傳輸數據加密
對客戶端傳輸數據提供加密方案,有效防止經過網絡接口的攔截獲取
3)方法體,方法名高級混淆
對應用程序的方法名和方法體進行混淆,保證源碼被逆向後沒法解析代碼
4)程序結構混排加密
對應用程序邏輯結構進行打亂混排,保證源碼可讀性降到最低
返回指定範圍的隨機數(m-n之間)的公式
Math.random()*(n-m)+m
防止被Iframe嵌套
if(top != self){
location.href = 」about:blank」;
}
/**
* HTTP GET 請求
**/
+(NSData *) doHttpGet:(NSString *)url
{
NSURL *uri = [NSURL URLWithString:url];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:uri];
[request setHTTPMethod: @"GET" ];
NSData *returnData = [NSURLConnection sendSynchronousRequest: request returningResponse: nil error: nil];
return returnData;
}
/**
* HTTP POST請求
**/
+(NSData *) doHttpPost:(NSString *)url withString:(NSString *)param
{
NSData *data = nil;
if(param != nil && [param isEqualToString:@""] == NO){
param = [param stringByAddingPercentEscapesUsingEncoding:CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000)];
data = [param dataUsingEncoding:CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000)];
}
//調用withParam NSData*類型的方法.
return [self doHttpPost:url withParam:data];
}
/**
* HTTP POST請求
**/
+(NSData *) doHttpPost:(NSString *)url withParam:(NSData *)param
{
新建請求
NSURL *uri = [NSURL URLWithString:url];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:uri cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:40.0];
設置請求參數
[request setHTTPMethod:@"POST"];
[request addValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
if(param != nil)
[request setHTTPBody:param];
打開訪問網絡的狀態提示
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
請求連接
NSError *error = nil;
NSData *retData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
NSLog(@"%d: %@", error.code, error.description);
關閉訪問網絡的狀態提示
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
返回結果
return retData;
}
/**
* 獲取網絡圖片
**/
+(UIImage *) getImageFromUrl:(NSString *)url
{
if(url == nil || [url isEqualToString:@""]){
return nil;
}
url = StringByTrimWhiteSpace(url);
NSData *imageData = [[NSData alloc]initWithContentsOfURL:[NSURL URLWithString:url]];
UIImage *image =[[UIImage alloc] initWithData:imageData];
return image;
}
/**
* 獲取網絡圖片的內容
**/
+(NSData *)getImageDataFromUrl:(NSString *)url
{
if(url == nil || [url isEqualToString:@""]){
return nil;
}
NSData *imageData = [[NSData alloc]initWithContentsOfURL:[NSURL URLWithString:url]];
return imageData;
}
#pragma mark - 字符串處理
/**
* 利用正則表達示獲取字符串的匹配結果
**/
+(NSString *) getRegExpressResult:(NSString *)source regExp:(NSString *)regExp
{
NSString *temp = [NSString stringWithFormat:@"%@", source];
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:regExp options:NSRegularExpressionCaseInsensitive error:nil];
if (regex != nil) {
NSTextCheckingResult *firstMatch = [regex firstMatchInString:temp options:0 range:NSMakeRange(0, [temp length])];
if (firstMatch) {
NSRange resultRange = [firstMatch rangeAtIndex:0];
截取數據
NSString *result = [temp substringWithRange:resultRange];
返回結果
return result;
}
}
return @"";
}
/**
* 匹配字符串中整個HTML標記的內容
**/
+(NSString *) getHtmlText:(NSString *)source tagName:(NSString *)tag
{
NSString *regexp = [NSString stringWithFormat:@"<\\s*%@\\s+([^>]*)\\s*>([^/%@>]*</%@>)?", tag, tag, tag];
return [BaseFunction getRegExpressResult:source regExp:regexp];
}
/**
* 匹配HTML標記內容中的屬性值
**/
+(NSString *) getHtmlTagAttr:(NSString *)tagContext attrName:(NSString *)attr
{
NSString *regexp = [NSString stringWithFormat: @"%@\\s*=\\s*?(['\"][^'\"]*?)['\"]", attr];
NSString *result = [BaseFunction getRegExpressResult:tagContext regExp:regexp];
替換
NSString *oldstr = [NSString stringWithFormat:@"%@=\"", attr];
NSString *newstr = [result stringByReplacingOccurrencesOfString:oldstr withString:@""];
newstr = [newstr substringToIndex:[newstr length] - 1];
return newstr;
}
/**
* 獲取HTML標記的文本
**/
+(NSString *) getHTmlTagText:(NSString *)tagContext
{
NSString *regExp = @"<\\s*\\w+\\s+([^>]*)\\s*>";
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:regExp options:NSRegularExpressionCaseInsensitive error:nil];
NSTextCheckingResult *firstMatch = [regex firstMatchInString:tagContext options:0 range:NSMakeRange(0, [tagContext length])];
NSRange resultRange = [firstMatch rangeAtIndex:0];
NSString *newStr = [tagContext substringFromIndex:resultRange.length];
regExp = @"</\\w+\\s*>";
regex = [NSRegularExpression regularExpressionWithPattern:regExp options:NSRegularExpressionCaseInsensitive error:nil];
firstMatch = [regex firstMatchInString:newStr options:0 range:NSMakeRange(0, [newStr length])];
resultRange = [firstMatch rangeAtIndex:0];
return [newStr substringToIndex:resultRange.location];
}
/**
* 替換HTML標籤
**/
+(NSString *) replaceHtmlTag:(NSString *)source
{
source = [BaseFunction replaceString:source byRegexp:@"<[^>]+>"];
return [BaseFunction replaceString:source byRegexp:@"</[^>]+>"];
}
+(NSString *) replaceString:(NSString *)source byRegexp:(NSString *)exp
{
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:exp options:0 error:nil];
if(regex == nil)
return source;
NSString *ret = [NSString stringWithFormat:@"%@", source];
NSArray *array = [regex matchesInString:ret options:NSMatchingReportProgress range:NSMakeRange(0, [ret length])];
for(int i = (int)[array count] - 1; i >= 0; i--)
{
NSTextCheckingResult *tcr = [array objectAtIndex:i];
NSRange range = [tcr range];
ret = [ret stringByReplacingCharactersInRange:range withString:@""];
}
return ret;
}
/**
* 正則驗證
**/
+(BOOL) string:(NSString *)source MatchRegex:(NSString *) exp
{
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", exp];
return [predicate evaluateWithObject:source];
}
/**
* 獲取正則表達式中匹配的個數
**/
+ (NSInteger) getMatchCount:(NSString *)text inRegx:(NSString *)exp
{
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:exp options:0 error:nil];
int count = 0;
if (regex != nil) {
NSArray *array = [regex matchesInString:text options:NSMatchingReportProgress range:NSMakeRange(0, [text length])];
for(int i=0; i< [array count]; i++)
{
NSTextCheckingResult *tcr = [array objectAtIndex:i];
NSRange range = [tcr range];
count += range.length;
}
}
return count;
}
/**
* 替換XML敏感字符
**/
+ (NSString *) replaceXMLSensitiveLettler:(NSString *)text
{
NSString *tmp = [text stringByReplacingOccurrencesOfString:@"&" withString:@"&"];
tmp = [tmp stringByReplacingOccurrencesOfString:@"<" withString:@"<"];
tmp = [tmp stringByReplacingOccurrencesOfString:@">" withString:@">"];
return tmp;
}
/**
* 分離座標
**/
+(void) separateCoordinate:(NSString *)coord lat:(NSString **)lat lng:(NSString **)lng
{
*lng = @"", *lat = @"";
驗證數據的合法性
if(coord == nil){ return; }
coord = StringByTrimWhiteSpace(coord);
if(IsStringEmpty(coord)){
return;
}
將座標分開
NSArray *coordArray = [coord componentsSeparatedByString:@","];
if([coordArray count]>0)
*lng = [coordArray objectAtIndex:0];
if([coordArray count]>1)
*lat = [coordArray objectAtIndex:1];
}
/**
* 從文件路徑中分解出文件名
**/
+ (NSString *) splitFileNameForPath:(NSString *)filePath
{
NSArray *array = [filePath componentsSeparatedByString:@"/"];
return [array lastObject];
}
/**
* 從文件路徑中分解出文件的擴展名
**/
+ (NSString *) getFileExtension:(NSString *)filePath
{
NSString *fileName = [self splitFileNameForPath:filePath];
NSArray *array = [fileName componentsSeparatedByString:@"."];
return [NSString stringWithFormat:@".%@",[array lastObject]];
}
/**
* 獲取設備型號
**/
+ (NSString *) platform
{
size_t size;
sysctlbyname("hw.machine", NULL, &size, NULL, 0);
char *machine = (char *)malloc(size);
sysctlbyname("hw.machine", machine, &size, NULL, 0);
NSString *platform = [NSString stringWithCString:machine encoding:NSUTF8StringEncoding];
free(machine);
NSRange range = [platform rangeOfString:@","];
return [platform substringToIndex:range.location];
}
/**
* MD5加密
**/
+ (NSString *)md5Digest:(NSString *)str {
const char *cStr = [str UTF8String];
unsigned char result[CC_MD5_DIGEST_LENGTH];
CC_MD5(cStr, (CC_LONG)strlen(cStr), result); // This is the md5 call
NSMutableString *md5Result = [[NSMutableString alloc] init];
for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
[md5Result appendFormat:@"%02x", result[i]];
}
return md5Result;
return [NSString stringWithFormat:
@"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
result[0], result[1], result[2], result[3],
result[4], result[5], result[6], result[7],
result[8], result[9], result[10], result[11],
result[12], result[13], result[14], result[15]];
}
+ (NSString *)SHA1:(NSString *)str {
const char *cStr = [str UTF8String];
NSData *data = [NSData dataWithBytes:cStr length:str.length];
uint8_t digest[CC_SHA1_DIGEST_LENGTH];
CC_SHA1(data.bytes, (CC_LONG)data.length, digest);
NSMutableString *result = [[NSMutableString alloc] init];
for(int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++) {
[result appendFormat:@"%02x", digest[i]];
}
return result;
}
判斷是否爲整形
+ (BOOL)isPureInt:(NSString *)string{
NSScanner* scan = [NSScanner scannerWithString:string];
int val;
return [scan scanInt:&val] && [scan isAtEnd];
}
判斷是否爲浮點形
+ (BOOL)isPureFloat:(NSString *)string{
NSScanner* scan = [NSScanner scannerWithString:string];
float val;
return [scan scanFloat:&val] && [scan isAtEnd];
}
/**
* 版本比較
**/
+ (BOOL)isVersion:(NSString*)versionA biggerThanVersion:(NSString*)versionB
{
NSArray *arrayNow = [versionB componentsSeparatedByString:@"."];
NSArray *arrayNew = [versionA componentsSeparatedByString:@"."];
BOOL isBigger = NO;
NSInteger i = arrayNew.count > arrayNow.count? arrayNow.count : arrayNew.count;
NSInteger j = 0;
BOOL hasResult = NO;
for (j = 0; j < i; j ++) {
NSString* strNew = [arrayNew objectAtIndex:j];
NSString* strNow = [arrayNow objectAtIndex:j];
if ([strNew integerValue] > [strNow integerValue]) {
hasResult = YES;
isBigger = YES;
break;
}
if ([strNew integerValue] < [strNow integerValue]) {
hasResult = YES;
isBigger = NO;
break;
}
}
if (!hasResult) {
if (arrayNew.count > arrayNow.count) {
NSInteger nTmp = 0;
NSInteger k = 0;
for (k = arrayNow.count; k < arrayNew.count; k++) {
nTmp += [[arrayNew objectAtIndex:k]integerValue];
}
if (nTmp > 0) {
isBigger = YES;
}
}
}
return isBigger;
}
Reveal使用
1. Build Settings 搜索Other
將Other Linker Flags設置爲 -ObjC
2.Reveal.framework拖到項目中便可
~/資源庫/Caches/
找到com.ittybittyapps.Reveal文件夾刪除
~/資源庫/Preferences/
找到com.ittybittyapps.Reveal.plist刪除
又可使用30天
UILabel設置多種字體、顏色
NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:@"Using NSAttributed String,try your best to test attributed string text"];
[str addAttribute:NSForegroundColorAttributeName value:[UIColor blueColor] range:NSMakeRange(0,5)];
[str addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(6,12)];
[str addAttribute:NSForegroundColorAttributeName value:[UIColor greenColor] range:NSMakeRange(19,6)];
[str addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"Arial" size:30.0] range:NSMakeRange(0, 5)];
[str addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"Arial" size:30.0] range:NSMakeRange(6, 12)];
[str addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"Arial" size:30.0] range:NSMakeRange(19, 6)];
UILabel *attrLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 150, 320 - 40, 90)];
attrLabel.attributedText = str;
attrLabel.numberOfLines = 0;
[self.view addSubview:attrLabel];
iOS 調試方法(利用lldb)
po _image 能夠看到_imge 的信息
模擬器安裝app
xcrun simctl install booted +APP的路徑
文本框鍵盤遮擋問題
UINavigationControllerDelegate
_niChenText.delegate=self;
[[NSNotificationCenterdefaultCenter]addObserver:selfselector:@selector(keyboardWillShow:)name:UIKeyboardWillShowNotificationobject:nil];
[[NSNotificationCenterdefaultCenter]addObserver:selfselector:@selector(keyboardWillHide:)name:UIKeyboardWillHideNotificationobject:nil];
@property (strong,nonatomic)UITextField *SelectTextField;
鍵盤顯示事件
- (void) keyboardWillShow:(NSNotification *)notification {
獲取鍵盤高度,在不一樣設備上,以及中英文下是不一樣的
CGFloat kbHeight = [[notification.userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size.height;
計算出鍵盤頂端到inputTextView panel底端的距離(加上自定義的緩衝距離INTERVAL_KEYBOARD)
CGFloat offset = (_SelectTextField.frame.origin.y+_SelectTextField.frame.size.height+50) - (self.view.frame.size.height - kbHeight);
取得鍵盤的動畫時間,這樣能夠在視圖上移的時候更連貫
double duration = [[notification.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
將視圖上移計算好的偏移
if(offset > 0) {
[UIView animateWithDuration:duration animations:^{
self.view.frame = CGRectMake(0.0f, -offset, self.view.frame.size.width, self.view.frame.size.height);
}];
}
}
鍵盤消失事件
- (void) keyboardWillHide:(NSNotification *)notify {
鍵盤動畫時間
double duration = [[notify.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
視圖下沉恢復原狀
[UIView animateWithDuration:duration animations:^{
self.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
}];
}
- (void)textFieldDidBeginEditing:(UITextField *)textField{
_SelectTextField=textField;
}
-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
[textField resignFirstResponder];
return YES;
}
圖片拉神
UIImage * resizeImage=[normal resizableImageWithCapInsets:UIEdgeInsetsMake(h, w, h, w)];
背景單擊事件
@interface LCTianJianDiZhiController ()<HZAreaPickerDelegate,UIGestureRecognizerDelegate>
UITapGestureRecognizer *tapGestureRecognize = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(backGroundOnclick)];
tapGestureRecognize.delegate = self;
[self.view addGestureRecognizer:tapGestureRecognize];
-(void)backGroundOnclick
{
[_selectDiQu setTitle:@"選擇" forState:UIControlStateNormal];
[self.view endEditing:YES];
[self cancelLocatePicker];
}
如下狀況不能交互
alpha<0.01
hidden=yes
userInteracion=no
父視圖不容許交換,子視圖也不能
在父圖可見範圍內能夠交換,範圍以外不能交互
UiImageView 默認不容許用戶交互
uitableviewcell 點擊沒有效果
cell.selectionStyle = UITableViewCellSelectionStyleNone;
隱藏導航欄
[self.navigationController setNavigationBarHidden:YES animated:NO];
隱藏標籤欄
self.tabBarController.tabBar.hidden =YES;
時間戳轉換爲時間
NSString *str=[_mydata[indexPath.row]valueForKey:@"appr_comment_time"];時間戳
NSTimeInterval time=[str doubleValue]/1000+28800;由於時差問題要加8小時 == 28800 sec
NSDate *detaildate=[NSDate dateWithTimeIntervalSince1970:time];
NSLog(@"date:%@",[detaildate description]);
實例化一個NSDateFormatter對象
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
設定時間格式,這裏能夠設置成本身須要的格式
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSString *currentDateStr = [dateFormatter stringFromDate: detaildate];
NSLog(@"%@",currentDateStr);
密碼文本框secureTextEntry
把數據存儲到本地
存儲
獲取userDefault單例
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
登錄成功後把用戶名和密碼存儲到UserDefault
[userDefaults setObject:_userName.text forKey:@"name"];
[userDefaults setObject:_password.text forKey:@"password"];
[userDefaults synchronize];
調用
獲取UserDefault
NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
_userName.text= [userDefault objectForKey:@"name"];
_password.text= [userDefault objectForKey:@"password"];
頁面切換的方式
從一個ViewController切換到另外一個ViewController有下面幾種方法:
(1)addsubview方法切換視圖
self.view addSubview:(加載的新頁面);
相應的 [self.view removeFromSuperview];移除添加的view
(2)self.view insertSubview:(加載的新頁面) atIndex:n;
對n的解釋:頁面都是層次疊加的,n表示加載到那一層上面
(3)presentModalViewController方法
photoNacController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
photoNacController.modalPresentationStyle = UIModalPresentationFullScreen;
selfpresentModalViewController:(加載的新頁面) animated:
modalTransitionStyle用於設置頁面切換的動畫
modalPresentationStyle用於設置視圖顯示的方式
兩種方法試試就知道用途了!
(4) pushViewController導航
[self.navigationController pushViewController:(加載的新頁面) animated:YES];
對應的
[self.navigationController popViewControllerAnimated:YES];
總結:系統提供了咱們視圖切換的方法以及視圖切換的默認動畫,咱們能夠選擇這幾種方法中的去使用,也能夠自定義切換的動畫animation
/** 隱藏狀態欄 */
- (BOOL)prefersStatusBarHidden
{
return YES;
}
調整邊距,可讓表格視圖讓開狀態欄
self.tableView.contentInset = UIEdgeInsetsMake(20, 0, 0, 0);
代刪除線的UILabel
- (void)drawRect:(CGRect)rect {
Drawing code
[super drawRect:rect];
CGContextRef context=UIGraphicsGetCurrentContext();
CGContextMoveToPoint(context, 0, 8);
CGContextAddLineToPoint(context, rect.size.width, rect.size.height-5);
CGContextStrokePath(context);
}
從xib加載時若是不顯示或出錯就多是伸縮的問題
dropdown.autoresizingMask=UIViewAutoResizingNone;
unbutton 設置圓角邊框
[huoQuYanZhenMa.layer setMasksToBounds:YES];
[huoQuYanZhenMa.layer setCornerRadius:10.0]; 設置矩形四個圓角半徑
[huoQuYanZhenMa.layer setBorderWidth:1.0]; 邊框寬度
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGColorRef colorref = CGColorCreate(colorSpace,(CGFloat[]){ 1, 0, 0, 1 });
[huoQuYanZhenMa.layer setBorderColor:colorref];邊框顏色
[self.view addSubview:huoQuYanZhenMa];
界面跳轉
- (void)pushAction{
PushViewController *pushVC = [[PushViewController alloc] init];
[self.navigationController pushViewController:pushVC animated:YES];
RootViewController *rootVC = (RootViewController *)self.tabBarController;
[rootVC showTabBar:NO];
[self.navigationController showViewController:<#(UIViewController *)#> sender:<#(id)#>]
}
- (void)presentAction{
ModalViewController *modalVC = [[ModalViewController alloc] init];
模態視圖
[self presentViewController:modalVC animated:YES completion:nil];
}
- (void)dismissAction{
[self dismissViewControllerAnimated:YES completion:nil];
}
- (void)popAction{
[self.navigationController popViewControllerAnimated:YES];
}
UIStoryboard *stryBoard=[UIStoryboard storyboardWithName:@"Main" bundle:nil];
[self presentViewController:[stryBoard instantiateViewControllerWithIdentifier:@"mytabBarContol"] animated:NO completion:nil];
語法約定
方法首字母大小,單詞切換用大寫
類名要大寫
初始化應用要initW~~,w必定要大些,而且前面必定是init才行;否則self=[super init]會出錯
打印結構體
NSLog(@「%@」,nSStringFromRange(range));
代理的做用
監聽哪些不能用addTarget監聽的事件
主要用來負責兩個對象之間的消息傳遞
代理實現的步驟
(1)成爲(子)控件的代理,父親(控制器)成爲兒子(文本框)的代理
(2)遵照協議,利用智能提示具體實現
代理的id應該用weak 弱引用,否則會照成循環引用
判斷是否實現某個協議方法
if ([self.delegate respondsToSelector:@selector(tgFooterViewDidDowenLoadButton:)]) {
[self.delegate tgFooterViewDidDowenLoadButton:self];
}
代理模式:是父控件(視圖控制器)監聽子控件的事件,當子控件發生某些事情時通知父控件工做
footerView->controller 去工做,用代理
conterView->footerView去工做,直接調用用footView的方法
不要分割線
tabQQChat.separatorStyle=UITableViewCellSeparatorStyleNone;
內邊距
_textView.contentEdgeInsets=UIEdgeInsetsMake(20, 20, 20, 20);
獲取文本的寬高
正文
CGFloat textX;
CGFloat textY=iconY;
CGSize textmaxSize= CGSizeMake(150, MAXFLOAT);
CGSize textRealSizw=[message.text boundingRectWithSize:textmaxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:15.0f]} context:nil].size;
模型中數據中文亂碼
對象描述方法,相似toStrong
-(NSString *)description
{
return [NSString stringWithFormat:@"=<%@: %p>{answer: %@,icon:%@,title:%@,option:%@}",self.class,self ,self.answer,self.icon,self.title,self.options];
}
而後在viewDidLoad中
NSLog(@"%@",self.question);
而後導入NSArray+Log.h
改變狀態欄的顏色
-(UIStatusBarStyle)preferredStatusBarStyle
{
return UIStatusBarStyleLightContent;
}
隱藏返回按鈕文字
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60)
forBarMetrics:UIBarMetricsDefault];
uitableVIew的背景圖片
UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"leftMenu.jpg"]];
self.tableView.backgroundView = imageView;
分割線
self.tableView.separatorStyle=UITableViewCellSeparatorStyleLSingleLine;
刪除多餘的分割線
self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];//tableView刪除多餘的分割線
- (void)setExtraCellLineHidden: (UITableView *)tableView
{
UIView *view = [UIView new];
view.backgroundColor = [UIColor clearColor];
[tableView setTableFooterView:view];
}
Cell中的代理方法
/**
初始化方法
使用代碼建立Cell的時候會被調用,若是使用XIB或者Storyboard,此方法不會被調用
*/
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
/**
從XIB被加載以後,會自動被調用,若是使用純代碼,不會被執行
*/
- (void)awakeFromNib
Cell 被選中或者取消選中是都會被調用
若是是自定義Cell控件,全部的子控件都應該添加到contentView中
- (void)setSelected:(BOOL)selected animated:(BOOL)animated
UIView的經常使用方法:
-(void)addSubview:(UIVIew *)view;添加一個子控件
-(void)removeFromSuperview; 從父控件中移除
-(UIView *)viewWithTag:(NSInteger)tag;根據tag表示尋找到對應的控件(通常是用於尋找子控件)
加載xib文件:
NSArray *array=[[NSBundle mainBundle] loadNibName:@「HMAppView」owne:nil options:nil];
UIView *view=[array firstObject];
計算給定文本字符串
UILabel要換行就要給設置行爲0;
_textView.numberOfLines=0;
boundingRectWithSize計算給定文本字符串所佔的區域
返回值是一個x,y = 0的CGRect,w,h是計算好的寬高
若是要計算多行的準確高度,須要傳入NSStringDrawingUsesLineFragmentOrigin選項
dict用於指定字體的相關屬性的字典,UIKit框架中的第一個頭文件
context: nil
NSDictionary *nameDict = @{NSFontAttributeName: kNameFont};
CGRect nameFrame = [self.
status.name boundingRectWithSize:CGSizeMake(MAXFLOAT, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:nameDict context:nil];
nameFrame.origin.x = CGRectGetMaxX(self.iconView.frame) + padding;
nameFrame.origin.y = padding + (self.iconView.bounds.size.height - nameFrame.size.height) * 0.5;
self.nameView.frame = nameFrame;
代碼塊存放路徑:
/Users/a625/Library/Developer/Xcode/UserData/CodeSnippets
uitableview繼承自uiscrollview
須要知道共有多少行,每一行有多高才能計算出UIscrollview的高度
知道每一行的高度,就能夠計算出每個屏幕顯示多數航,才計算出表格明細方法的執行次數
tableview .rowhight 的效率比代理更高,若是行高同樣就用屬性,不同用代理
修改控件大小:
-(IBAction)top:(UIButton *)sender{
CGRect btnFrame=self.HeadBtn.Fram;
btnFrame.origin-=10;
self.headBtn.fram=btnFrame;
}
下面代碼錯誤的,oc規定不容許直接修改對象的結構體屬性的成員
self。headBtn.frmae.origin.y-=10;
代碼建立按鈕:
1.建立一個自定義的按鈕
UIButton *btn=[UIButton buttonWithTypeCustom];
2.添加按鈕
[self.view addSubview:btn];
3.設置按鈕的位置和尺寸
btn.frame=CGRectMake(100,100,100,100);
4.監聽按鈕的點擊事件(點擊按鈕後就會調用self的btnClick方法)
[btn addTarget:self action:@selector(btnClick) forControlEvents:UIControlEventTouchUpInside];
5.設置按鈕在在默認狀態下的屬性
5.1默認狀態下的背景
[btn setBackgroundImage:[UIImage imageName@「btn_01」] forState:UIControlStateNormal];
5.2.設置默認狀態下的文字:千萬不要用btn.titleLabel.text=@「sdsd」;
[btn setTitle:@「點我啊」forState:UIControlStateNormal];
5.3 默認狀態的文字顏色
[btn setTitleColor:[UIColor redColor]forState:UIControlStateNormal];
6.設置按鈕在高亮狀態下的屬性
6.1 高亮狀態的背景
[btn setBackgroupImage:[UIImage imageName:@「btn_01」] forState:UIControlStateHighlighted];
6.2 高亮狀態下的文字顏色
[btn setTitle:@「摸我幹啥」forState:UIControlStateHighlighted];
6.3 高亮狀態下文字顏色
[btn setTitleColor:[UIColor blueColor] forState:UIControlStateHightlighted];
修改按鍵的字體(titleLabel 是隻讀的 readonly 表示不容許修改titleLabel的指針)
btn.titleLabel.font=[UIFont sysTemFontOfsize 13];
sender.currentTitle 取出當前按鈕的標題文字
CGRectGetMaxY(lable.frame);
frame屬性,通常不要修改,一般用於實例化控件,指定初始位置
若是須要改變控件大小,使用bounds
若是須要改變控件位置,使用center
@property
1.生成getter()方法
2.生成setter() 方法
3生成帶下劃線的成員變量(紀錄屬性內容)
readonly的屬性不會生成帶下劃線的成員變量
@synthesize 能夠合成出來 @synthesize image=_image;
代理的相關
1.遵照相關的協議,預先定義好方法,具體的實現工做有代理負責
<控件名稱+DataSource> 定義的數據有關的方法
<控件名稱+Delegate> 定義的與事件有關的方法,一般用來監聽控件事件的
2.代理方法
1> 方面名以控件名稱開口(沒有前綴) ->方便程序員編寫的時候快速找到須要的方法
2> 第一個參數是本身->意味着在協議方法中能夠直接訪問對象的屬性,或者調用方法
3>代理方法的返回值->控制器向控件(委託)發送數據
內存管理:
控件:
若是是託線,用Weak
若是是代碼,用Strong
NString 用copy
數字型的int 使用Assig
圖片:
JPG:壓縮比較高,一般用於照片,網頁,有損壓縮,解壓縮時 對cpu消耗大,意味慢,費電
PNG: 壓縮比高,無損壓縮,
UIScrollView
self.scrollView.contentInset=UIEdgeInsetsMake(20, 20, 20, 20);
self.scrollView.showsHorizontalScrollIndicator=NO;
self.scrollView.showsVerticalScrollIndicator=NO;
偏移位置
self.scrollView.contentOffset=CGPointMake(100, 100);
self.scrollView.bounces=NO;取消彈簧效果
contentSize 會根據邊距調整offset
contentInset 不會調整offset
動畫的兩種方式:
1.頭尾式
[UIView beginAnimations:nil context:nil];
/**須要執行的動畫**/
[UIViewcommitAnimations];
2.Block式
[UIView animateWithDuration:0.5 animations:^{
/**須要執行動畫的代碼**/
}];
修改控件的位置和尺寸:
位置
frame.origin 原點
center 中心
尺寸:
frame.size
bounds.sizes
查看是否調用該函數
NSLog(「%@」,__func__);
在get方法中
,若是跟本身相關的用下劃線,不相干的用self
字典轉模型
-(NSArray)appList
{
if(appList==nil)
{
NSArray *array=[NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] PathForResouce:@「app.plist」 ofType:nil]];
建立一個臨時數組
NSMutableArray *arrayM=[MSMutableArray array];
for(NSDictionary *dict in array)
{
HMAppInfo *appInfo=[[HMAppInfo alloc]init];
appInfo.name=dict[@「name」];
appInfo.icon =dict[@「icon」];
[arrayM oddObject:appInfo];
}
將臨時數組複製給屬性
_appList=arrayM;
}
return _appList;
}
使用時:
先實例化:HMAppInfo *appInfo=self.appList[i];
再使用: icon.image=[UIImage imageName:appInfo.icon];
UITextView 光標再也不最開始位置
self.automaticallyAdjustsScrollViewInsets = NO;
設置標籤欄屬性
UITabBarItem*item =self.tabBarController.tabBar.items[0];
UIImage*imageNomal = [[UIImage imageNamed:@"table_zhuye_off"]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
item.image= imageNomal;
UIImage*imageSelected = [[UIImage imageNamed:@"table_zhuye_on"]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
item.selectedImage= imageSelected;
self.tabBarController.tabBar.barTintColor = [UIColor whiteColor];
self.tabBarController.tabBar.translucent = false; 關閉透明
self.tabBarController.tabBar.tintColor = [UIColor colorWithRed:0.359 green:0.902 blue:0.296 alpha:1.000];
退出鍵盤
方法一:[self.textfield resigFirstResponder];
方法二:[self.view endEditing:YES];Yes是否性關閉鍵盤
transform修改控件的位移(位置),縮放,旋轉
建立一個transform屬性相對初始
CGAffineTransForm CGAffineTransformMakeTransLation(CGFloat tx,CGFloat ty);左右移動
CGAffineTransForm CGAffineTransformMakeScale(CGFloat sx,CGFloat sy);放大縮小
CGAffineTransForm CGAffineTransformMakeRotaton(CGFloat angle); angle是弧度制,,排M_PI_4
在某個transform的基礎上進行疊加
CGAffienTransForm CGAffienTransformTransSlate(CGAffienTransForm t,CGFloat tx.CGFloat ty);
CGAffienTransForm CGAffienTransFormScale(CGAffienTransform t , CGFloat sx,CGFloat sy);
CGAffienTransForm CgAffeinTransformRotate(CGAffienTransform t,CGFloat angle);
清空以前設置的transForm屬性
view.transfrom=CGAffineTransformIdentity;
例:
self.butotn.transform=CGAffineTransForMakeTranslation(0,-100);向上平移100;
NSLog(@「%@」,NSStringFromCGAffineTRansfor(self.button.transform));
self.button.transform=CGAffineTransFormRotate(self.button.transform,-M_PI_4);//逆時針旋轉45度
UIImage加載圖片:
一個UIImage對象表明了一張圖片,通常經過Image:@」圖片名「加載圖片(png格式的圖片能夠省略拓展名)
UIImage *image=[UI image imageName:@「btn_01」];
imageNamed :圖像是實例化以後由系統 負責,
String *path=[[NSBundle mainBundle] pathForResource:imageName];
可使用:UIImae *image=[UIImage imageWithContentsOfFile:path];//可是不能放在images.xcassets
解析Plist文件
1.獲取Plist文件路徑
NSBundle *bundle=[NSBundle MianBundle];
NSString *path=[bundle pathForResource:@「imageData」 ofType:@「plist」];
2.懶加載Plist文件
_image=[NSArray arrayWithContentOfFile:path];
-(NSArray *)image
{
if(_image==nil){
NSBundle *bundle=[NSBundle MianBundle];
NSString *path=[bundle pathForResource:@「imageData」 ofType:@「plist」];
_image=[NSArray arrayWithContentOfFile:path];
}
return _image;
}
get()懶加載
在get()方法中不要在調用get()方法了,self.btn是屬於get()方法,_btn 是變量名,不屬於get()方法
在懶加載中屬於get()方法,全部懶加載中不能出現self.btn~ 否則會出現死循環
時鐘
scheduledTimerWithTimeInterval 方法本質上就是建立一個時鐘,
添加到運行循環的模式是DefaultRunLoopMode
self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateTimer:) userInfo:@"hello timer" repeats:YES];
與1等價
self.timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(updateTimer:) userInfo:nil repeats:YES];
將timer添加到運行循環
模式:默認的運行循環模式
[[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSDefaultRunLoopMode];
self.timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(updateTimer:) userInfo:nil repeats:YES];
將timer添加到運行循環
模式:NSRunLoopCommonModes的運行循環模式(監聽滾動模式)
[[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
中止時鐘
[self.timer invalidate];
枚舉
枚舉類型本質上是整數,定義的時候,若是指定了第一個整數值,而後後面的就會遞增
枚舉時解決魔法數字的很好工具
typedef enum{
KmovingDirTop=10;
KmovingDirBottom;
KmovingDirLeft;
KmovingDirRigth
}KmoingDir;
通知中心傳值:
發送通知
[[NSNotificationCenter defaultCenter]postNotificationName:@"categoryDidChanged" object:nil userInfo:@{@"categoryModel":_seletedModel}];
接受:
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(categoryChange:) name:@"categoryDidChanged" object:nil];
- (void)categoryChange:(NSNotification*)noti{
CategoriyModel *md = (CategoriyModel*)noti.userInfo[@"categoryModel"];
NSString *str = noti.userInfo[@"subCategoryName"];
NSLog(@"右表:%@",str);
}
- (void)dealloc{
[[NSNotificationCenter defaultCenter]removeObserver:self];
}
UITableviewCell 更新
一個section刷新
NSIndexSet *indexSet=[[NSIndexSet alloc]initWithIndex:2];
[tableview reloadSections:indexSet withRowAnimation:UITableViewRowAnimationAutomatic];
一個cell刷新
NSIndexPath *indexPath=[NSIndexPath indexPathForRow:3 inSection:0];
[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath,nil] withRowAnimation:UITableViewRowAnimationNone];
獲取屏幕高度
#define kScreenWidth [UIScreen mainScreen].bounds.size.width
#define kScreenHeight [UIScreen mainScreen].bounds.size.height
生成隨機數
arc4random_uniform(10) => 0~9之間的隨機數
ARC 編譯:
-fno-objc-arc
AFNetworking 的使用:
1.建立
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
2.指定解析器
manager 默認狀況下是解析 json plist
xml 手動設置
manager.responseSerializer
manager.requestSerializer
aplication/json text/json
3.get/post 請求
接口地址 urlString
請求參數
網絡請求成功後的回調 blocks
[manager GET:<#(NSString *)#> parameters:<#(id)#> success:^(AFHTTPRequestOperation *operation, id responseObject) {
成功後的操做
operation.resposeData
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
請求失敗後的操做
NSLog(@"%@",error);
}];
post
[manager POST:url parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
發送後的回調
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
發送失敗後的回調
}];
1. 網絡下載數據而後把數據轉爲圖片 再加載
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"image/jpeg"];
[manager GET:imageURL parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"下載圖片成功!");
iv.image = [UIImage imageWithData:operation.responseData];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"%@",error);
}];
-(void)download{
&tag=1001011&telephone=18398850943&password=111111
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
@{@"tag" : @"100111"}
success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSString *string=[[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
NSData* jsonData=[string dataUsingEncoding:NSUTF8StringEncoding];
_dataArray= [NSJSONSerialization
JSONObjectWithData:jsonData
options:NSJSONReadingMutableContainers
error:nil];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
}
SDWebImage的使用:
[iv sd_setImageWithURL:[NSURL URLWithString:imageURL]];
UITapGestureRecognizer *tapGestureRecognize = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(backGroundOnclick)];
tapGestureRecognize.delegate = self;
[self.view addGestureRecognizer:tapGestureRecognize];
刪除storyboard:
1.刪除storyboard
2.general 中刪除「main」
3.屏幕初始化:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
self.window.backgroundColor = [UIColor whiteColor];
建立導航欄 須要傳入一個UICollectionViewController
FirstViewController *fvc = [[FirstViewController alloc]init];
MyNavController *nav = [[MyNavController alloc]initWithRootViewController:fvc];
self.window.rootViewController = nav;//
[self.window makeKeyAndVisible];
return YES;
}
按鈕監聽事件:
- (void)addtarget:(id)target action:(SEL)action{
[self.button addTarget:target action:action forControlEvents:UIControlEventTouchUpInside];
}
[first addtarget:self action:@selector(firstClick)];
#pragma mark - 點擊事件
- (void)firstClick{
[self createPopver];
}
獲取plist文件數據
獲取plist文件地址
NSString *file = [[NSBundle mainBundle]pathForResource:@"categories.plist" ofType:nil];
加載plist爲數組
NSArray *plistArray = [NSArray arrayWithContentsOfFile:file];
關閉popview 的自動適應屏幕屬性:
pop.autoresizingMask = UIViewAutoresizingNone;
屏幕切換動態效果:
nav.modalPresentationStyle = UIModalPresentationFormSheet;
隱藏導航欄;
[self.navigationController setNavigationBarHidden:YES animated:YES];
設置tabbar的初始位置:
self.selectedIndex=button.1;
判斷網絡鏈接:
OOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
開啓網絡指示器
[[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES];
基準網站
監聽結果回調
AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:url];
NSOperationQueue *operationQueue = manager.operationQueue;
[manager.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
switch (status) {
case AFNetworkReachabilityStatusReachableViaWWAN:
case AFNetworkReachabilityStatusReachableViaWiFi:
[operationQueue setSuspended:NO];
NSLog(@"有網絡");
break;
case AFNetworkReachabilityStatusNotReachable:
default:
[operationQueue setSuspended:YES];
NSLog(@"無網絡");
break;
}
}];
開始監聽
[manager.reachabilityManager startMonitoring];
UILabel 自動換行和自適應
要想UI Label自動換行,line設置爲0
1.N行徹底自適應:
UILabel *testLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 30, 100, 21)];
NSString *txt = @"dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";
testLabel.numberOfLines = 0; 至關於不限制行數
testLabel.text = txt;
這樣不行,還須要調用 [testLabel sizeToFit];
2.限制在N行內自適應:
UILabel *testLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 30, 100, 21)];
NSString *txt = @"dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";
testLabel.numberOfLines = 3; 限制在3行內自適應
testLabel.text = txt;
[testLabel sizeToFit];
結果不起做用,所有在一行顯示了。
3.爲了實現2的需求,須要這麼作:
CGSize maxSize = CGSizeMake(100, 21*3);
UILabel *testLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 30, 100, 21)];
NSString *txt = @"dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";
CGSize labelSize = [txt sizeWithFont:testLabel.font constrainedToSize:maxSize lineBreakMode: UILineBreakModeTailTruncation];
testLabel.frame = CGRectMake(testLabel.frame.origin.x, testLabel.frame.origin.y, labelSize.width, labelSize.height);
testLabel.text = txt;
NSString:
建立一個字符串常量
NSString *string1 = @"hello";
string1 = @"hello world";
NSLog(@"%@",string1);
建立字符串
NSString *string2 = [[NSString alloc] initWithString:@"hello"];
initWithFormat:多個字符串拼接
NSString *string3 = [[NSString alloc] initWithFormat:@"hello %@",string2];
NSLog(@"string2 = %@",string2);
NSLog(@"string3 = %@",string3);
NSString *ss1 = [[NSString alloc] initWithFormat:@"ZHANGsan"];
NSString *ss2 = [[NSString alloc] initWithFormat:@"zhangsan"];
NSLog(@"[ss1 caseInsensitiveCompare:ss2]:%ld",[ss1 caseInsensitiveCompare:ss2]);
建立空的字符串
NSString *string4 = [[NSString alloc] init]; //等價於string4 = @"";
stringWithFormat:使用類方法建立字符串對象
NSString *string5 = [NSString stringWithString:@"hello"]; //等價於string5 = @"hello";
NSString *string6 = [NSString stringWithFormat:@"hello %@",@"world"];
使用格式化符拼接數值
int number = 101;
NSString *string7 = [NSString stringWithFormat:@"class:%d",number];
NSLog(@"string7=%@",string7);
字符串的比較
NSString *s0 = @"Ediosn";
NSString *s11 = @"Edison"; //s0與s11的指針地址是同樣的,指向的都是常量區同一個字符串對象
NSString *s1 = [NSString stringWithFormat:@"Ediosn"];
NSString *s2 = [[NSString alloc] initWithFormat:@「Ediosn"];
判斷s1與s2的指針地址是否相等
if (s0 == s2) { 不相等,由於是兩個對象,指針地址不同
NSLog(@"s0 == s2");
}
isEqualToString: 是比較兩個字符串內容是否相同
if ([s0 isEqualToString:s2]) {
NSLog(@"s0與s2的字符串內容相同");
}
NSObject *obj1;
NSObject *obj2;
NSString *string8 = @"a";
NSString *string9 = @"A";
compare: 比較字符串的大小
NSComparisonResult result = [string8 compare:string9];
if (result == NSOrderedAscending) { 結果爲升序
NSLog(@"string8 < string9");
} else if(result == NSOrderedSame) {
NSLog(@"string8 string9 內容同樣");
} else if(result == NSOrderedDescending) {
NSLog(@"string8 > string9");
}
length: 獲取字符串的長度
NSString *string10 = @"abcdef";
NSInteger len = [string10 length];
NSLog(@"len = %ld",len);
NSString *string11 = @"hELlo";
uppercaseString:將字符串中的字母轉成大寫
NSLog(@"upper:%@",[string11 uppercaseString]);
uppercaseString
NSLog(@"lower:%@",[string11 lowercaseString]);
capitalizedString:首字母大寫,其餘字母小寫
NSLog(@"capitalized:%@",[string11 capitalizedString]);
將字符串轉成基本數據類型
NSString *string12 = @"3.14";
float f = (float)string12; 錯誤
floatValue:字符串中是一個浮點數值轉成float
float f = [string12 floatValue];
NSLog(@"floatValue:%f",f);
NSString *string13 = @"1";
BOOL bo = [string13 boolValue]; //true
---------------(4)字符串截取--------------------
NSString *string14 = @"abcdef";
---------------(4)字符串截取--------------------
NSString *substring1 = [string14 substringToIndex:3];
NSLog(@"substringToIndex:%@",substring1);
substringFromIndex:從指定索引位置開始截取到末尾,包含指定的索引f
NSString *substring2 = [string14 substringFromIndex:1];
NSLog(@"substringFromIndex:%@",substring2);
NSRange rang = {2,3}; 2:指定位置 3:須要截取的長度
substringWithRange:截取指定範圍的字符串
NSString *substring3 = [string14 substringWithRange:rang];
NSLog(@"substringWithRange:%@",substring3);
NSArray *array = [string componentsSeparatedByString:@"A"]; 從字符A中分隔成2個元素的數組
---------------(5)拼接字符串--------------------
NSString *str1 = @"Hello";
NSString *str2 = @"World";
NSString *str3 = @"OC!";
NSString *string15 = [NSString stringWithFormat:@"%@-%@-%@",str1,str2,str3];
NSLog(@"string15:%@",string15);
字符串追加
NSString *string16 = [string15 stringByAppendingString:@"-iOS"];
NSString *string17 = [string15 stringByAppendingFormat:@"%@,%@",@"iOS",@"iPhone"];
NSLog(@"string16:%@",string16);
NSLog(@"string17:%@",string17);
字符串追加
rangeOfString:查找字符串所在的位置
NSRange linkRang = [link rangeOfString:@"html"];
if (linkRang.location != NSNotFound) {
NSLog(@"location:%ld,length:%ld",linkRang.location,linkRang.length);
}
/*___________________________NSMutableString(不可變字符串)__________________________*/
NSMutableString *mutableString1 = @"string"; 錯誤
NSMutableString *mutableString1 = [[NSMutableString alloc] initWithFormat:@"字符串"];
insertString: 在原有的字符串基礎上插入字符串
[mutableString1 insertString:@"可變" atIndex:0];
NSLog(@"mutableString1:%@",mutableString1);
NSMutableString *mutableString2 = [NSMutableString stringWithFormat:@"字符符符串"];
rangeOfString:查找指定字符串所在的範圍
NSRange rang3 = [mutableString2 rangeOfString:@"符符"];
deleteCharactersInRange:根據範圍刪除指定的字符串
[mutableString2 deleteCharactersInRange:rang3];
NSLog(@"mutableString2:%@",mutableString2);
NSMutableString *mutableString3 = [NSMutableString stringWithFormat:@"字符串"];
NSRange rang4 = [mutableString3 rangeOfString:@"字符"];
replaceCharactersInRange:withString: 字符串替換
[mutableString3 replaceCharactersInRange:rang4
withString:@"羊肉"];
NSLog(@"mutableString3:%@",mutableString3);
NSArray:
/*_________________________不可變數組(NSArray)_______________________________*/
---------------------1.數組的建立--------------------------
NSString *s1 = @"zhangsan";
NSString *s2 = @"lisi";
NSString *s3 = @"wangwu";
NSArray *array1 = [[NSArray alloc] initWithObjects:s1,s2,s3, nil];
NSLog(@"%@",array1);
類方法建立,注意:最後以nil結尾。
NSArray *array2 = [NSArray arrayWithObjects:s1,s2,s3, nil];
初始一個元素對象
NSArray *array3 = [NSArray arrayWithObject:s1];
建立一個數組,此數組中的元素來自array1
NSArray *array4 = [NSArray arrayWithArray:array1];
---------------------2.經過下標取元素--------------------------
NSString *str1 = [array4 objectAtIndex:0];
NSLog(@"str1 = %@",str1);
---------------------3.數組的元素個數--------------------------
NSUInteger count = [array4 count];
NSUInteger count2 = array4.count; 點語法等價於-> [array4 count];注意count是不能帶參數
NSLog(@"count2 = %ld",count2);
---------------------4.判斷是否包含某個對象--------------------------
BOOL isContains = [array4 containsObject:@"zhangsan"];
NSLog(@"isContains: %d",isContains);
---------------------5.對象在數組中的索引位置--------------------------
NSUInteger index = [array4 indexOfObject:@"wangwu"];
NSLog(@"index = %ld",index);
---------------------6.連接數組中的字符串--------------------------
注意:數組中的元素必須都是字符串,纔可使用此方法
NSString *joinString = [array4 componentsJoinedByString:@","];
NSLog(@"join:%@",joinString); //zhangsan,lisi,wangwu
---------------------7.訪問最後一個元素--------------------------
NSString *last = [array4 lastObject]; //等價於點語法:array4.lastObject;
NSLog(@"last:%@",last);
---------------------8.在原來的數組上追加對象--------------------------
追加以後,建立了一個新的數組
NSArray *array5 = [array4 arrayByAddingObject:@"zhaoliu"];
NSLog(@"array5:%@",array5);
/*
注意:1.數組中不能存放基本數據類型,只能存放對象
2.數組越界
*/
NSArray *array6 = [NSArray arrayWithObject:100]; //錯誤,基本數據類型不能存放到數組中
int idx = 4;
if (idx < array5.count) { 嚴謹的寫法,只有下標小於元素個數時,纔可使用下標取元素
[array5 objectAtIndex:idx];
}
---------------xcode4.4之後對數組的建立和訪問,語法上作了優化---------------
1.建立一個數組
NSArray *array7 = @[s1,s2,s3];
等價於NSArray *array2 = [NSArray arrayWithObjects:s1,s2,s3, nil];
NSLog(@"array7=%@",array7);
NSString *str = array7[0];
NSLog(@"array7[0] = %@",str);
/*_________________________可變數組(NSMutableArray)_______________________________*
NSString *t1 = @"zhangsan";
NSString *t2 = @"lisi";
NSString *t3 = @"wangwu";
---------------------1.建立可變數組--------------------------
NSMutableArray *marray1 = [[NSMutableArray alloc] initWithObjects:t1,t2,t3, nil];
建立數組時,開闢3個空間來存儲元素,當存儲的元素超過3個時,系統會自動增大此數組的空間
NSMutableArray *marray2 = [[NSMutableArray alloc] initWithCapacity:3];
NSMutableArray *marray3 = [NSMutableArray arrayWithCapacity:3];
新語法建立的是不可變數組
NSMutableArray *marray4 = @[s1,s2,s3]; //錯誤
---------------------2.添加元素--------------------------
[marray2 addObject:s1];
[marray2 addObject:s2];
[marray2 addObject:s3];
將marray2中全部的元素全都添加到marray3中
[marray3 addObjectsFromArray:marray2];
這是marray2添加到marray3中,marray3則是個二維數組
[marray3 addObject:marray2];
---------------------3.插入元素--------------------------
[marray2 insertObject:@"趙六" atIndex:0];
NSLog(@"marray2 = %@",marray2);
[marray2 insertObject:@"zhaoliu" atIndex:0]; 錯誤,數組越界
---------------------4.替換元素--------------------------
[marray2 replaceObjectAtIndex:1 withObject:@"zhangfei"];
NSLog(@"marray2 = %@",marray2);
---------------------5.互換兩個元素的位置--------------------------
[marray2 exchangeObjectAtIndex:3 withObjectAtIndex:2];
NSLog(@"marray2 = %@",marray2);
---------------------6.將另一個數組的全部元素添加到當前數組--------------------------
[marray3 addObjectsFromArray:marray2];
---------------------7.刪除元素--------------------------
/*
7.1根據下標刪除
[marray2 removeObjectAtIndex:0];
NSLog(@"marray2 = %@",marray2);
7.2根據對象刪除
[marray2 removeObject:@"zhangfei"];
NSLog(@"marray2 = %@",marray2);
7.3刪除最後一個元素
[marray2 removeLastObject];
NSLog(@"marray2 = %@",marray2);
7.4刪除全部元素
[marray2 removeAllObjects];
NSLog(@"marray2 = %@",marray2);
*/
---------------------遍歷數組--------------------------
1.普通遍歷
/*
for (int i=0; i<marray2.count; i++) {
NSString *str = [marray2 objectAtIndex:i];
// NSString *str2 = marray2[i];
NSLog(@"%@",str);
}
*/
2.快速遍歷
for (NSString *s in marray2) {
NSLog(@"%@",s);
}
3.
- (void)viewDidLoad
{
[super viewDidLoad];
塊代碼
NSArray *array = @[@(1), @(2), @(3), @(4), @(5)];
排序
array = [array sortedArrayUsingComparator:^NSComparisonResult(NSNumber *num1, NSNumber *num2) {
亂序=>一會升序,一會降序
隨機
arc4random_uniform(10) => 0~9之間的隨機數
int seed = arc4random_uniform(2);
if (seed) {
return [num1 compare:num2];
} else {
return [num2 compare:num1];
}
}];
NSLog(@"%@", array);
}
- (void)sortWith:(NSArray *)array
{
排序
array = [array sortedArrayUsingComparator:^NSComparisonResult(NSNumber *num1, NSNumber *num2) {
/**
1 4 5 2
4 1 5 2
4 1 5 2
5 4 1 2
5 4 1 2
5 4 2 1
*/
NSLog(@"%@ %@", num1, num2);
升序
return [num1 compare:num2];
降序
return [num2 compare:num1];
}];
NSLog(@"%@", array);
}
- (void)arrayWith:(NSArray *)array
{
int i = 0;
for (NSNumber *num in array) {
NSLog(@"%@", num);
if (i == 1) {
break;
}
i++;
}
參數:對象,索引,是否中斷
數組的塊方法遍歷的效率比for in高
[array enumerateObjectsUsingBlock:^(NSNumber *obj, NSUInteger idx, BOOL *stop) {
NSLog(@"%@", obj);
// idx == 1 退出循環
if (idx == 1) {
*stop = YES;
}
}];
}
NSDictonary:
/*________________________不可變字典(NSDictonary)___________________________*/
1.字典的建立
NSArray *array1 = [NSArray arrayWithObjects:@"zhangsan",@"zhangfei", nil];
NSArray *array2 = [NSArray arrayWithObjects:@"lisi",@"liping", nil];
第一個元素:key:@「zhang」 value:array1
第二個元素:key:@"li" value:array2
NSDictionary *dic1 = [[NSDictionary alloc] initWithObjectsAndKeys:array1,@"zhang",array2,@"li", nil];
NSUInteger count = [dic1 count];
NSLog(@"count:%ld",count);
NSDictionary *dic2 = [NSDictionary dictionaryWithObjectsAndKeys:array1,@"zhang",array2,@"lisi", nil];
建立字典時,初始化了一個元素
NSDictionary *dic3 = [NSDictionary dictionaryWithObject:array1 forKey:@"zhangsan"];
2.獲取字典中元素的個數
NSUInteger count2 = [dic1 count];
3.獲取字典中全部的key
NSArray *allkeys = [dic1 allKeys];
NSLog(@"allkeys:%@",allkeys);
4.獲取字典中全部的value
NSArray *allvalues = [dic1 allValues];
NSLog(@"allvalues:%@",allvalues);
5.經過key取得value
NSArray *array3 = [dic1 objectForKey:@"zhang"];
NSLog(@"array3:%@",array3);
/*________________________字典的新語法___________________________*/
建立的語法:{"key1":"value1","key2":"value2"};
新語法建立字典
NSDictionary *dic4 = @{@"zhang":array1,@"li":array2};
NSLog(@"dic4:%@",dic4);
取value的語法:字典["key"]
NSArray *array4 = dic4[@"zhang"];
NSLog(@"array4:%@",array4);
使用字典存儲一個工人的信息
/*
{
"name": "zhangsan", 工人的姓名
"age" : "22" 工人的年齡
...
}
*/
NSDictionary *worker = [NSDictionary dictionaryWithObjectsAndKeys:@"zhangsan",@"name",@"23",@"age", nil];
/*________________________可變字典(NSMutableDictionary)___________________________*/
1.建立一個可變的數組
NSMutableDictionary *mdic1 = [[NSMutableDictionary alloc] initWithCapacity:3];
NSMutableDictionary *mdic2 = [NSMutableDictionary dictionaryWithCapacity:3];
2.添加元素
[mdic1 setObject:array1 forKey:@"zhang"];
[mdic1 setObject:array2 forKey:@"li"];
將字典dic1中的元素添加到此字典中
[mdic1 addEntriesFromDictionary:dic1]; 注意:相同的key是不能重複添加到字典中
NSLog(@"mdic1:%@",mdic1);
3.刪除
根據key刪除元素
[mdic1 removeObjectForKey:@"zhang"];
刪除多個元素
[mdic1 removeObjectsForKeys:@[@"zhang",@"li"]];
NSLog(@"mdic1:%@",mdic1);
刪除全部的元素
[mdic1 removeAllObjects];
1.第一種方式
/*
for (NSString *key in mdic1) {
NSArray *names = [mdic1 objectForKey:key];
NSLog(@"names:%@",names);
}
*/
2.第二種方式
/*
NSArray *keys = [mdic1 allKeys];
for (int i=0; i<keys.count; i++) {
NSString *key = [keys objectAtIndex:i];
NSArray *names = [mdic1 objectForKey:key];
NSLog(@"names:%@",names);
}
*/
3.第三種方式
獲取枚舉對象,枚舉對象中存儲的是字典裏全部的key
NSEnumerator *enumer = [mdic1 keyEnumerator];
讓枚舉對象的遊標指向下一個對象
id key = [enumer nextObject];
while (key != nil) {
NSArray *names = [mdic1 objectForKey:key];
NSLog(@"names:%@",names);
key = [enumer nextObject];
}
數組也可使用枚舉對象遍歷
/*
NSArray *array = [NSArray array];
NSEnumerator *enumer2 = [array objectEnumerator];
*/
/*________________________字典排序___________________________*/
NSDictionary *sortDic = @{
@"zhangsan":@"50",
@"lisi":@"90",
@"wangwu":@"80",
@"zhao6":@"60"
};
對字典中的value進行排序,參數obj1,obj2是字典中的value
返回值是排好序的key
NSArray *sortedKeys = [sortDic keysSortedByValueUsingComparator:^NSComparisonResult(id obj1, id obj2) {
int v1 = [obj1 intValue];
int v2 = [obj2 intValue];
if (v1 > v2) {
return NSOrderedDescending;
} else if(v1 < v2) {
return NSOrderedAscending;
}
return NSOrderedSame;
}];
for (NSString *name in sortedKeys) {
NSString *score = [sortDic objectForKey:name];
NSLog(@"name:%@,score:%@",name,score);
}
NSSet
1.NSSet的建立
NSString *s1 = @"zhangsan";
NSString *s2 = @"lisi";
NSSet *set1 = [[NSSet alloc] initWithObjects:s1,s2, nil];
NSSet *set2 = [NSSet setWithObjects:s1,s2, nil];
把數組array中的全部元素,存儲到set3中
NSSet *set3 = [NSSet setWithArray:array];
2.NSSet轉成數組
NSArray *array1 = [set1 allObjects];
3.返回元素的個數
NSUInteger count = [set1 count];
4.從容器中隨機取出一個元素
NSString *string1 = [set1 anyObject];
5.判斷某一個對象是否在NSSet中
BOOL isContains = [set1 containsObject:@"lisi"];
6.NSSet中不能重複存同一個對象
數組中是能夠存取重複的對象
NSString *str = @"jack";
NSArray *array2 = [NSArray arrayWithObjects:str,str, nil];
NSLog(@"%@",array2);
NSSet中不能重複存儲相同的對象
NSSet *set4 = [NSSet setWithObjects:str,str, nil];
NSLog(@"%@",set4);
/*
NSSet與NSArray的區別
1. 數組是有下標,NSSet是沒有下標的
2. 數組是有序的,NSSet是無序的
3. 數組是能夠重複存儲同一個對象,NSSet反之,不能重複存儲對象
*/
NSMutableSet
NSNumber:
/*_______________________________NSNumber的使用___________________________________*/
1.建立NSNumber(包裝基本數據類型)
NSNumber *intNumber = [NSNumber numberWithInt:100];
NSNumber *floatNumber = [NSNumber numberWithFloat:9.8f];
NSNumber *longNumber = [NSNumber numberWithLong:145677766666];
NSNumber *boolNumber = [NSNumber numberWithBool:YES];
NSArray *array = @[intNumber,floatNumber,longNumber,boolNumber];
NSLog(@"array=%@",array);
2.解包
int intValue = [intNumber intValue];
float floatValue = [floatNumber floatValue];
long longValue = [longNumber longValue];
BOOL boolValue = [boolNumber boolValue];
3.新語法建立Number對象
NSNumber *intNumber1 = @12; //@"123";
NSNumber *floatNumber1 = @12.0f;
NSNumber *longValue1 = @19929292992;
NSNumber *boolValue1 = @YES;
NSNumber *charValue = @'a';
/*_______________________________NSValue的使用___________________________________*/
struct WXPoint {
float x;
float y;
};
1.建立NSValue(包裝結構體), NSValue是NSNumber的父類
注意:結構體不是對象
NSRange rang = {100,6};
NSRange封包
NSValue *rangValue = [NSValue valueWithRange:rang];
NSPoint封包
NSValue *pointValue = [NSValue valueWithPoint:<#(NSPoint)#>];
將自定義的結構體包裝成NSValue對象
struct WXPoint p = {50,100};
NSValue *pointValue = [NSValue value:&p withObjCType:@encode(struct WXPoint)];
2.解包結構體
struct WXPoint p2;
[pointValue getValue:&p2];
NSLog(@"x=%f,y=%f",p2.x,p2.y);
3.NSNull對象
NSNull *n1 = [NSNull null];
NSNull *n2 = [NSNull null];
NSArray *arrayNull = @[n1,n2];
NSLog(@"%@",arrayNull);
for (id item in arrayNull) {
判斷數組中的對象是否爲一個NSNull對象,若是是,則過濾掉
if (item == [NSNull null]) {
continue;
}
}
NSDate:
/*__________________________NSDate的使用_____________________________*/
1.建立日期
NSDate *date1 = [NSDate date]; 建立了一個當前的日期對象
NSDate *date2 = [[NSDate alloc] init];
NSLog(@"date2:%@",date2);
在當前日期的基礎上累加一個數值,單位是秒
明天
NSDate *date3 = [NSDate dateWithTimeIntervalSinceNow:24*60*60];
NSLog(@"date3:%@",date3);
昨天
NSDate *date4 = [NSDate dateWithTimeIntervalSinceNow:-24*60*60];
NSLog(@"date4:%@",date4);
在1970年上加一個數值,該數值是一個時間戳數值
NSDate *date1970 = [NSDate dateWithTimeIntervalSince1970:0];
NSLog(@"date1970:%@",date1970);
2.獲取日期的時間戳
NSTimeInterval time1970 = [date1 timeIntervalSince1970];
NSLog(@"time1970:%f",time1970);
取得日期對象date3到當前日期時間的數值差
NSTimeInterval timeNow = [date3 timeIntervalSinceNow];
NSLog(@"timeNow:%f",timeNow);
3.日期的比較
(1)經過日期對象的compare方法進行比較
NSComparisonResult result = [date3 compare:date1];
if (result == NSOrderedDescending) {
NSLog(@"date3 > date1");
}
(2)經過比較時間戳
if ([date3 timeIntervalSince1970] > [date1 timeIntervalSince1970]) {
NSLog(@"date3 > date1");
}
/*__________________________NSDateFormatter格式化日期_____________________________*/
1.日期對象格式化爲字符串: 2013-07-29 15:20:59 2013年07月29日
日期對象 --> 字符串
NSDate *nowDate = [NSDate date];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
設置日期的格式
[dateFormatter setDateFormat:@"yyyy年MM月dd日HH:mm:ss"];
設置時區
NSTimeZone *timezone = [NSTimeZone timeZoneWithName:@"America/New_York"];
[dateFormatter setTimeZone:timezone];
stringFromDate:將日期對象格式化爲字符串
NSString *datestring = [dateFormatter stringFromDate:nowDate];
NSLog(@"格式化以後:%@",datestring);
2.將字符串格式化成日期對象
字符串 ——>日期對象
NSString *string = @"2013年07月29日 16:56:05";
NSDateFormatter *dateFormatter2 = [[NSDateFormatter alloc] init];
[dateFormatter2 setDateFormat:@"yyyy年MM月dd日HH:mm:ss"];
dateFromString: 將字符串格式化成日期對象
NSDate *formatDate = [dateFormatter2 dateFromString:string];
NSLog(@"%@",formatDate);
獲取到全部時區的名稱
NSArray *zoneNames = [NSTimeZone knownTimeZoneNames];
for (NSString *name in zoneNames) {
NSLog(@"%@",name);
}
/*__________________________捕捉異常_____________________________*/
建立一個空數組
NSArray *arr = [NSArray array];
@try { 有可能出異常的代碼塊
數組越界異常
[arr objectAtIndex:5];
}
@catch (NSException *exception) {
若是捕捉到錯誤,則會執行此處的代碼
NSLog(@"錯誤:%@",exception);
}
@finally { @finally是可選的
無論有沒有捕捉到異常,此處代碼都會執行
NSLog(@"@finally");
}
判斷wearNeat方法是否在Student類中定義,若是定義了,才調用
if ([stu respondsToSelector:@selector(wearNeat)]) {
[stu wearNeat];
}
歸檔:數據存儲
/*____________________________第一種形式________________________________*/
/****************對象歸檔********************/
對象------>文件
/*
NSArray *array = [NSArray arrayWithObjects:@"zhangsan",@"lisi",@"中文", nil];
歸檔保存的文件路徑
NSString *filePath = [NSHomeDirectory() stringByAppendingPathComponent:@"array.arc"];
歸檔對象
BOOL success = [NSKeyedArchiver archiveRootObject:array toFile:filePath];
if (success) {
NSLog(@"歸檔成功");
}
*/
/****************解歸檔********************/
/*
文件----->對象
歸檔保存的文件路徑
NSString *filePath = [NSHomeDirectory() stringByAppendingPathComponent:@"array.arc"];
解歸檔
NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
for (NSString *s in array) {
NSLog(@"%@",s);
}
*/
/*____________________________第二種形式________________________________*/
/*
NSArray *array = [NSArray arrayWithObjects:@"zhangsan",@"lisi",@"中文", nil];
此NSMutableData用於存儲歸檔對象中的數據
NSMutableData *data = [NSMutableData data];
建立歸檔對象
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
編碼數據和對象
[archiver encodeObject:array forKey:@"array"];
[archiver encodeInt:100 forKey:@"scope"];
[archiver encodeObject:@"jack" forKey:@"name"];
完成歸檔,將歸檔數據填充至data中,此時data中已經存儲了歸檔對象的數據
[archiver finishEncoding];
[archiver release];
NSString *filePath = [NSHomeDirectory() stringByAppendingPathComponent:@"ar.text"];
將歸檔數據寫入文件
BOOL success = [data writeToFile:filePath atomically:YES];
if (success) {
NSLog(@"arichiver success");
}
*/
NSString *filePath = [NSHomeDirectory() stringByAppendingPathComponent:@"ar.text"];
讀取歸檔數據
NSData *data = [[NSData alloc] initWithContentsOfFile:filePath];
建立解歸檔對象,對data中的數據進行解歸檔
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
解歸檔,還原數據
NSArray *array = [unarchiver decodeObjectForKey:@"array"];
int scope = [unarchiver decodeIntForKey:@"scope"];
NSString *name = [unarchiver decodeObjectForKey:@"name"];
NSLog(@"array=%@",array);
NSLog(@"scope=%d",scope);
NSLog(@"name=%@",name);
}
單例設計模式
獲取單例對象的類方法
+ (AdressBook *)shareInstance {
if (instacne == nil) {
instacne = [[AdressBook alloc] init];
}
return instacne;
}
限制方法,限制這個類只能建立一個對象
+ (id)allocWithZone:(NSZone *)zone {
if (instacne == nil) {
instacne = [super allocWithZone:zone];
}
return instacne;
}
- (id)copyWithZone:(NSZone *)zone {
return self;
}
- (id)retain {
return instacne;
}
- (oneway void)release {
}
- (id)autorelease {
return self;
}
- (NSUInteger)retainCount {
return UINT_MAX;
}
沙盒路徑:
一、Documents目錄:您應該將全部de應用程序數據文件寫入到這個目錄下。這個目錄用於存儲用戶數據或其它應該按期備份的信息。
二、AppName.app目錄:這是應用程序的程序包目錄,包含應用程序的自己。因爲應用程序必須通過簽名,因此您在運行時不能對這個目錄中的內容進行修改,不然可能會使應用程序沒法啓動。
三、Library 目錄:這個目錄下有兩個子目錄:Caches 和 Preferences
Preferences 目錄:包含應用程序的偏好設置文件。您不該該直接建立偏好設置文件,而是應該使用NSUserDefaults類來取得和設置應用程序的偏好.
Caches 目錄:用於存放應用程序專用的支持文件,保存應用程序再次啓動過程當中須要的信息。
四、tmp目錄:這個目錄用於存放臨時文件,保存應用程序再次啓動過程當中不須要的信息。
獲取這些目錄路徑的方法:
1,獲取家目錄路徑的函數:
NSString *homeDir = NSHomeDirectory();
2,獲取Documents目錄路徑的方法:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docDir = [paths objectAtIndex:0];
3,獲取Caches目錄路徑的方法:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *cachesDir = [paths objectAtIndex:0];
4,獲取tmp目錄路徑的方法:
NSString *tmpDir = NSTemporaryDirectory();
5,獲取應用程序程序包中資源文件路徑的方法:
例如獲取程序包中一個圖片資源(apple.png)路徑的方法:
NSString *imagePath = [[NSBundle mainBundle] pathForResource:@」apple」 ofType:@」png」];
UIImage *appleImage = [[UIImage alloc] initWithContentsOfFile:imagePath];
作推送:
文件路徑處理:
演示路徑
NSString *path = @"/Users/apple/file.text";
NSLog(@"演示路徑:%@",path);
1.返回路徑的組成部分
NSArray *array = [path pathComponents];
NSLog(@"pathComponents:%@",array);
2.路徑的最後組成部分
NSString *lastComponent = [path lastPathComponent];
NSLog(@"lastComponent:%@",lastComponent);
3.追加子路徑
NSString *newPath1 = [path stringByAppendingString:@"/appFile.text"];
NSLog(@"newPath1=%@",newPath1);
NSString *newPath2 = [path stringByAppendingPathComponent:@"appFile.text"];
NSLog(@"newPath2=%@",newPath2);
4.刪除最後的組成部分
NSString *deleteLast = [path stringByDeletingLastPathComponent];
NSLog(@"deleteLast:%@",deleteLast);
5.刪除擴展名
NSString *deleteExtension = [path stringByDeletingPathExtension];
NSLog(@"deleteExtension:%@",deleteExtension);
6.獲取路徑最後部分的擴展名
NSString *extension = [path pathExtension];
NSLog(@"extension:%@",extension);
7.追加擴展名
NSString *appendExt = [path stringByAppendingPathExtension:@"jpg"];
NSLog(@"appendExt:%@",appendExt);
NSString ---> NSData
NSString *s = @"tsdfsdfsdfsdf";
NSData *data = [s dataUsingEncoding:NSUTF8StringEncoding];
NSData -———> NSString
NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"str = %@",str);
NSMutableData 可變的Data對象,能夠追加數據
文件操做:
NSString *homePath = NSHomeDirectory();
源文件路徑
NSString *srcPath = [homePath stringByAppendingPathComponent:@"06 第六課 文件管理.pdf"];
目標文件路徑
NSString *targetPath = [homePath stringByAppendingPathComponent:@"Documents/06第六課文件管理.pdf"];
/*
注意:使用NSFileHandle只能讀寫已經存在的文件,不能建立文件
使用NSFileManager建立文件
*/
NSFileManager *fileManager = [NSFileManager defaultManager];
建立目標文件
BOOL success = [fileManager createFileAtPath:targetPath contents:nil attributes:nil];
if (success) {
NSLog(@"目標文件建立成功!");
}
建立用於讀取文件的NSFileHandle對象
NSFileHandle *readHandle = [NSFileHandle fileHandleForReadingAtPath:srcPath];
建立用於寫入的NSFileHandle對象
NSFileHandle *wrteHandle = [NSFileHandle fileHandleForWritingAtPath:targetPath];
從當前偏移量讀到文件的末尾,偏移量默認是起始位置
NSData *data = [readHandle readDataToEndOfFile];
NSData *data = [readHandle availableData];
將數據寫入目標文件
[wrteHandle writeData:data];
關閉文件
[readHandle closeFile];
[wrteHandle closeFile];
/*___________________________1.建立文件_____________________________*/
/*
獲取當前app的沙盒根目錄
NSString *homePath = NSHomeDirectory();
追加子路徑
NSString *filePath = [homePath stringByAppendingPathComponent:@"Documents/file.text"];
NSString *string = @"無限互聯";
將NSString轉成NSData對象
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
NSFileManager 不能使用alloc建立,這個類設計爲單實例
NSFileManager *fileM = [[NSFileManager alloc] init];
NSFileManager 只能經過類方法defaultManager 建立
NSFileManager *fileManager = [NSFileManager defaultManager];
根據路徑filePath建立對應的文件,注意:只能建立文件,不能建立目錄(文件夾)
BOOL success = [fileManager createFileAtPath:filePath
contents:data
attributes:nil];
if (success) {
NSLog(@"文件建立成功");
} else {
NSLog(@"文件建立失敗");
}
建立文件夾
NSString *filePath2 = [homePath stringByAppendingPathComponent:@"Documents/demo"];
NSError *error;
BOOL suucces2 = [fileManager createDirectoryAtPath:filePath2
withIntermediateDirectories:YES
attributes:nil
error:&error];
if (!suucces2) {
NSLog(@"建立失敗:%@",error);
}
*/
/*___________________________2.讀取文件_____________________________*/
獲取當前app的沙盒根目錄
NSString *homePath = NSHomeDirectory();
追加子路徑
NSString *filePath = [homePath stringByAppendingPathComponent:@"Documents/file.text"];
NSFileManager *fileManager = [NSFileManager defaultManager];
根據路徑讀取文件中的數據
NSData *data = [fileManager contentsAtPath:filePath];
NSData 轉 NSString
NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",string);
/*___________________________3.移動(剪切)文件_____________________________*/
/*
獲取當前app的沙盒根目錄
NSString *homePath = NSHomeDirectory();
源路徑
NSString *filePath = [homePath stringByAppendingPathComponent:@"Documents/file.text"];
目標路徑
NSString *tagetPath = [homePath stringByAppendingPathComponent:@"Documents/demo/file2.text"];
NSFileManager *fileManager = [NSFileManager defaultManager];
moveItemAtPath: 移動文件
BOOL success = [fileManager moveItemAtPath:filePath toPath:tagetPath error:nil];
if (!success) {
NSLog(@"移動失敗!!");
}
*/
/*___________________________4.複製文件_____________________________*/
/*
獲取當前app的沙盒根目錄
NSString *homePath = NSHomeDirectory();
源路徑
NSString *filePath = [homePath stringByAppendingPathComponent:@"Documents/demo/file3.text"];
目標路徑
NSString *tagetPath = [homePath stringByAppendingPathComponent:@"Documents/file.text"];
NSFileManager *fileManager = [NSFileManager defaultManager];
copyItemAtPath: 將源文件複製到目標路徑
BOOL success = [fileManager copyItemAtPath:filePath toPath:tagetPath error:nil];
if (!success) {
NSLog(@"複製失敗!!");
}
*/
/*___________________________5.刪除文件_____________________________*/
/*
獲取當前app的沙盒根目錄
NSString *homePath = NSHomeDirectory();
源路徑
NSString *filePath = [homePath stringByAppendingPathComponent:@"Documents/demo/file3.text"];
NSFileManager *fileManager = [NSFileManager defaultManager];
判斷文件是否存在
BOOL fileExist = [fileManager fileExistsAtPath:filePath];
if (fileExist) {
removeItemAtPath:刪除文件
BOOL success = [fileManager removeItemAtPath:filePath error:nil];
if (success) {
NSLog(@"刪除成功!!");
}
}
*/
/*___________________________6.獲取文件的屬性_____________________________*/
/*
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *homePath = NSHomeDirectory();
目標路徑
NSString *filePath = [homePath stringByAppendingPathComponent:@"Documents/file.text"];
獲取到文件的屬性信息,文件的屬性信息存儲fileAttr字典中
NSDictionary *fileAttr = [fileManager attributesOfItemAtPath:filePath error:nil];
NSLog(@"%@",fileAttr);
從字典中經過key:NSFileSize獲取到文件大小
NSNumber *filesize = [fileAttr objectForKey:NSFileSize];
long sizeValue = [filesize longValue];
NSLog(@"文件大小:%ld",sizeValue);
以下讀取文件的大小,不可取,由於將文件中的數據全都讀到內存中,文件大時,太佔用內存了
NSData *data = [fileManager contentsAtPath:filePath];
NSInteger len = data.length;
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
*/
UITableView的一些使用方法:
_tableView.dataSource = self;
_tableView.delegate = self;
_tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
/**
UITableViewStylePlain, 平板的格式
UITableViewStyleGrouped 分組的格式
*/
設置行高
self.tableView.rowHeight = 120;
分隔線
self.tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
headView,放在tableView最頂部的視圖,一般用來放圖片輪播器
UIView *head = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 130)];
head.backgroundColor = [UIColor blueColor];
self.tableView.tableHeaderView = head;
footerView,一般作上拉刷新
UIView *foot = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
foot.backgroundColor = [UIColor redColor];
self.tableView.tableFooterView = foot;