读取不了资源
[NSBundle mainBundle]其获取的路径是你程序的安装路径下的资源文件位置。 在xcode中采用add file to 方式添加文件时,一般情况下xcode会自动将文件添加到你的资源文件,而且,这些文件在你工程的 build Phases中的 copy Bundle Resources中可以查看到。但是有时候,由于xcode的问题,采用add files to 不能自动添加到你的资源文件中,这时,可以采用copy Bundle Resources下面的“+”号,手动将文件添加到你的资源文件中
xcode 代码一拉就直接到最底部,,而看不了中间的代码,,无法查看..解决方法将xcode 窗口最右侧全部收起..代码在一排显示,…没有换行就行.
tabbar 自定义item 图片 会跟你使用的图片的效果不一样, 这是因为它是默认以填充形式展现,,要加后面的mode 才能展现所有显示
childVC.tabBarItem.image = [[UIImage imageNamed:image] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
childVC.tabBarItem.selectedImage = [[UIImage imageNamed:selectedImage] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
写的block crash问题
对象还未创建 set了block,写代码时候不会警告,运行时候就崩溃
方法名与属性名重名.导致block crash
UINavigationController 弹出新的UIViewController时,setNavigationBarHidden失效的问题
-(void) hideNavBar {
if (self.navigationController.navigationBar.hidden == NO){
[self.navigationController setNavigationBarHidden:YES animated:YES];
}
}
程序多数坑还是自己挖的
内支付 .二进制文件被拒之后,,相应的内购项目被退回,,应该及时修改,使其成为预审状态,,这样接着提审的时候,苹果比较看中的内购项目,使用沙盒测试就不会出现崩溃情况,,(不是预审状态获取不下来内购的价格和名称)
尽可能的在备注里面说清楚项目所包含的一个业务情况和逻辑,,以减少审核人员的疑问,,不至于因为疑问被拒绝,
两个imageview 动画同步执行也只能加一个began …会一起跑,…不然会导致整个app 后续操作都带动画
[UIView beginAnimations:@"gift_plane"context:nil];
//[UIView beginAnimations:imgUrlStr context:nil];
微信支付总结 .
现象 . 吊起微信支付后.整个界面只出现 确定 按钮..其他区域全白
微信支付.分为客户端和后台统一下订单两种…重点注意参数sign..移动端下订单,所有签名和加密都在移动端进行.在delegate 在onrepose里面用通知 对支付结果进行传递到对应地方 …后台下顶端,,只有prepayid 有用,,sign 要看下是否已经签名过再传过来的,,如果后台没有签名就穿过来了,,要自己再次签名.不然吊起微信后只有一个确定按钮
直播流流播放器ijikplaer 跟环信的开发包带实时视屏的那个包冲图,,关于网络应该,,导致播放器无法连接到服务器.无法连接解析服务器.只要你环信的参与编译了
// 添加点击手势使view取消编辑状态.添加
//注意添加手势的时机..是要在刚刚创建完该控件的时候立刻添加…?
- (void)addTapGestureCancleEditing{
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(viewTap:)];
tap.delegate = self;
tap.cancelsTouchesInView = NO;
[self.view addGestureRecognizer:tap];
[_topHalfBackView addGestureRecognizer:tap];
[_bottomHalfBackView addGestureRecognizer:tap];
}
- (void)viewTap:(UITapGestureRecognizer *)gesture{
[self.view endEditing:YES];
[_accountTextfield resignFirstResponder];
[_inputMoneyTextfield resignFirstResponder];
}
app icon换图片的时候然后提交(在svn 环境下),说图片计划提交但是misssing得问题
app icon removeItem 一个,拖一个进去,,svn 就不会有问题 避免冲突
提交svn 不要将pods 文件也提交了..后面会无限冲突..每次都编译生成新的.project,,与svn 不一致,,就会打不开
collection view 下拉刷新时候崩溃的问题…原因是,,拉的时候会走cell for row..如果此时数据没有下来 而将旧的数据全部清楚了..cell for row 就会出现越界问题,,导致崩溃,,,应该等数据下来,,再清除旧数据,,,再添加新数据,并reload
sdwebimge 默认进行了图片本地和内存同时缓存..option 可以SDWebImageRefreshCached...这样就可以让轮播图 获取最新的链接图片 url 为key ..所以跟普通的不同.. 建议每次上传新的轮播图图片都以日期命名..改变url
self.view 的addsubview 和inserch subview 的区别
[self.view insertSubview:_preplayBackImgView belowSubview:_tableView];插入到某个控件下面.,,,避免被盖住
一个vc被加在多层view上面,,最底层是一个初始vc ..如何在点击加了很多层之后的某一个view,用最下面那个vc去push 或者present 一个新的控制器需要用到遍历响应者,,找到最近一个vc
- (UIViewController *)viewController{
for (UIView* next = self.view.superview; next; next = next.superview){
UIResponder *nextResponder = [next nextResponder];
if ([nextResponder isKindOfClass:[UIViewController class]]){
return (UIViewController*)nextResponder;
}
}
return nil;
}
主线程卡顿..第一反应应该去考虑列表加载和刷新时候里面的图片的获取方式..
reload tableview 卡线程..排除return height 时候的复杂计算耗时..定位到cell 里面的图片 加载到富文本时候的网络请求 延时...urlwithcontentof url
. 需异步加载..直接加载就会有问题...
所有卡线程的问题,,首先考虑在加载有图片的地方是否异步加载,,,而不是 直接 imageData with url
同样.. 该显示的ui 经常延时很久才出现要排查是否放在了异步子线程里面去了
float 类型 从后台获取时候也要使用float value 不然不足1的时候会转化成0;
lable 的长度不够..文字大了..有可能出现文字半截字的bug ..改变宽度即可
mjRefresh 的头部下拉刷新后会插入导航栏…跟collec 的分页有关,,去掉分页即可,collectionView.page.enable = no
动画过程中,键盘弹起..单独监听键盘的弹起改变正在动画的view 的frame 无效,,,需要给这个正在动画的view 加一个父view ..键盘弹起时候改变他的父view 的位置即可,为了用户体验,一个复杂的vc,一般开始时就给self.view 添加一个跟self.view一样大小的contentview.后面各个局部的小view再添加到这个contentview 上面..就会很容易同时对很多个局部view 进行一些操作(比如键盘弹起,全部上移,整体添加手势滑动等)
collectionViewcell 重复的问题.. 不足一页,,,会有重复的 要补齐..
跳到苹果评分页面
NSString* appStoreReviewLink = [NSString stringWithFormat:@"itms-apps://itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?id=%@&pageNumber=0&sortOrdering=2&type=Purple+Software&mt=8",@"1091154038"];
collection layout后的大小是由 sizeForItemAtIndexPath 代理方法最终决定的
读取图片两个方法的区别
UIImage *img = [UIImage imageNamed:@"myImage"]; // caching
UIImage *img = [UIImage imageWithContentsOfFile:@"myImage"]; // no caching
如果加载一张很大的图片,并且只使用一次,那么就不需要缓存这个图片。这种情况imageWithContentsOfFile比较合适——系统不会浪费内存来缓存图片。
然而,如果在程序中经常需要重用的图片,那么最好是选择imageNamed方法。这种方法可以节省出每次都从磁盘加载图片的时间。
长按手势的问题
//会调用2次,开始时和结束时
- (void)hello:(UILongPressGestureRecognizer *)longPress
{
if (longPress.state == UIGestureRecognizerStateEnded)//需要添加一个判断
{
NSLog(@"long");
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"hello"
message:@"Long Press"
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil, nil];
[alert show];
}
}
横竖屏问题 ..将项目info里面设置为仅支持竖屏,,然后在代码里面delegate里面处理横竖屏的问题可行..若info里面支持横竖屏..横屏启动会不走delefgate 里面的方法,,ui 会错乱
//这句话是防止手动先把设备置为横屏,导致下面的语句失效.就是没有锁定屏幕分享的时候横屏开播的情况
[[UIDevice currentDevice] setValue:[NSNumber numberWithInteger:UIDeviceOrientationPortrait] forKey:@"orientation"];
[[UIDevice currentDevice] setValue:[NSNumber numberWithInteger:UIDeviceOrientationLandscapeLeft] forKey:@"orientation"];
字体下沉.lable ui出现错乱的问题
_livingTitelNameLable = [MyControl createLabelFrame:CGRectMake(_livingTitelHeadButton.maxX +15, 5, SCREENW/2, _livingTitelBackVIew.height/2-10) Text:self.name TextColor:[UIColor blackColor] TextAlignment:NSTextAlignmentLeft fontName:setCustomfont font:16.0];
//如果不限制为1行..当字过长.会出现字体下沉.lable ui出现错乱的问题
_livingTitelNameLable.numberOfLines = 1;
//清除设备缓存 ..比command shift + k 有效 .编译可以..链接找不到文件的时候
xcode => window => project => derived data => delete
后台推音频需要打开 capabilities - background modes ===modes 勾选
// [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
先推流,马上播放一段流..不会有问题..但是 过一段时间 再播放一段视频流..会导致没有声音
使用delegate的时候要注意制定delegate的时机 要在创建的时候
_IsLivingView = [[CBIsLivingView alloc]initWithFrame:CGRectMake(0, 180*SCREEN_SCALE,SCREENW,30*SCREEN_SCALE)];
_IsLivingView.delegate = self;
delegate weak 放在创建view的地方..不能在viewdidload 那里.
jpush 在debug线下测试时候ok ,app上线之后 代码里面两处也已经设置为线上模式..但是上线后却收不到推送
原因在后台 需要同时将apns_production 字段调整为true
app第一次安装时候会有很多权限需要向用户申请,如果一些单例都放在新特性类的viewdidload 里面.会使得app 卡在启动页面,,放到viewdidappear 则不会卡死.但是如果权限一次申请过多.会有系统的弹框一闪而过 而探后后面的权限请求.(相当于前面的请求都会出现两次)的现象..最好的处理方式 是将获取权限的请求分散的放到各个功能用到的地方.
scrollview tableview collectionview 里面的cell 头部错位 跑偏 上移或者下移 使用下面代码,但是要注意 目前基本上没有ios7 用户..所以要去掉此判断
if (IOS7_OR_LATER) {
self.edgesForExtendedLayout = UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars = NO;
self.modalPresentationCapturesStatusBarAppearance = NO;
}
上线商店时候被拒..原因使用了alipay 的sdk .被苹果检测出api ,移除后重新提交.仍然被拒检测出,,仔细检查..之前只是移除了.a 和framework...openssl因为在alipay 的文件夹下面 ,有其他地方需要用到加密等....文件夹的名字依旧为alipay ..猜测是此原因 ,把文件夹改名之后..发现rsa 等文件里面找不到openssl 的相关投文件..查询知道是因为路径问题..之前seachHeader path 为alipay ..现在没有alipay 文件..所以找不到..需要设置一下路径问新的文件夹下面.. 还有linkbinary framework 里面的 libssl.a 去掉
加密解密
对项目所有的接口进行加密.
* 1> 加密过程是先加密,再base64编码
* 2> 解密过程是先base64解码,再解密
NSString *random =[self makeTimeSha];
NSString *preEncryptStr = [NSString stringWithFormat:@"%@",gkey];
NSData *data = [NSData data];
NSData *dd = [data encryptText:gkey key:random];
NSString * encryptStr = [dd base64EncodedString];
Url = [NSString stringWithFormat:@"%@&rand=%@&value=%@",webUrl,random,encryptStr];
后台统一定义一个key .用时间生成的随机值去进行混合加密,然后用base64编码一下, 后台解密ok 就返回请求数据
滥用继承关系
导航栏透明度的设置.除了跟自定义的导航栏里面的颜色设置有关系.如果有继承关系的baseVC里面也对导航栏的定义做了处理(方便全局统一处理导航栏定义).也会影响某个类对自己导航栏颜色的设置..较难以排查
baseVC里面的对导航栏设置的每一个属性,,在push .pop 之后都会对自定义的导航栏有影响...bug 较深,,
dataDic = [NSDictionary dictionaryWithObjectsAndKeys:@"2",@"goods_id", 标准的字典写法有时候回无缘无故 崩溃 并且没有任何提示..赋值后面的key 和value 改一下.替换 就好了..猜测是中英文格式原因..不得解
malloc: *** error for object 0x178010000: pointer being reallocated was not allocated
指针错误. 首页数据请求较多.不断的下拉刷新之后 app 发生崩溃. 要看内存..可能是因为内存的暴涨 没有释放 ,导致崩溃 ,,排除法 重点检查 cell 以及cell 里面的控件等创建..是否在不断的新创建 ,没有移除
stringWithContentsOfURL 获取某一地址返回的内容,始终是nil
NSURL *url = [NSURL URLWithString:@"http://xxxx.xxx.net/xxx/ xxx.html"];return [[NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil] objectFromJSONString];
但是发现返回值为nil,但是在网页中能打开网页,并没有错的,写到这里都懵逼了 项目有中并没有报错
最后发现IOS6引入了APP Transport Security(ATS),新特性要求app内访问的网络必须使用HTTPS协议
但是项目中是HTTP协议,使用私有加密方式保证数据安全 ,改成HTTPS协议传输太麻烦了
打开项目的 Info.plist中添加NSAppTransportSecurity类型Dictionary。
在NSAppTransportSecurity下添加NSAllowsArbitraryLoads类型Boolean,值设为YES。
但是有些小伙伴们在info.plist可能找不到NSAppTransportSecurity是因为
1.Xcode7.0中这项设定的名称为:NSAppTransportSecurity
2.Xcode7.1之后这项设定的名称为:App Transport Security Setting
时间格式问题
yyyy-MM-dd-HH:mm:ss 才是年月日标准时间 写成 YYYY-MM-dd-HH:mm:ss 会导致在2017/12/31 给返回 成了2018/12/31 因为最后一周的原因 也因为这个造成重大bug 获取时间不对导致时间全部错误
最近测试发现在某个页面的UITextView输入中文时,会显示输入错乱,如上图所示。语言问题,输入法等可能因素后,锁定了问题的所在: 为了实现字数限制 和禁止输入换行符,我在回调函数里写了如下的坑爹代码:
-(void)textViewDidChange:(UITextView*)textView{
textView.text = [textView.text stringByReplacingOccurrencesOfString:@"\n" withString:@""];
NSUIntegerlen =MIN([textView.textlength],140);
textView.text = [textView.text substringToIndex:len];
countLabel.text= len>0?[NSStringstringWithFormat:@"还可输入%d字",140-len]:@"最多50字";
countLabel.textColor = len<140?[UIColor colorWithWhite:0.5alpha:1]:[UIColor redColor];
}
在监听textview的时候和赋值的时候需要注意代码
项目中有需要用到列表,每行样式相同,行数不多,但是又不希望列表重用(在列表上有很多输入等其他操作,便于取值,重用会出现问题) 采用了每一个id 不一样的方式创建,在需要的地方 需要取出该行的cell 及cell内的某些数据.给cell设置tag 的时机很重要 ,必须要在创建那一刻去设置,不然可能会导致有时取不到改tag值的情况.也可将cell存到到一个数组在判断位nil 的时候,取数组的下标 即可将cell 取出
NSString *idstr = [NSString stringWithFormat:@"%ld",(long)indexPath.row];
ZJChunQiangTableViewCell *chunqiangcell = [tableView dequeueReusableCellWithIdentifier:idstr];
if (chunqiangcell == nil) {
chunqiangcell = [[ZJChunQiangTableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:idstr];
// if(!_cellArr){
// _cellArr = [NSMutableArray new];
// }
// [_cellArr addObject:chunqiangcell];
chunqiangcell.tag = (int)indexPath.row+10000;
}