Des's iOS iOS开发技巧一些错误集锦

iOS开发中一些坑点,也许你也遇到过

2017-01-06  本文已影响1145人  庸者的救赎

本文中的一些坑点是楼主个人在日常开发中遇到的一些问题,记录搜集下来分享在此,希望能给同样遇到问题的同学一些帮助
后续不定期持续更新

保持手机常亮

很多时候,我们需要保持手机常亮,比如视频或直播的时候,那么只需要加上下面这句就好了,但是离开当前页面的时候不要忘记关掉(设置为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真是多到可怕,注释快捷键问题就是其中之一,有时用的好好的,突然就失灵了,这不是你的电脑问题,而且Xcode8bug,解决办法 -> 在终端输入下面一行命令,输入后会要求输入密码,等待几秒后,就完成了,然后重启电脑就行了

sudo /usr/libexec/xpccachectl

LaunchImage

加载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要修复

当你使用TODOFIXME标签的时候,你会发现在其左侧的图标都同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空白

解决办法如下:

tableview空白解决方法

CoreData存储使用Transformable类型存储失败

使用coredata存储的时候,如果你需要存储一些复杂类型的时候,你可能会选择transformable格式,这个没有问题,但你可能会遇到这样的情况:其他都能存进去,而transformable类型的存不进去😱

解决办法:查看你要存储的数据类型有没有遵循NSCoding协议,因为只有遵循了该协议的类型才能够使用transformable类型存储

CoreData自动子类化问题

如果你是一个coredata使用者,那么你一定遇到过这样的问题,当你创建好entity以后,使用Xcode的自动子类化(editor -> Creat xx Classes),这个时候Xcode会自动为你创建好两个类,分别是:

然后你开心打开文件后,发现,一片红色...

一片血红

然后你开始如下步骤来回循环:

  1. command + K
  2. command + B
  3. 蒙逼一小会儿
  4. 继续步骤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的时候经常会遇到这样的问题:在extensionoverride父类的方法,没有报错,但是不执行...
这个问题不是代码的问题,也不是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之后常规的思路是把viewbackgroundColor修改为clearColor,然后上面在放一个VisualEffectView,然而事实上幺蛾子总会让我们措手不及,modal出来以后,下面viewbackgroundColor会变,在完全modal出来以后就自动变成白色了(如果你没有设置windowbackgroundColor,那么就是黑色)...

请看幺蛾子(总有一些坑想害朕😤)

总有一些幺蛾子

在遍寻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!

上一篇 下一篇

猜你喜欢

热点阅读