iOS开发日记-1

2015.4.20一

1,xcode6第三方库导入问题,现在需要通过 “Group”的方式 导入才能

2015.4.21二

1,UIView覆盖全屏幕(包括导航栏)覆盖导航栏和Tabbar

[[UIApplication sharedApplication].keyWindow addSubview:<#(UIView *)view#>]

2,初始化视图在-(void)loadView初始化

2015.4.22三

QFQ

1,

1)数据请求?老的用:HttpTool新的用:HttpClient

HttpClient 用的队列的方式

2)Sweep:扫书Side:身边My:我的More:更多

3)1》Table数据请求返回的数据

2》封装一个BookInfo类,类中有获取数据方法,例:

//获取最受欢迎图书馆列表

+ (NSArray*)welcomeBookListWithArea:(NSInteger)iArea dis:(NSInteger)iDis pageIndex:(int)iPageIndex pageSize:(int)iPageSize useLocation:(BOOL)bUseLocation;

3》填充TableViewCell时,取出需要的信息

2,文本框提示文字颜色

[_txtFile setValue:[UIColor whiteColor] forKeyPath:@"_placeholderLabel.textColor"];

3,通知中心,记得dealloc

B.m

发送通知

[[NSNotificationCenter defaultCenter] postNotificationName:@'ChangeNameNotification' object:self userInfo:@{@'name':self.nameTextField.text}];

A.m

注册一个通知,来调用发生事件

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(ChangeNameNotification:) name:@'ChangeNameNotification' object:nil];

删除通知

[[NSNotificationCenter defaultCenter] removeObserver:self];

调用,显示

-(void)ChangeNameNotification:(NSNotification*)notification{

NSDictionary *nameDictionary = [notification userInfo];

self.nameLabel.text = [nameDictionary objectForKey:@'name'];

}

4,.mm文件,如果用到了C++,需要改为mm

5,轻量级本地数据储存: NSNumber(Integer、Float、Double),NSString,NSDate,NSArray,NSDictionary,BOOL类型

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

id sLibraryID = [userDefaults objectForKey:@“LibraryId”];//读取数据

[userDefaults setValue:@“” forKey:@“CardId”]; //存入数据

/UsersLibrary/Application Support/iPhoneSimulator/4.1/Applicati*****/29788E40-AF47-45A0-8E92-3AC0F501B7F4/,(这个是应用程序对应在mac上的位置)

这个下面有/Library/Prefereces,里面有个plist文件,存储的就是你的userDefaults

,编程语言这种东西,好比国语,学习国语一开始先从26的字母学起,然后到拼音,到汉字,然后进入到词组阶段,开始造句,每个人对词语的敏感度不同,然后写出来的文字也不一样。有些生动美丽,有些生涩难懂。编程就是如此,到了词组阶段,自然就可以造出各种各样的语句。

2015.4.23四

1,照片压缩

2,关于枚举的要点

1)应该用枚举来表示状态机的状态、传递给方法的选项以及状态码等值,给这些值起个易懂的名字

2)如果把传递给某个方法的选项表示为枚举类型,而多个选项又可同时使用,那么就将各选项值定义为2的幂,以便通过按位或操作将其组合起来,使用 NSTimer 的时候,在视图即将消失的时候,如果没有置为nil ,返回上一个视图的时候会卡屏

3)用NS_ENUM与NS_OPTIONS宏来定义枚举类型,并指明其底层数据类型。这样做可以确保枚举是用开发者所选的底层数据类型实现出来的,而不会采用编译器所选的类型

4)在处理枚举类型的switch语句中不要实现default分支。这样的话,加入新枚举之后,编译器就会提示开发者:switch语句并未处理所有枚举

2015.4.28二

1,delegate在视图即将消失的时候应该释放掉,delegate = nil;

2,TextField文本框的缩进,

textField.leftView = clearSpaceView

textField.leftViewMode = UITextFieldModAlways

2015.5.15五

1,自定义导航,手势返回上一个视图控制器

2,数据请求的优化:

头部刷新时,请求回来的数据和已存在的数据,判断第一个对象,如果相同,说明更新内容一样,就不需要重新加载;

尾部刷新时,请求回来的数据和已存在的数据,判断两组数据的最后一个对象是否相同,如果相同,说明更新内容一样,同样不需要加载

3,内存警告处理,根据需求决定优先级,Crash还是将当前页面的控件和数据置为nil,

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_6_0

#endif

4,判断页数如:每页10条数据iPageIndex = count % 10 == 0 ? count / 10 + 1 : count / 10 + 2

5,二维码扫描,没有设置扫描的范围,当二维码全部进入相机,当时没有全部进入限制的相框时,扫描就完成了,影响客户体验

2015.5.26二

1,在使用NSTimer的时候,在视图即将消失的时候,如果没有置为nil,在返回上个视图的时候会卡屏

[_timer invalidate];//暂停NSTimer

_timer = nil;

2,NSTimer 关闭和打开方法

//关闭定时器

[_timer setFireDate:[NSDate distantFuture]];

//打开定时器

[_timer setFireDate:[NSDate distantPast]];

3,NSTimer 在有 UIScrollView 的时候记得将NSTimer放入混合模式,原因是因为苹果手机在执行代码的时候优先将所有性能放在UI上,优先执行UI操作,然后才执行其他操作。

2015.5.27三

1,在xcode6 中导入 MJRefresh第三方库, 会报错 unknown type’NSString’…

原因:由于xcode6取消了 .pch 文件,所以没有导入Foundation.framework 和 UIKit.framework 框架

解决方法:在MJRefreshConst.m头部加上

#import

#import

2,第三方 SDImage

报错:objc_msgSend(self.beginRefreshingTaget, self.beginRefreshingAction, self);

Too many arguments to function call, expected 0, have 3

解决方案:

选中项目 - Project - Build Settings - ENABLE_STRICT_OBJC_MSGSEND将其设置为 NO 即可

——————————

导入第三方SDImage 导入框架

1.导入ImageIO.framework

2.导入MapKit.framwork

2015.5.28四

1,设置UIButton在高亮状态时的背景色,可以通知实例化一个纯颜色的UIImage

#pragma mark -实例化一个纯颜色的UIImage

- (UIImage *)imageWithColor:(UIColor *)color size:(CGSize)size

{

CGRect rect = CGRectMake(0, 0, size.width, size.height);

//创建一个默认的位图

UIGraphicsBeginImageContext(rect.size);

//设置上下文

CGContextRef context = UIGraphicsGetCurrentContext();

//填充颜色

CGContextSetFillColorWithColor(context, [color CGColor]);

CGContextFillRect(context, rect);

//接收返回的UIImage

UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

return image;

}

2015.5.29五

1, 公用一个ScrollView、TableView等,在视图切换的时候,如何记录当前坐标,以便切换视图时能返回之前所在位置

解决方案:

1)不用同一个 ScrollView, 封装成两个以上的View

2)调用UIScrollViewDelegate 的函数

#pragma mark - UIScrollViewDelegate

//Scroll停止滚动就会调用这个函数

- (void)scrollViewDidScroll:(UIScrollView *)scrollView

{

//NSLog(@"当前Frame(%@)",NSStringFromCGRect(scrollView.frame));

//NSLog(@"当前大小(%@)",NSStringFromCGSize(scrollView.contentSize));

//判断当TableView处于刷新状态时,不记录当前TableView的坐标

//

if (scrollView.contentSize.height - CGRectGetHeight(scrollView.frame) <= scrollView.contentOffset.y || scrollView.contentOffset.y >= 0) {

//NSLog(@"------(%@)--------",@(scrollView.contentOffset.y));

if (_CurrentTypeIsThemeOrApply == ISTHEME) {

_currentThemeY = _themeTableView.contentOffset.y;

} else {

_currentAlApplyY = _themeTableView.contentOffset.y;

}

}

}

2,同时点击两个以上的按钮,触发事件,会相继 PUSH 各自的ViewController.

解决方法:

1)控制可点击的触摸数量;

2)限制按钮事件,声明一个BOOL的常量设为NO,控制事件只允许发生一次,在事件发生完之后改成YES

2015.6.9二

1, 监听文本框输入有两种方法。

1)使用UITextFeildDelegate

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string

{

//延迟0.2秒执行事件

[self performSelector:@selector(textChange) withObject:nil afterDelay:0.2];

return YES;

}

2)通知中心

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textChange) name:UITextFieldTextDidChangeNotification object:nil]

2,注册,忘记密码代码优化

当所有文本框都输入字符时,注册按钮才可点击,样式为可点击样式,否则不可点击,又换一种样式

因为使用UITextFieldDelegate中监听文本框输入,每次输入字符都会调用一次代理函数,每次调整按钮高亮状态时,都会不断的实例化新的UIImage,增加内存,解决方法就是有一个全局的UIImage,然后利用延迟加载的方式,这样一旦判断存在这个UIImage,就只会用到一个UIImage

2015.6.10三

1,如何让UITabbar界面在PUSH进一个ViewController隐藏,然后在POP回来的时候显示。

解决方法:

UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:customTabbar];

nav.navigationBar.hidden = YES;

[self.window setRootViewController:nav];

2015.6.11四

1,修改状态栏文字颜色,重写返回状态栏方法

// 如果调用[UIApplication sharedApplication] set ..的方法用不了可以用下面的重写方法

-(UIStatusBarStyle)preferredStatusBarStyle

{

if (_scrollMain.contentOffset.y>150) {

_currentStatusBayStyle = UIStatusBarStyleDefault;

}

else {

_currentStatusBayStyle = UIStatusBarStyleLightContent;

}

return _currentStatusBayStyle;

}

[self setNeedsStatusBarAppearanceUpdate];

// plist,设置

View controller-based status bar appearanceNO

2015.6.11五

1,一般项目中,在加载页的时候一般不会出现状态栏,所有一般隐藏状态栏(在“加载页的时候”隐藏,等到主界面还得显示出来)

2015.6.17三

1,枚举与宏的区别

宏和枚举之间的差别主要在作用的时期和存储的形式不同,宏是在预处理的阶段进行替换工作的,它替换代码段的文本,程序运行的过程中宏已不存在了。而枚举是在程序运行之后才起作用的,枚举常量存储在数据段的静态存储区里。宏占用代码段的空间,而枚举除了占用空间,还消耗CPU资源

2015.7.1三

1,使用UITableView布满全屏时,当界面即将消失时,会自动下移20像素,这是由于代理引起的,需要设置粘稠,或者在界面即将消失时重新设置Y为-20.

2015.7.6一

1,UITableViewCell在全屏时,Cell无法填充到状态栏,会自动偏移y坐标,解决方法

- (void)scrollViewDidScroll:(UIScrollView *)scrollView

{

if (scrollView.tag == 1) {

CGFloat sectionHeaderHeight = -20;

if (scrollView.contentOffset.y <= sectionHeaderHeight && scrollView.contentOffset.y >= 0)

{

scrollView.contentInset = UIEdgeInsetsMake(-scrollView.contentOffset.y, 0, 0, 0);

}

else if (scrollView.contentOffset.y >= sectionHeaderHeight)

{

scrollView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0);

}

}

}

2015.7.24一

1,通知中心没有dealloc会导致的问题

1)第一次实例化界面,通知中心并没有调用NSNotification的函数

2,检查版本更新

NSString* http = @"http://itunes.apple.com/lookup?id=924306089";

[HttpClient GetAsync:http parameters:nil needCache:0 completion:^(id response, NSHTTPURLResponse *urlResponse, NSError *error) {

if (error||response == nil) {

block(nil);

return ;

}

NSDictionary* responseDict = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableContainers error:&error];

if (responseDict == nil) {

block(nil);return ;

}

ResultInfo* result = [ResultInfo new];

result.iRet = 0;

NSDictionary* resultDict = [responseDict[@"results"] firstObject];

NSString*version = resultDict[@"version"];

NSString* currentVersion = APPVersion;

version = [version stringByReplacingOccurrencesOfString:@"." withString:@""];

currentVersion = [version stringByReplacingOccurrencesOfString:@"." withString:@""];

BOOL bNeedUpdate = [version integerValue] > [currentVersion integerValue] ? YES:NO;

NSDictionary* dict = @{@"NewVersion":version,@"NeedUpdate":[NSNumber numberWithBool:bNeedUpdate],@"UpdateUrl":resultDict[@"trackViewUrl"]};

result.oRet = dict; //为Yes表示需要更新

block(result);

2015.8.24一

1, ViewController上可以继续放ViewController,屏幕上切换不同类型,可以通过这种方式实现

你可能感兴趣的:(iOS开发日记-1)