重点 (八) : 常用代码集合
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
NSString *urlString = @"http://192.168.1.113:8090/text/UploadServlet";
服务器地址
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、e1、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(@"左表:%@",md.name);
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];
[manager GET:@"http://120.25.160.35:8080/LocalGoodBrand/UserServlet" parameters:
@{@"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”
2.info 中删除storyboard选项
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];
基准网站
NSURL *url = [NSURL URLWithString:@"http://baidu.com"];
监听结果回调
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);
字符串追加
NSString *link = @"www.iphonetrain.com/.html";
rangeOfString:查找字符串所在的位置
NSRange linkRang = [link rangeOfString:@"html"];
if (linkRang.location != NSNotFound) {
NSLog(@"location:%ld,length:%ld",linkRang.location,linkRang.length);
}
例如:能查找到@163.com,说明此邮箱是网易邮箱
NSString *email = @"12345@163.com";
/*___________________________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;
}
沙盒路径:
1、Documents目录:您应该将所有de应用程序数据文件写入到这个目录下。这个目录用于存储用户数据或其它应该定期备份的信息。
2、AppName.app目录:这是应用程序的程序包目录,包含应用程序的本身。由于应用程序必须经过签名,所以您在运行时不能对这个目录中的内容进行修改,否则可能会使应用程序无法启动。
3、Library 目录:这个目录下有两个子目录:Caches 和 Preferences
Preferences 目录:包含应用程序的偏好设置文件。您不应该直接创建偏好设置文件,而是应该使用NSUserDefaults类来取得和设置应用程序的偏好.
Caches 目录:用于存放应用程序专用的支持文件,保存应用程序再次启动过程中需要的信息。
4、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;