Bug一扫光(iOS相关总结)2017-11-02更新

图片发自简书App

由于本人可能最近记性开始减退了,所以要针对性的采取点措施了!对应犯过的问题,希望我能最好不再犯,如果还是出现了,希望自己能快速找到问题并解决!

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防止滑动部分数据丢失

废话不多说, 开始列举, 为了后期持续添加更新方便,这里倒序排列!

十九.当多分区的情况, 采用不同分区Cell 标识Id防止滑动部分数据丢失

滑动的cell里自定义横线丢失

解决方案:
采用不同分区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蓝色)

申明:这张选中图片按照原始的样子显示出来,取消渲染(而默认选中后渲染的render蓝色)

使用imageWithRenderingMode

[[UIImage imageNamed:@"day"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]

十七.针对iOS11/iPhoneX相关适配问题

请移步:iOS11/iPhoneX相关适配问题

更新适配版本时 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刷新(移除子视图重新创建赋值)的相关问题

像一些循环创建的控件特别容易出错!这里举个栗子:



当UITableView加了一个tableHeaderView以后,而tableHeaderView上有个循环创建的标签组视图,我们在请求获取不同值时很容易多次创建循环控件,这样就很容易涉及到刷新tableHeaderView的问题,但很有可能我们不能刷新其他分区,则不需要整体刷新使用[self.tableView reloadData];那么最简单解决方案如下:

解决方案:
重新创建前先要移除当前子控件上所有数据然后赋值,防止控件重复创建数据重叠情况
不用循环,一行代码移除所有子视图

  [self.tagsView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];

十二.Xcode 8 模拟器无法调试

The request was denied by service delegate (SBMainWorkspace) for reason: Unspecified.
才升级 Xcode8.3不到一个星期, 上一秒还在开心的写代码调试,下一秒模拟器就无法调试了,鬼知道我经历了什么!


解决方案:

  1. 点击模拟器前面的工程 -> New Scheme ->Target选择第一个Name默认点击OK重新添加一个工程到模拟器上。


  2. 点击模拟器前面的工程 ->Manage Schemes (如果你完成第一步就会有两个工程,将以前的删除掉)删除方法是选中不要的工程,点击左下方的“-”号移除就可以了。
  3. 选中你新添加的工程run就可以了。如果还是不可以的话,就关闭模拟器和 Xcode, 重新打开运行就可以了。

十一. linker command failed with exit code 1 (use -v to see invocation)的相关问题

这种问题,通常出现在添加第三方库文件或者多人开发时。
一般是找不到文件而导致的链接错误。 我们可以从如下几个方面着手排查。

1> 如果是多人开发,你同步完成后发现出现如下的错误。


解决方案:
错误中出现了“MyPageLogViewController”这个类,你可以找到这个类的.m文件, 查看他的Target Membeship,看是否勾选! 如果没有勾选上,点击勾选。然后编译查看。 如下图:

2> 如果是新添加的第三方库,且不是静态库

解决方法:
先重复第一步过程,然后找到 Build settings->Linking->Other Linker Flags
将此属性修改成-all_load 或者 -ObjC ,这个需要视情况而定。总之可以多试几次的。

3> 如果添加的是第三方静态库(.a文件)


原因:
在用到这个库的所有文件中都出现了错误, 如上 BaiduMobStatAppDelegate 类和 MyPageLogViewController类
这种情况就可能是这个静态库路径混乱导致的链接错误

解决方法:
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 整理笔记

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容