UitableView

cell 高度自适应

Masonry

UILabel

iOS  UI控件

1.UIButton按钮

2.UILabel文本标签

3.UITextField文本输入框

4.UIImageView图片显示

5.UIProgressView进度条

6.UISegmentControl选项卡

7.UIActivityIndicator圈圈,菊花

8.UIAlertView对话框(中间弹框)

9.UIActionSheet底部弹窗

10.UIScrollView滚动的控件

11.UISwitch开关

12.UISlider滑块

13.UIPageControl分页控制

14.UITextView能滚动的文字显示控件

15.UITableView表格

16.UIPickerView选择器

17.UIDataPicker日期选择器

18.UIWebView网页控制

19.UIToolbar工具条

20.UINavigationBar导航条

21.UICollectionView九宫格

模拟器:界面布局查看工具:reveal

====================================================================================

Reveal使用

1. Build Settings 搜索Other

将Other Linker Flags设置为 -ObjC

2. Reveal.framework拖到项目中即可

~/资源库/Caches/

找到com.ittybittyapps.Reveal文件夹删除

~/资源库/Preferences/

找到com.ittybittyapps.Reveal.plist删除

又可以使用30天

图片自动补充:ksimageNamed

注释带智能提示:WDocumenter

return YES;

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 调试方法

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)];

//        [resizeImage stretchableImageWithLeftCapWidth:<#(NSInteger)#> topCapHeight:<#(NSInteger)#>];

背景单击事件

@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;

self presentModalViewController:(加载的新页面) 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);

获取文本的宽高

//3.正文

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);

//    for (Question *obj in self.question) {

//        NSLog(@"%@",obj);

//    }

然后导入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

注释代码

如果是0,就注释,1就不注释

#if 0

#endif

颜色的问题:

32位真彩色ARGB

24位真彩色RGB

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;

调用函数:

等待一段时间 延时

[self performSelector:@selector(cleanup) withObject:nil afterDelay:self.tom.animationDuration];//tom动画中用到的

设置常用代码块:

<#view#>.backgroundColor=[UIColor  <#color #>];

代码块存放路径:

/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 使用Assign

图片:

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

// ----------------------------------------------

// 1>

//    self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateTimer:) userInfo:@"hello timer" repeats:YES];

// ----------------------------------------------

// 2> 与1等价

//    self.timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(updateTimer:) userInfo:nil repeats:YES];

//    // 将timer添加到运行循环

//    // 模式:默认的运行循环模式

//    [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSDefaultRunLoopMode];

// ----------------------------------------------

// 3>

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;

}

iOS各个尺寸:

}

按钮监听事件:

- (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(不可变字符串)___________________________*/

//---------------(1)字符串创建--------------------//

//创建一个字符串常量

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);

//---------------(2)字符串的比较--------------------//

NSString *s0 = @"无限互联";

//    NSString *s11 = @"无限互联";   //s0与s11的指针地址是一样的,指向的都是常量区同一个字符串对象

NSString *s1 = [NSString stringWithFormat:@"无限互联"];

NSString *s2 = [[NSString alloc] initWithFormat:@"无限互联"];

//判断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");

}

//---------------(3)字符串的其他用法--------------------//

//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];

做推送:

https://itunes.apple.com/tw/app/apn-tester-free/id626590577?l=zh&mt=12

文件路径处理:

//演示路径

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]));

*/

字典转模型:

//

//  HMAppInfo.h

//  01-应用程序管理

//

//  Created by apple on 14-8-14.

//  Copyright (c) 2014年 itcast. All rights reserved.

//

#import <Foundation/Foundation.h>

@interface HMAppInfo : NSObject

@property (nonatomic, copy) NSString *name;

@property (nonatomic, copy) NSString *icon;

/**

@property

1. 生成getter方法

2. 生成setter方法

3. 生成带下划线的成员变量(记录属性内容)

readonly的属性不会生成带下划线的成员变量!

*/

@property (nonatomic, strong, readonly) UIImage *image;

/**

instancetype 主要用于在类方法实例化对象时,让编译器主动推断对象的实际类型

以避免使用id,会造成开发中不必要的麻烦,减少出错几率!

instancetype是苹果在iOS7才开始主推的

C++11 auto

在swift语言中,绝大多数类的实例化,都不需要再指定类型

instancetype只能用于返回值使用!!!不能当做参数使用

*/

/** 通常在写模型的实例化方法时,以下两个方法,都需要实现 */

/** 使用字典实例化模型 */

- (instancetype)initWithDict:(NSDictionary *)dict;

/** 类方法可以快速实例化一个对象 */

+ (instancetype)appInfoWithDict:(NSDictionary *)dict;

/** 返回所有plist中的数据模型数组 */

+ (NSArray *)appList;

@end

//

//  HMAppInfo.m

//  01-应用程序管理

//

//  Created by apple on 14-8-14.

//  Copyright (c) 2014年 itcast. All rights reserved.

//

#import "HMAppInfo.h"

@implementation HMAppInfo

// 合成指令,主动指定属性使用的成员变量名称

@synthesize image = _image;

/**

使用KVC的注意事项

1> plist中的键值名称必须与模型中的属性一致

2> 模型中的属性可以不全部出现在plist中

*/

- (UIImage *)image

{

if (_image == nil) {

_image = [UIImage imageNamed:self.icon];

}

return _image;

}

- (instancetype)initWithDict:(NSDictionary *)dict

{

// self 是对象

self = [super init];

if (self) {

// 用字典给属性赋值,所有与plist键值有关的方法,均在此处!

//        self.name = dict[@"name"];

//        self.icon = dict[@"icon"];

// KVC - key value coding键值编码

// 是一种间接修改/读取对象属性的一种方法

// KVC 被称为 cocoa的大招!

// 参数:

// 1. 数值

// 2. 属性名称

//        [self setValue:dict[@"name"] forKeyPath:@"name"];

//        [self setValue:dict[@"icon"] forKeyPath:@"icon"];

// setValuesForKeysWithDictionary本质上就是调用以上两句代码

[self setValuesForKeysWithDictionary:dict];

}

return self;

}

+ (instancetype)appInfoWithDict:(NSDictionary *)dict

{

// self 是 class

return [[self alloc] initWithDict:dict];

}

+ (NSArray *)appList

{

NSArray *array = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"app.plist" ofType:nil]];

// 创建一个临时数组

NSMutableArray *arrayM = [NSMutableArray array];

// 遍历数组,依次转换模型

for (NSDictionary *dict in array) {

[arrayM addObject:[HMAppInfo appInfoWithDict:dict]];

}

return arrayM;

}

@end

使用:

- (NSArray *)appList

{

if (_appList == nil) {

_appList = [HMAppInfo appList];

}

return _appList;

}

创建蒙板(遮罩)

1.创建蒙板(遮罩)

UIButton *cover=[[UIButton alloc]initWithFrame:self.view.bounds];

cover.backgroundColor=[UIColor colorWithWhite:0.0 alpha:0.5];

[self.view addSubview:cover];

_cover.alpha=0.0;

[_cover addTarget:self action:@selector(smallImage:) forControlEvents:UIControlEventTouchUpInside];

//2.将图像按钮弄到最前面来

[self cover];

[self.view bringSubviewToFront:self.CentImage];

//3.动画将按钮放大

CGFloat w=self.view.bounds.size.width;

CGFloat h=w;

CGFloat y=(self.view.bounds.size.height-w)*0.5;

[UIView animateWithDuration:1 animations:^{

self.CentImage.frame=CGRectMake(0, y, w, h);

_cover.alpha=1;

} completion:^(BOOL finished) {

}];

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;

右侧索引

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView

{

// 索引数组中的"内容",跟分组无关

// 索引数组中的下标,对应的是分组的下标

//    return @[@"哇哈哈", @"hello", @"哇哈哈", @"hello", @"哇哈哈", @"hello", @"哇哈哈", @"hello"];

// 返回self.carGroup中title的数组

//    NSMutableArray *arrayM = [NSMutableArray array];

//    for (HMCarGroup *group in self.carGroups) {

//        [arrayM addObject:group.title];

//    }

//    return arrayM;

// KVC是cocoa的大招

// 用来间接获取或者修改对象属性的方式

// 使用KVC在获取数值时,如果指定对象不包含keyPath的"键名",会自动进入对象的内部查找

// 如果取值的对象是一个数组,同样返回一个数组

NSArray *array = [self.carGroups valueForKeyPath:@"cars.name"];

NSLog(@"%@", array);

return [self.carGroups valueForKeyPath:@"title"];

}

// 开始编辑,一旦editing == YES就默认开启删除模式

self.tableView.editing = YES;

// 只要实现了此方法,就能够支持手势拖拽删除了,删除需要自己干!

/**

UITableViewCellEditingStyleNone,

UITableViewCellEditingStyleDelete,     删除

UITableViewCellEditingStyleInsert      添加

*/

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath

{

if (editingStyle == UITableViewCellEditingStyleDelete) {

NSLog(@"要删除");

// MVC => 数据是保存在模型中

// 1. 删除self.dataList中indexPath对应的数据

[self.dataList removeObjectAtIndex:indexPath.row];

NSLog(@"%@", self.dataList);

// 2. 刷新表格(重新加载数据)

// 重新加载所有数据

//        [self.tableView reloadData];

// deleteRowsAtIndexPaths让表格控件动画删除指定的行

[self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationMiddle];

} else if (editingStyle == UITableViewCellEditingStyleInsert) {

NSLog(@"要添加数据");

// 1. 向数组添加数据

[self.dataList insertObject:@"王小二" atIndex:indexPath.row + 1];

// 2. 刷新表格

//        [self.tableView reloadData];

// insertRowsAtIndexPaths让表格控件动画在指定indexPath添加指定行

// 新建一个indexPath

NSIndexPath *path = [NSIndexPath indexPathForRow:indexPath.row + 1 inSection:indexPath.section];

[self.tableView insertRowsAtIndexPaths:@[path] withRowAnimation:UITableViewRowAnimationMiddle];

}

}

// 只要实现此方法,就可以显示拖动控件

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath

{

// 界面数据UITableView已经完成了

// 调整数据即可

//    [self.dataList exchangeObjectAtIndex:sourceIndexPath.row withObjectAtIndex:destinationIndexPath.row];

// 1. 将源从数组中取出

id source = self.dataList[sourceIndexPath.row];

// 2. 将源从数组中删除

[self.dataList removeObjectAtIndex:sourceIndexPath.row];

NSLog(@"%@", self.dataList);

// 3. 将源插入到数组中的目标位置

[self.dataList insertObject:source atIndex:destinationIndexPath.row];

NSLog(@"%@", self.dataList);

}

#pragma mark - 代理方法

// 返回编辑样式,如果没有实现此方法,默认都是删除

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath

{f

//    if (indexPath.row % 2) {

//        return UITableViewCellEditingStyleInsert;

//    } else {

//        return UITableViewCellEditingStyleDelete;

//    }

return UITableViewCellEditingStyleInsert;

}

注意使用模型来给cell中属性赋值

自定义代理

HMAppView.h文件

@class HMAppInfo, HMAppView;

// 1. 协议名以类名开始+Delegate

@protocol HMAppViewDelegate <NSObject>

@optional

// 2. 协议方法,以类名开始(没有类前缀),第一个参数是自己

// 只是定义方法名,不做具体实现

- (void)appViewDidClickDownloadButton:(HMAppView *)appView;

@end

@interface HMAppView : UIView

// 3. 定义代理属性,遵守了HMAppViewDelegate协议的任意一个对象,都可以成为代理

@property (nonatomic, weak) id<HMAppViewDelegate> delegate;

/** 类方法,方便调用视图 */

+ (instancetype)appView;

/** 实例化视图,并使用appInfo设置视图的显示 */

+ (instancetype)appViewWithAppInfo:(HMAppInfo *)appInfo;

// 自定义视图中显示的数据来源是数据模型

// 使用模型设置自定义视图的显示

@property (nonatomic, strong) HMAppInfo *appInfo;

@end

uiToolBar

UIToolbar * tbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, self.view.frame.size.height - 44, 320, 44)];

//创建UIToolbar对象

tbar.tintColor = [UIColor greenColor];

#if 1

UIBarButtonItem * spaceItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];

NSMutableArray * array = [[NSMutableArray alloc] initWithCapacity:0];

for (int i = 0; i < 3; i++) {

UIBarButtonItem * item = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:nil];

[array addObject:item];

[array addObject:spaceItem];

}

UIButton * btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];

btn.frame = CGRectMake(0, 0, 50, 30);

[btn setTitle:@"xx" forState:UIControlStateNormal];

UIBarButtonItem * item = [[UIBarButtonItem alloc] initWithCustomView:btn];

//要用initWithCustonView:

[array addObject:item];

tbar.items = array;

#else

//UIToolbar中加入的按钮都是UIBarButtonItem类型

UIBarButtonItem * item0 = [[UIBarButtonItem alloc] initWithTitle:@"上一页" style:UIBarButtonItemStyleDone target:self action:nil];

UIBarButtonItem * item1 = [[UIBarButtonItem alloc] initWithTitle:@"首页" style:UIBarButtonItemStyleDone target:self action:nil];

UIBarButtonItem * item2 = [[UIBarButtonItem alloc] initWithTitle:@"下一页" style:UIBarButtonItemStyleDone target:self action:nil];

UIBarButtonItem * spaceItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];

//spaceItem是一个弹簧按钮(UIBarButtonSystemItemFlexibleSpace),

tbar.items = [NSArray arrayWithObjects:item0, spaceItem, item1, spaceItem, item2, nil];

#endif

//要达到相同的效果,也可以插入一个button,button的类型为Custom,enabled设置为NO。

[self.view addSubview: tbar];

iOS 初学者功能代码大集合,个人笔记相关推荐

  1. javascript功能插件大集合,写前端的亲们记得收藏

    导读:GitHub 上有一个 Awesome – XXX 系列的资源整理.awesome-javascript 是 sorrycc 发起维护的 JS 资源列表,内容包括:包管理器.加载器.测试框架.运 ...

  2. 计算机视觉、机器学习相关领域论文和源代码大集合--持续更新……(转载)

    计算机视觉.机器学习相关领域论文和源代码大集合--持续更新-- zouxy09@qq.com http://blog.csdn.net/zouxy09 注:下面有project网站的大部分都有pape ...

  3. vbs整人代码大集合(多年以来的整合)

    博客超链接首页 博客超链接资源 vbs整人代码大集合/不要乱使用! 前言 一.删除D:\所有文件 二.不断弹出窗口 三.不断按下alt+f4 (开什么都关闭--) 四.按999次回车 五.关不掉的窗口 ...

  4. 计算机视觉、机器学习相关领域论文和源代码大集合_拔剑-浆糊的传说_新浪博客...

    http://blog.csdn.net/zouxy09/article/details/8550952 顶] 计算机视觉.机器学习相关领域论文和源代码大集合--持续更新-- 计算机视觉.机器学习相关 ...

  5. javascript功能插件大集合 前端常用插件 js常用插件

    包管理器 管理着 JavaScript 库,并提供读取和打包它们的工具. npm:npm 是 JavaScript 的包管理器.官网 Bower:一个 web 应用的包管理器.官网 component ...

  6. javascript功能插件大集合

    [导读]:GitHub 上有一个 Awesome – XXX 系列的资源整理.awesome-javascript 是 sorrycc 发起维护的 JS 资源列表,内容包括:包管理器.加载器.测试框架 ...

  7. 经典ASP代码大集合

    1. οncοntextmenu="window.event.returnvalue=false" 将彻底屏蔽鼠标右键 <table border οncοntextmenu ...

  8. 隐藏代码Android,手机隐藏代码大集合 知道5个以上是大神

    ­ 手机中有些特殊的代码,可以通过它们更加了解自己的手机,还能在买新手机时对手机好坏进行测试,下面这些你知道几个. ­ 安卓 / 苹果通用隐藏代码 ­ 1. 查询 IMEI 号 ­ 在拨号界面输入&q ...

  9. 手机访问隐藏html代码,技巧:手机隐藏代码大集合 知道五个以上是大神

    手机中有些特殊的代码,可以通过它们更加了解自己的手机,还能在买新手机时对手机好坏进行测试,下面这些你知道几个. 安卓/苹果通用隐藏代码 1.查询IMEI号 在拨号界面输入"*#06#&quo ...

最新文章

  1. Python笔记:字典的fromkeys方法创建的初始value同内存地址问题
  2. SVN服务器从Windows迁移到Linux
  3. 无障碍开发(四)之ARIA aria-***状态值
  4. Python Django HttpResponse响应对象
  5. java.util.Random 实现原理
  6. A+B Problem(V)
  7. 两杯咖啡只卖2.5?瑞幸价格出错被“薅羊毛” 官方道歉了...
  8. UIImageView contentModel
  9. (入门)keystonejs入门教程之环境搭建
  10. 利用java生成uuid
  11. Win10 安装 Ubuntu 使用 Linux 教程
  12. 达梦数据库高可用解决方案
  13. 【智能无线小车系列八】在树莓派上使用USB摄像头
  14. Smartbi的下载安装教程
  15. xp系统计算机无线开关在哪,xp怎么设置无线网络?xp系统设置无线网络的方法
  16. 深入探讨IGP协议:OSPF与ISIS的区别(区域类型比较,邻接关系比较,DR和DIS比较,如何计算路由以及性能的比较)
  17. FFMPEG直播推流
  18. 安全-系统上线安全检查规范
  19. (iOS)仿App第一步:获取App素材
  20. 气虚 血虚 阴虚 阳虚4种体虚如何养生保健

热门文章

  1. 论文笔记:DCRNN (Diffusion Convolutional Recurrent Neural Network: Data-Driven Traffic Forecasting)
  2. android高德地图关键字搜索,关键字搜索-POI搜索-示例中心-JS API 示例 | 高德地图API...
  3. base64的pdf编码转换成pdf文件转换之后一直打不开:未能加载pdf
  4. mux decoder selector详解
  5. linux中/etc/hosts文件的含义
  6. 2018年看书计划(40本)
  7. 手把手教你写软件1.软件介绍已经心得体会
  8. Balanced Lineup
  9. 符合应急监管要求的危化品企业双重预防数字化系统
  10. 软件缺陷的生命周期(二)