因为本人可能最近记性开始减退了,因此要针对性的采起点措施了!对应犯过的问题,但愿我能最好再也不犯,若是仍是出现了,但愿本身能快速找到问题并解决!web
1.针对 iOS 10的相关问题 2.针对 APP上架失败相关问题 3.当一个页面出现多个分区去请求时,使用不一样 model 时会出现崩溃现象. 4.UI未及时刷新数据 5.手势冲突问题 6.关于 UITextField 收起键盘问题 1> 文本输入框在 tableViewCell 上 2> 文本输入框在 导航栏 上 3> 文本输入框和勾选项在同一页面的 tableview 的布局上 7.用户安全和隐私添加描述的相关问题 8.按钮点击无效的问题 9.[__NSCFNumber length]: 的问题 10.__NSCFNumber isEqualToString:的问题 11.linker command failed with exit code 1 (use -v to see invocation)的相关问题 12.Xcode 8 模拟器没法调试 13.tableHeaderView刷新(移除子视图从新建立赋值)的相关问题 14.启动页在模拟器上显示OK, 在真机上却不显示 15.UIWebView加载过程当中,在页面没有加载完毕前,会显示一片空白。 16.金额加载中显示
null
, 展示修改成加载中为--
加载完成显示正确金额。 17.针对iOS11/iPhoneX相关适配问题 18.导航栏上切换头像的时候, 取消渲染(而默认选中后渲染的render蓝色) 19.当多分区的状况, 采用不一样分区Cell 标识Id防止滑动部分数据丢失安全
废话很少说, 开始列举, 为了后期持续添加更新方便,这里倒序排列!bash
##十九.当多分区的状况, 采用不一样分区Cell 标识Id防止滑动部分数据丢失app
滑动的cell里自定义横线丢失async
解决方案: 采用不一样分区Cell 标识Id布局
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *cellId = @"cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];
if (indexPath.section == 0) {
static NSString *vipCellId = @"vip_cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:vipCellId];
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:vipCellId];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
// 中间分割线
UIView *line = [[UIView alloc] init];
line.backgroundColor = YYPLineColor;
line.frame = CGRectMake(0, 43, UI_View_Width, 1);
[cell.contentView addSubview:line];
}
if (indexPath.row == 0) {
cell.textLabel.text = @"测试1";
} else if (indexPath.row == 1) {
cell.textLabel.text = @"测试2";
}
return cell;
} else if (indexPath.section == 1) {
YYPPetCell *cell = [YYPPetCell cellWithTableView:tableView];
if (self.petList.count) {
YYPPetModel *model = self.petList[indexPath.row];
cell.model = model;
}
return cell;
}
return cell;
}
复制代码
##十八.导航栏上切换头像的时候, 取消渲染(而默认选中后渲染的render蓝色)post
申明:这张选中图片按照原始的样子显示出来,取消渲染(而默认选中后渲染的render蓝色)测试
使用imageWithRenderingMode
ui
[[UIImage imageNamed:@"day"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]
复制代码
##十七.针对iOS11/iPhoneX相关适配问题 请移步:iOS11/iPhoneX相关适配问题spa
更新适配版本时 iPhone X 的启动图适配加上了, 千万别忘了也要传 Icon. 不然就会有上传版本时会有提示警告滴~
##十六.金额加载中显示null
, 展示修改成加载中为--
加载完成显示正确金额。
拼接字符串时候, 金额加载过程当中会显示null
. 解决方案: 为了避免让金额加载中显示null
, 则修改加载中为--
, 加载完成后显示正确金额.
valueLabel.text = self.allSale ? self.allSale : @"--";
复制代码
格式化金额这块, 请移步:三位一逗号¥94,862.57
##十五.UIWebView加载过程当中,在页面没有加载完毕前,会显示一片空白。
**解决方案:**让UIWebView背景透明。
web.backgroundColor = [UIColor clearColor];
web.opaque = NO;
[web setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"webbg.png"]]];
复制代码
##十四. 启动页在模拟器上显示OK, 在真机上却不显示
图片是 jpg 图片不是 png 图片, 从新要 png 图片时可能美工给你图片的时候,直接把jpg文件改后缀为png给你了,但本质上它仍是一张jpg图片,真机根据你给的png信息没法解析。
解决方案: 找美工从新要一张真的png图片,或者本身去处理图片: 用画图软件打开 jpg 图片另存为 png 图片. 删除 APP 从新运行便可.
##十三.tableHeaderView刷新(移除子视图从新建立赋值)的相关问题 像一些循环建立的控件特别容易出错!这里举个栗子:
解决方案: 从新建立前先要移除当前子控件上全部数据而后赋值,防止控件重复建立数据重叠状况 不用循环,一行代码移除全部子视图
[self.tagsView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
复制代码
##十二.Xcode 8 模拟器没法调试 The request was denied by service delegate (SBMainWorkspace) for reason: Unspecified. 才升级 Xcode8.3不到一个星期, 上一秒还在开心的写代码调试,下一秒模拟器就没法调试了,鬼知道我经历了什么!
解决方案:
##十一. linker command failed with exit code 1 (use -v to see invocation)的相关问题
这种问题,一般出如今添加第三方库文件或者多人开发时。 通常是找不到文件而致使的连接错误。 咱们能够从以下几个方面着手排查。
####1> 若是是多人开发,你同步完成后发现出现以下的错误。
####2> 若是是新添加的第三方库,且不是静态库 解决方法: 先重复第一步过程,而后找到 Build settings->Linking->Other Linker Flags 将此属性修改为-all_load 或者 -ObjC ,这个须要视状况而定。总之能够多试几回的。
####3> 若是添加的是第三方静态库(.a文件)
解决方法: Build settings->Search Path->Library Search Paths 添加静态库的相应路径。以下图
####4> 若是上面方法都不行且报错信息以下图:
解决方案: 看看是否是有新添加的文件跟以前文件同名,修改后面新添加的文件名.个人就是XHHFormulaDetailController文件同名可是不在一个文件夹里,因此当时新添加上去时未提醒,也就是说若是在同一个文件夹内,会提醒是否替换文件时你就能发现本身文件同名了,可是不是在同一个文件夹内就会悲催了.
####5> 若是上面的全部方法都无论用。你能够再试试这个方法: 解决方案: 错误信息中出现了某个类的名字,去原文件中看看#import了哪些第三方库,把这些库挨个注释排除,找到出错的那个库,而后按照官方提供的步骤从新添加一遍。
以上这些就是 linker command failed with exit code相关的问题了!
##十. __NSCFNumber isEqualToString:的问题
缘由: 接口返回来的数据,咱们客户端常常不能提早知道接口返回的数据类型,大部分的数字是numer类型,可是有不少时候接口会返回NULL,解析的时候当作NSString来解析,可是其实这个数据是NSNumber类型,在iOS 8以前的版本上是不会报错的
解决方案: 能够在用到isEqualToString的地方先判断这个数据的类型,而后再进行你的[ str isEqualToString:...]...操做 . 判断以下:
NSString *str;
if ( [object isKindOfClass:[NSNumber Class]])
{
str = [object stringValue];
}
else if ([object isKindOfClass:[NSString Class]])
{
str = object;
}
复制代码
因此从接口拿数据的时候须要统一用**[NSString stringWithFormat: ] **转化一下也能够.
##九. [__NSCFNumber length]: 的问题 缘由: 这个错误是咱们客户端 里写model的所需的当前字段的数据类型为NSNumber类型,而在字典转模型时写成了NSString类型
解决方案: 将模型属性中的所需的当前字段改成NSNumber类型,调用的时候作一下数据转换,设置属性类型为NSNumber,调用时作下数据类型转换,用[NSString stringWithFormat: ]转成NSString便可
##八. 按钮点击无效的问题 咱们能够从以下几个方面着手排查: ####1> 查找是否添加addSubview ####2> 查找frame设置在点击范围区域 解决方案: 第一步和第二步可同时用添加背景色的方法去排查.
####3> 若是上述都没解决,则看下层级是否有imageView 缘由: Button放在了imageView上了, imageView没有打开交互功能,致使按钮点击事件无效!
解决方案: 打开imageView的交互功能.
bgImageView.userInteractionEnabled = YES;
复制代码
##七. 用户安全和隐私添加描述的相关问题 打了全局断点也未停在项目代码中
举个🌰: ####1> 在扫描相关 启动相机 的问题
缘由: 相机启动没有开启访问权限,在调用相机,时,都须要在 info.plist 中进行配置添加.
解决方案: 在 info.plist 文件里添加,Source Code模式下添加.
####2> iOS 10对用户安全和隐私的加强,在申请那多私有权限的时候都须要添加描述
缘由: iOS10 对于隐私权限更加严格了.在调用相机,相册,定位,蓝牙等等时,都须要在 info.plist 中进行配置添加.
解决方案:
<key>NSAppleMusicUsageDescription</key>
<string>访问媒体资料</string>
<key>NSBluetoothPeripheralUsageDescription</key>
<string>访问您的蓝牙</string>
<key>NSCalendarsUsageDescription</key>
<string>访问您的日历</string>
<key>NSCameraUsageDescription</key>
<string>访问您的相机</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>始终访问您的位置</string>
<key>NSLocationUsageDescription</key>
<string>访问您的位置</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>试用期间访问您的位置</string>
<key>NSMicrophoneUsageDescription</key>
<string>访问您的麦克风</string>
<key>NSMotionUsageDescription</key>
<string>访问运动与健康</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>访问您的相机进行拍摄</string>
<key>NSRemindersUsageDescription</key>
<string>访问您的提醒事项</string>
复制代码
##六. 关于 UITextField 收起键盘问题
####1> 文本输入框在 tableViewCell 上 解决方案: 这个时候仅仅须要添加轻点手势在 View上,若是点击其余区域让视图退出编辑状态就收起键盘
// 添加键盘收起手势
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapClick)];
[self.view addGestureRecognizer:tap];
复制代码
// 键盘收起手势
- (void)tapClick {
// 视图退出编辑状态(收起键盘)
[self.view endEditing:YES];
}
复制代码
####2> 文本输入框在 导航栏 上 解决方案: 这个时候仅仅须要加载在 View上,若是点击其余空白区域让文本输入框收起键盘
// 添加键盘收起手势
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapClick)];
[self.view addGestureRecognizer:tap];
复制代码
// 键盘收起手势
- (void)tapClick {
[self.searchBar resignFirstResponder]; // 关闭第一响应者
}
复制代码
####3> 文本输入框和勾选项在同一页面的 tableview 的布局上 当须要去点击选中或者取消选中时,上面的添加手势方法再也不可行,会有冲突. 解决方案: 能够选择在点击当前行效果里去添加视图退出编辑(收起键盘)效果.
// 选中当前行
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
XHHPremixModel *model = self.list[indexPath.row];
// 处理勾选性问题, 选中赋值为1
if ([model.unit isEqualToString:@"1"]) {
// 编辑状态 点击选中
model.selected = !model.selected;
[self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
}
// 视图退出编辑状态(收起键盘)
[self.view endEditing:YES];
}
复制代码
##五. 手势冲突问题 tableviewcell能够触发点击,同时tableview的父视图有点击识别,这样点击的时候就会产生冲突。解决方法在GestureRecgnizer代理方法里面区分手势。
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapClick)];
[self.view addGestureRecognizer:tap];
tap.delegate = self; // 解决手势冲突问题设置代理
复制代码
解决方案: 控制器遵照协议 UIGestureRecognizerDelegate,实现下面的方法
#pragma mark tapGestureRecgnizerdelegate 解决手势冲突
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
//NSLog(@"手势触发的类=%@",NSStringFromClass([touch.view class]));
// 若为UITableViewCellContentView(即点击了tableViewCell),则不截获Touch事件
// 点击tableViewCell不执行Touch事件
if ([touch.view isKindOfClass:[UITableView class]]){
return NO;
}
if ([NSStringFromClass([touch.view class]) isEqualToString:@"UITableViewCellContentView"]) {
return NO;
}
return YES;
}
复制代码
##四. UI未及时刷新数据 解决方案: 须要在主线程去作相应操做发通知去更新
- (void)setUnreadMessageNum:(int)unreadMessageNum {
_unreadMessageNum = unreadMessageNum;
// 须要在主线程去更新 发通知
dispatch_async(dispatch_get_main_queue(), ^{
[[NSNotificationCenter defaultCenter] postNotificationName:ZH_Notification_isChangedUnreadMessageNum object:nil];
});
}
复制代码
##三. 当一个页面出现多个分区去请求时,使用不一样 model 时会出现崩溃现象. 报错以下:[XHHNewTecProModel materialName]: unrecognized selector sent to instance 0x60000042dce0 2017-03-24 10:39:06.356 ZLFeed[25691:1317187] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[XHHNewTecProModel materialName]: unrecognized selector sent to instance 0x60000042dce0' *** First throw call stack:
解决方案: 在获取数据请求六里不要总体刷新,不要使用reloadData方法. 仅仅刷新当前分区就好.
// 仅仅刷新一个section
NSIndexSet *indexSet = [[NSIndexSet alloc]initWithIndex:0];
[self.tableView reloadSections:indexSet withRowAnimation:UITableViewRowAnimationAutomatic];
复制代码
##二. 针对 APP上架失败相关问题 请移步: iOS APP上架各类被拒"悲剧"
##一. 针对 iOS 10的相关问题 请移步:兼容iOS 10 整理笔记