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,屏幕上切换不同类型,可以通过这种方式实现
网友评论