iOS-开发常见问题汇总
Posted stevenhusir
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS-开发常见问题汇总相关的知识,希望对你有一定的参考价值。
1.OC中处理json解析出NSCFString
//注意:
NSDictionary * homeworkDic;
if ([[dict valueForKeyPath:@"data.homework"] isKindOfClass:[NSDictionary class]]) {
homeworkDic = [dict valueForKeyPath:@"data.homework"];
}else
{
homeworkDic = [self dictionaryWithJsonString:[dict valueForKeyPath:@"data.homework"]];
}
2.根据网络状态加载图片
- 先从磁盘中获得原图 -> 原图已经被下载过->直接显示
- 原图并未下载过-> WiFi直接下载原图
- 原图并未下载过-> 3G4G网络下时候要下载原图
- 原图并未下载过-> 没有可用网络,此时从磁盘缓存中查找缩略图
- 缩略图已经被下载过-> 直接显示
- 没有下载过任何图片-> 显示占位图(placeholder)
3.ViewWithTag-查找子控件报错
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
// 求出标题按钮的索引
NSUInteger index = scrollView.contentOffset.x / scrollView.width;
// index == [0, 4]
// 点击对应的标题按钮
HKTitleButton *titleButton = self.titlesView.subviews[index];
//HKTitleButton *titleButton = [self.titlesView viewWithTag:index];
//此代码 索引为0时会报错(viewWithTag 递归查找,包括自己 先查找自己的tag,再查找子视图的tag,父视图默认tag为0,找到的是UIView而不是Button,所以setSelected方法找不到)
[self titleButtonClick:titleButton];
}
4.ios12下APP进入后台后再返回前台连接断开
1.在工程的AppDelegate文件中
@property (nonatomic, unsafe_unretained) UIBackgroundTaskIdentifier taskId;
2.在AppDelegate中的- (void)applicationDidEnterBackground:(UIApplication *)application 方法中
self.taskId =[application beginBackgroundTaskWithExpirationHandler]
用完的时候调用endTask
3.模拟一个长时间的任务
4.后台任务结束的时候要释放定时器
5.空数组的处理
if (![array isKindOfClass:[NSNull class]] && array.count > 0 && array != nil) {
}
数据源数组中包含空数组,怎么移除?
if ([self.dataArray containsObject:@[]]) {
[self.dataArray removeObject:@[]];
}
6.在同一页面同时展示登录和注册View
在一个UIView设置它的Frame的宽度是屏幕的两倍,然后把登录的View和注册的View同时加载这个View上(注册View.x=这个View宽度的一半),点击切换按钮时改变这个UIView的leadingConstraint(View.x)就可以让这两个View显示。
7.升级Https证书报错
iOS11 HTTP load failed (error code: -999)
// 1.设置非校验证书模式
_sessionManager.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
_sessionManager.securityPolicy.allowInvalidCertificates = YES;
[_sessionManager.securityPolicy setValidatesDomainName:NO];
8.某个页面禁止侧滑手势返回
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
// 禁用返回手势
if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
self.navigationController.interactivePopGestureRecognizer.enabled = NO;
}
}
- (void)viewDidDisappear:(BOOL)animated {
[super viewDidDisappear:animated];
// 开启返回手势
if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
self.navigationController.interactivePopGestureRecognizer.enabled = YES;
}
}
9.调用代码使APP进入后台,达到点击Home键的效果。(私有API)
[[UIApplication sharedApplication] performSelector:@selector(suspend)];
10.设置滑动的时候隐藏navigationBar
self.navigationController.hidesBarsOnSwipe = YES;
11.ld: library not found for -lXXXXX 的解决方法
ld: library not found for -lAFNetworking 这个错误是说编译时找不到AFNetworking这个链接库,但是我在项目代码中找到对引用的地方,没有其他异常。
- 方法一:点击 XCode 工程文件,在 Build Phases 中查看 “ Link binary With Libraries”
如果不出所料,你应该能发现有一到数个的条目是用红色字体来显示的。
说明这些被工程引用的这些文件,其物理文件已经不处于之前所记录的地方了。
这种情况下,右键点击红色条目,选择 “Reveal in Project Navigator”,
此时大抵能在左侧栏中定位到缺失文件所在的路径,接下来就好办了,找到缺失的文件,挪回它应该待的地方。
- 方法二:在工程的 Target 中选中要执行编译的某个target, 然后 “get info”,打开 Build 设置页面,在 “ Library Search Path” 中添加缺失链接库的所在文件夹的路径。
本来看到这两种方法时觉得第一种应该就能解决了,因为报错的信息看起来就像是原来的文件引用不到了而已,但是当我按照第一种方法去做时,发现“ Link binary With Libraries” 下没有红色的条目,而且本来就没有AFNetworking这个条目,所以第一种方法不适用。第二种方法也不对,因为我们的项目很多库是通过pod管理的,AFNetworking也是pod管理的库之一。这时候我就想起可能是pod的原因,在尝试了pod update无果后,发现了第三种解决类似问题的方法。
方法三:BuildSettings -> Other Linker Flags -> 去掉对应第三方库的引用
方法四:关闭Xcode,在控制台打开到工程目录,用pod install 命令重新安装,成功后再打开Xcode编译项目。
以上是关于iOS-开发常见问题汇总的主要内容,如果未能解决你的问题,请参考以下文章
iOS开发CGRectGetMidX. CGRectGetMidY.CGRectGetMinY. CGRectGetMaxY. CGRectGetMinX. CGRectGetMaxX的使用(代码片段