项目中曾经遇到过的问题整理
由于问题设计分类较多,而简书中目录功能不可用,故在此标识分类,可以使用Command+F相关分类名,进行问题查找。
分类
UILabel标签控件
UISearchBar搜索条
UIAlertController警告框
UIPickerView选择器
UITableView表视图控件
UICollectionView集合视图
UIWebView或WKWebView网页视图
XIB布局
Common待分类
第三方
UILabel标签控件
文字显示异常(AttributedTitle副标题)
-
出现场景:
常规状态下单个Label的使用并不容易出现此类问题。
但是如果在XIB创建的TableViewCell文件中根据多种条件进行富文本设置时便非常容易出错。
例:某一按钮设置了Title以及AttributedTitle,由于优先级后者要高于前者,故在TableView刷新时可能会因此造成文本显示不正常。 -
解决方法:
如果需要进行富文本操作,设置按钮的AttributedTitle属性,不妨统一设置其他按钮的Title时,使用AttributedTitle来进行统一设置,规避问题的出现。
UISearchBar搜索条
搜索条清空时响应编辑完毕方法不及时
-
出现场景:
为满足一般搜索栏改变文字,实时刷新文字或搜索的数据源时。
在searchBar:textDidChange:中直接进行键盘的收起,增加清除按钮,却发现点击后键盘未收起。 -
解决方法:
需要使用方法选择器(SEL)在另一个方法中进行键盘收起才可行,具体原因不清楚。
UIAlertController提醒框
子类化提醒框弹出失败
-
出现场景:
为了方便起见,我们通过自定义API对提醒框进行子类化操作,并且默认以当前视图的导航控制器或者视图控制器进行弹出。
当在进行网络异步请求时同时进行了页面的返回,即调用了popViewController:方法。
此时由于视图被释放,弹出模态视图方法不可用。 -
解决方法:
暂无。
UIPickerView滚轮视图
崩溃
-
出现场景:
应用滚轮视图为自定义日期选择器,而不是用UIDatePicker时。
针对日期编辑,若所设定日期格式与日期选择器格式不匹配时,调用弹出即崩溃。 -
解决方法:
增加调用的容错判断,若对应数据源数据为空值或不符合格式,默认弹出当天日历;若不为空值且符合格式,则根据指定格式进行日期转换,并弹出指定日期日历。
键盘遮挡
-
出现场景:
以UIPickerView子类化为日期选择器为例,调用UIPickerView进行视图呼出的同时,调整视图位置。
若将光标焦点转移到另一个可输入框时,该UIPickerView不会被收起,而被键盘视图遮挡。 -
解决方法:
将子类化的UIPickerView的WindowLevel提高,此时由于优先级问题,则UIPickerView会类同UIAlertController,位于视图的最顶端进行展示。
2017.8.11
设置UIPickerView为对应录入框的inputView属性,如textField的inputView。
通过替换原有键盘视图来保证其弹出不被遮挡。
UITableView表视图控件
崩溃闪退(数据源问题)
-
出现场景:
通常我们使用XIB创建UITableViewCell时,会通过封装已有数据的模型进行展示。
当网络请求返回的JSON数据封装为模型时,如果模型字典的取值不匹配活着返回空值,可能造成类似Label等控件由于使用text属性,但是text为nil无法进行布局而崩溃。 -
解决方法:
- 使用第三方来进行规避,如NullSafe框架。(不需要进行过多操作)
- 为相关类进行延展,进行容错判断。(方便对产生错误数据进行定位)
- 界面显示之前进行判断,追加缺省值。(方便对产生错误数据进行定位)
单元格副标题不显示(detailText副标题)
-
出现场景:
当使用默认的单元格进行设置时,如果直接进行UITableViewCell的注册,设置detailText不生效或者说不显示detailText。 -
解决方法:
- 使用XIB创建TableViewCell,进行自定义布局。
- 使用initWithStyle:reuseIdentifier:方法完成TableViewCell的创建。
XIB创建的头视图或尾视图的背景色设置
-
出现场景:
如果是使用XIB创建的TableHeaderFooterVIew,直接进行对应View的背景色设置无效。 -
解决方法:
如果使用XIB创建组头或组尾时,需额外创建背景视图用于背景色设置,此问题也许是因为UITableHeaderFooterView的图层中本身存在一个ContentView。
(可通过模拟器Debug View Hierarchy,即调试台上的图层关系进行查看)
滚动时收起键盘
-
出现场景:
使用了ScrollView的keyboardDismissMode属性, 当设定为UIScrollViewKeyboardDismissModeOnDrag时,能满足滚动时收起弹出键盘的需求。
但是在调试台区域会打印相关信息。
[UIWindow endDisablingInterfaceAutorotationAnimated:] called on <UITextEffectsWindow: 0x7fc791c28a80; frame = (0 0; 375 667); opaque = NO; autoresize = W+H; layer = <UIWindowLayer: 0x7fc791c290a0>> without matching -beginDisablingInterfaceAutorotation. Ignoring.
-
解决方法:
如调试台打印结果最后一句,忽略即可。
TableView自动计算Cell高度
-
出现场景:
对Cell设置自动计算高度时,在layoutSubviews里进行多行文字的设置,可能会出现设置后自动计算高度无效。 -
解决方法:
若存在使用数据模型来完成Cell展示时,可以将多行文字的设置放在模型的set方法中完成,此时可以保证自动计算高度生效。
如果预估高度与实际高度相差很大,不建议使用自动计算高度的方法,可能会造成跳闪的效果。
2017.8.11
可以在模型中增设计算文字高度的只读属性,根据对应需要设置多行文字的内容进行预处理。
这也能保证表视图在进行布局时,减少计算高度产生的消耗。
TableView嵌套问题
-
出现场景:
当存在嵌套关系时,即Cell中嵌套TableView时,常常需要进行数据源赋值。
由于调用UI刷新的时机不确定,又不能保证实时赋予数据源时会刷新该Cell,便会造成滚动父TableView时,子TableView显示不正确的问题。 -
解决方法:
由于存在子TableView,需要在父Cell中进行子TableView数据源的刷新。
故在需要父Cell中进行子TableView的数据源刷新时,即在主线程进行UI刷新才能保证使用时不产生问题,
键入数据型控件数据丢失
-
出现场景:
XIB创建的Cell包含UITextField、UITextView时,若处于编辑状态时,视图被进行上下滚动,此时的Cell调用原有数据源进行文字设置,产生了刚录入数据被刷新清空,或者恢复原状的情况。 -
解决方法:
可使用在本地利用创建临时表单, 进行键值配对, 在编辑完毕的时候进行值更新, 在加载的时候从临时表单中取值。
2017.8.11
在每次录入操作时,进行原数据源的修改。
如传入模型数组,修改指定模型的相关值便能保证某一单元格重新可见时显示正确。
XIB创建UITableView时的数据问题
-
出现场景:
在XIB中使用了UITableView,并且用代码设置了数据源以及代理对象,相关数据依旧不显示。 -
解决方法:
在使用XIB时,除了设置数据源以及代理对象外,还需要在源文件进行数据源与代理方法的设定。
XIB创建UITableViewCell (2017.8.11)
-
出现场景:
控件约束不足,不能决定视图展示。
Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tableview cell's content view. We're considering the collapse unintentional and using standard height instead.
-
解决方法:
检查是否有设置表视图的相关高度, 如果使用自适应高度, 检查单元格是否具备约束保证至少单元格有不等于0的高度。 -
出现场景:
UIScrollView的内容高度不确定,即未设置contentView尺寸。
warning: Ambiguous Layout: Scrollable content size is ambiguous for "Scroll View
-
解决方法:
有关于一切在xib中使用scrollView时产生的任何包含ambiguous(即模凌两可的尺寸),均可以通过给scrollView设置一个子View作为ContentView, 设置其上下左右约束与父视图对齐, 设置一个高度或者宽度以便确定尺寸, 之后在源文件中对高度或者宽度进行调整, 即可确定可滚动区域的尺寸。任何需要展示在scrollView的自定义视图, 一律添加在ContentView上即可。
UICollectionView集合视图
屏幕旋转后样式问题
-
出现场景:
由于iPad开发时,常常需要项目能进行多角度旋转。若当前屏幕旋转方向为横屏后,进入下一级以UICollectionVIew为主页面时正常,此时再进行旋转为竖屏后会发生样式错乱。 -
解决方法:
使用[UIScreen MainScreen].bounds.size来约束相关视图的宽高时,本身存在缺陷。
不如使用XIB进行全局布局, 或增加各个Cell的图形约束。
UIWebView或WKWebView网页视图
断点调试
-
出现场景:
当打断点进行网页调试时,若超过10秒则会出现以下提示字样。
void SendDelegateMessage(NSInvocation *): delegate (webView:decidePolicyForNavigationAction:request:frame:decisionListener:) failed to return after waiting 10 seconds. main run loop mode: kCFRunLoopDefaultMode
-
解决办法:
暂无。真机独立操作时,一般不会产生此类超时问题。
视图出现黑边
-
出现场景:
不定期出现。 -
解决方法:
这是由于UIWebView的自身特性所决定, 无其他问题, 如果想要进行变更, 设定UIWebView的背景色或者设置其ScrollView的背景色。
2017.8.11
页面出现黑边可能是因为某些控件或者布局加载时间过长,黑边是作为占位空间的存在。
XIB布局
文字出现丢失或溢出
-
出现场景:
使用XIB进行布局的时候,以TableViewCell为例。
设置两个文本控件,第一控件为多行文字,第二控件位于第一控件底部的右侧,此时让TableVIiew使用自动计算Cell高度,且追加了第二控件对第一控件的头部约束。
如果此时第一控件文字大于两行, 文本便会造成第一文本溢出屏幕的情况。 -
解决方法:
- 将第二文本控件的宽度设为与第一控件相同。
- 增加约束条件固定第二控件位置。
猜想XIB控件的约束也许是自左向右进行的。
Xcode8. 0更新后针对iOS10. 0以下的XIB出现问题
-
出现场景:
更新Xcode8.0以后,XIB文件的XML布局信息发生改变,在针对版本10.0以下的系统时会存在问题,即在XIB上对视图进行属性设置。
以为XIB文件按钮添加圆角属性,页面加载完毕以后,在10.0以下的系统会造成“真机调试”崩溃。 -
解决方法:
使用代码进行此类属性设置,规避在XIB文件直接进行属性的设置,避免存在协作开发时,其他成员使用低版本Xcode问题。
调试台输出
真机第三方软件
-
出现场景:
使用键盘调用搜狗键盘时,搜狗基础键盘不可用?
plugin com.sogou.sogouinput.basekeyboard invalidated
-
解决方法:
暂无。
系统类
-
出现场景:
未知,也许因为超出内存。
CLTilesManagerClient: initialize, sSharedTilesManagerClient.
CLTilesManagerClient: init
CLTilesManagerClient: reconnecting, 0x13f5b3850
CLTilesManagerClient: XPC_ERROR_CONNECTION_INVALID!
-
解决方法:
暂无。
内存泄漏?
-
出现场景:
极少出现,在项目中未重现。故从网上搜索时,发现持多种观点,有直截了当说死循环造成的;有说初始化页面时间过长造成的;还有测试说在iPod touch9.3.3运行基于8.0系统的项目,但是SDK是10.0的时候;AFNetworking有内存泄漏造成的问题。
warning: could not load any Objective-C class information. This will significantly reduce the quality of type information available.
-
解决方法:
暂无。未完全了解问题所在。
动画开启关闭不匹配
-
出现场景:
发生该问题主要因为存在上一项动画未结束时开启下一项动画。
Unbalanced calls to begin/end appearance transitions for <QLRemotePreviewContentController: 0x7fbd219c7000>.
-
解决方法:
对即将开启的新动画进行异步处理, 或者进行延时展示处理。
触摸次数超出上限 (2017.8.11)
-
出现场景:
设备接收的触摸事件在短时间内超负荷便会产生该提示。
Failed to receive system gesture state notification before next touch
-
解决方法:
短时的触摸事件数量超出了触摸识别器的负荷引发此问题。解决办法自然是,别一直戳戳戳!
第三方
AFNetWorking3. 0版本内存泄漏问题
-
出现场景:
所有使用到AFHTTPSessionManager相关API时均会产生该问题。 -
解决方法:
使用自封装的网络请求。
AFNetWorking请求后返回的数据不正确
-
出现场景:
进行网络请求访问时, 返回的数据为空或格式不正确。 -
解决方法:
存在多种可能方式产生此类问题:- 响应头解析方式未设置。
- 数据格式解析失败。
- 后台返回数据存在特殊字符,如在JSON数据中嵌套了换行符、空格符、在iOS下需要对其进行过滤替换,将"/r"变成"//r"才可正常使用。
- 使用数组或者字典进行数据存储失败, 后台服务器的JSON数据可能是一串字符串,直接进行对应系统的解码方式解码即可。
Stuff杂类
返回手势造成页面卡死
-
出现场景:
当在ViewWillAppear的方法中进行网络请求,并且在发起请求时开启动画, 例风火轮的转动,结束时停止风火轮转动并隐藏的操作。
在使用右滑手势进行返回的时候,会由于出现部分界面导致调用到ViewWillAppear,此时风火轮的隐藏失败,而如果该风火轮是应用在级别比较高的视图中,其弹出时其他控件不响应操作,便会造成整个页面假死的状态。 -
解决方法:
在ViewDidLoad中进行网络请求,但由于视图出现以后才进行相关设置,可能会造成页面显示延迟。
切换短信界面显示不正确问题
-
出现场景:
使用openURL:options:completionHandler:方法时,传入打开短信的URLScheme,即"sms://相关号码",此时打开短信面板,点击取消可以返回到正常短信面板继续操作。
但是如果未点击取消操作,重新返回App中进行短信请求的发起,此时相关号码打开短信面板会显示未知用户,且点击取消后仅收起键盘,不可正常切回短信面板继续操作。 -
解决方法:
暂无。