iOS开发中一些坑点,也许你也遇到过
本文中的一些坑点是楼主个人在日常开发中遇到的一些问题,记录搜集下来分享在此,希望能给同样遇到问题的同学一些帮助
后续不定期持续更新
保持手机常亮
很多时候,我们需要保持手机常亮,比如视频或直播的时候,那么只需要加上下面这句就好了,但是离开当前页面的时候不要忘记关掉(设置为NO)
[[UIApplication sharedApplication] setIdleTimerDisabled:YES];
开启系统自带侧滑返回
当你修改导航栏以后,你就会发现自带侧滑返回(边缘70宽度有效)不能用了,那么请你在navi
的根视图控制器里面加上这句,就可以了
// Objective - C
self.navigationController.interactivePopGestureRecognizer.delegate = (id<UIGestureRecognizerDelegate>)self;
// swift因为是强类型,所以不能像上面那么写
// 你只需要根视图遵循UIGestureRecognizerDelegate协议,然后加上下面这句就OK了
navigationController.interactivePopGestureRecognizer.delegate = self
Xcode 8的注释快捷键不能用了
Xcode8
上的bug
真是多到可怕,注释快捷键问题就是其中之一,有时用的好好的,突然就失灵了,这不是你的电脑问题,而且Xcode8
的bug
,解决办法 -> 在终端输入下面一行命令,输入后会要求输入密码,等待几秒后,就完成了,然后重启电脑就行了
sudo /usr/libexec/xpccachectl
LaunchImage
加载LaunchImage
的方法有两种:
- 直接使用Launch Screen File
- 使用Assets.xcassets里面的LaunchImage文件
一般都是使用第二种方法,在配置这个文件的有几点需要注意
1 四个尺寸的图一定要一一对应,就是对应的坑里放对应大小的图片,不然不能用,运行的时候不显示;当然,你放错了图片,Xcode
会直接给予警告的
2 放好图片以后,当然要测试了,一般情况下,你直接运行是不会显示的,即使你的图片放置的都正确,这个时候你必须删除模拟器/手机原来的那个项目,再次运行才会显示.
swift中使用系统关键字
一般情况下,最好不要使用系统关键来命名
但是也有特殊情况,非得使用不可,那么这个时候就需要使用''
符号来包裹该关键字才可以
示例:
/// Returns a default `URLEncoding` instance.
public static var `default`: URLEncoding { return URLEncoding() }
注释标签
在开发中,注释是必不可少的一部分,一份注释良好的代码可以帮助维护者快速上手;通常我们会使用mark
标签来表明一个段落代码的用意:
// MARK: 这里是逻辑业务
// MARK: 这里是界面设置
当然,注释标签不仅仅只有这一个,还有TODO
,这是一个非常有用的标签,你可以在TODO
后面写上你未完成的事情,这样对你或维护者都是一种负责任的表现:
// TODO: 这里还有一些没有完成
// FIXME: 这里有些bug要修复
当你使用TODO
和FIXME
标签的时候,你会发现在其左侧的图标都同MARK
不一样
有人可能对觉得这几个标签是在swift中使用的,其实不然,现在已经通用了,他们在Objective - C
的环境中也一样可用,因为他们只是针对Xcode的;
当然如果你习惯下面这种写法也不是不可以的,但是下面这种方式只能在Objective - C
中使用,Swift3.0
以后就不能使用了
#pragma mark - 这里是逻辑业务
#pragma mark - 这里是界面设置
返回值警告问题
在Swift
中,有些方法会默认有返回值,而这些值你可能会用不到,这个时候编译器就会给你警告:xxx is unused
这个时候我们可以使用 _
来接收一下,其实不接收也没有关系,然而强迫症和处女座的同学可能会有点儿...
_ = self.navigationController?.popViewController(animated: true)
storyboard/xib上拖tableview上方空白问题
在storyboard/xib
上拖一个tableview
有时候,上方会空出一片空白,同时你运行的时候也会出现相应的空白区,就算你的约束设置为0
也是不行的
解决办法如下:
tableview空白解决方法CoreData存储使用Transformable类型存储失败
使用coredata
存储的时候,如果你需要存储一些复杂类型的时候,你可能会选择transformable
格式,这个没有问题,但你可能会遇到这样的情况:其他都能存进去,而transformable
类型的存不进去😱
解决办法:查看你要存储的数据类型有没有遵循NSCoding
协议,因为只有遵循了该协议的类型才能够使用transformable
类型存储
CoreData自动子类化问题
如果你是一个coredata
使用者,那么你一定遇到过这样的问题,当你创建好entity
以后,使用Xcode
的自动子类化(editor -> Creat xx Classes
),这个时候Xcode
会自动为你创建好两个类,分别是:
- entityName + CoreDataClass
- entityName + CoreDataProperties
然后你开心打开文件后,发现,一片红色...
一片血红然后你开始如下步骤来回循环:
- command + K
- command + B
- 蒙逼一小会儿
- 继续步骤1
造成这个问题的原因是,你在创建的时候没有把对应entity
的自动创建给勾选掉;
也就是说,其实Xcode
在你创建这个entity
的时候已经创建了上面两个类了,只是没有直接添加在Xcode
里面
而是隐藏在build
文件里面路径如下
/Users/<your user name>/Library/Developer/Xcode/DerivedData/AppName-agkwmibzbopevjgfajlcbyixzyev/Build/Intermediates/AppName.build/Debug-iphonesimulator/AppName.build/DerivedSources/CoreDataGenerated/Model
简直深不可测,谁能想到在这里?笔者能发现是因为使用了全局搜索(好像搜了差不多10分钟...)
解决办法:
把系统自动创建的那俩货删掉,按照上面的路径找到他们.
what?还不行?
把derivedData
里面带有你项目名称的文件夹删掉,然后在把工程里面之前创建的那俩类也删掉,再然后选中要子类化的entity
,再然后把右侧Data Model Inspector
里面的Codegen
属性修改为Manual/None
,最后再去创建
Archives - Crashes窗口
在打包上架的时候,你可能会来回打包几次,毕竟会有各种问题出现;
有些人使用电脑的习惯是,只要不用的窗口立马: command + w
然后想去找Archives - Crashes
列表发现已经关闭了,怎么办?再打包一次,然后让Xcode
自己打开 ?
其实,Xcode
是有这个界面的快捷打开方法的,Window -> Organizer
🙈
Swift中Extension重写方法问题
在写swift
的时候经常会遇到这样的问题:在extension
中override
父类的方法,没有报错,但是不执行...
这个问题不是代码的问题,也不是Xcode
的问题,是因为Extension里面本身就不支持,官方解释如下:
Extensions can add new functionality to a type, but they cannot override existing functionality
如果非要这么做怎么办?非要这么做不是不可以,如果父类是你自己写的,那么你可以在父类相对应的方法前面加上@dynamic
关键字
模态透明Controller不成功
在iOS
开发中经常遇到这样的需求,在某个页面需要modal
出来一个高斯模糊的页面(新浪微博的发微博页面就是如此),效果如下:
在iOS 8
之前比较蛋疼,高斯模糊的view
要自己手动实现,然而8之后就多了一个VisualEffectView
,如果还在适配iOS 7
的同学请自行跳过😄
iOS 8
之后常规的思路是把view
的backgroundColor
修改为clearColor
,然后上面在放一个VisualEffectView
,然而事实上幺蛾子总会让我们措手不及,modal
出来以后,下面view
的backgroundColor
会变,在完全modal
出来以后就自动变成白色了(如果你没有设置window
的backgroundColor
,那么就是黑色)...
请看幺蛾子(总有一些坑想害朕😤)
总有一些幺蛾子在遍寻Google
之后,找到了原因:
NavigationController and the View Controllers are designed in such a way that only one view controller may show at a time. When a new view controller is pushed/presented the previous view controller will be hidden by the system. So when you reduce the modal view's alpha you will possibly see the window's backgroundColor (the black color you see now)
果然是系统干的,因为我们modal
出新的viewcontroller
以后,系统把其隐藏了,导致我们底部直接看到了window
,所以,那个白色其实是window
的颜色🙈
所以,要修改他们的关系,解决办法,就是设定你要modal的controller的modalPresentationStyle,代码如下:
// swift
toViewController.modalPresentationStyle = .overCurrentContext
// OC
toViewController.modalPresentationStyle = UIModalPresentationOverCurrentContext;
生命不息,折腾不止...
I'm not a real coder, but i love it so much!