开发技巧01 创建仅执行次的代码片段
1 | /// 代码定义 |
开发技巧02 xcrun: error: unable to find utility “xctest”
在使用 Vapor
作为服务端框架式,在执行 swift package update
时,有时会收到如下错误:
1 | /usr/bin/xcrun --sdk macosx --find xctest output: |
解决办法,在终端中执行如下命令皆可解决:
1 | sudo xcode-select -s /Applications/Xcode.app/Contents/Developer |
开发技巧03 调整导航栏item边距办法
iOS 11之后的版本在实际的工程实践中会出现调整导航栏左右按钮距离左右边框的间距,总是会出现距离左右边距 8px
,具体形成这种结果的原因可以使用一些辅助工具查看一下导航的图层,但是操作图层又过于繁琐。下面给出一个简单的实现:
控件布局是可以超出父控件距离的,也就是说,可以使用一个
UIView
包裹真正用于显示的View
,然后将子View
的x
设置偏移也就可以解决了。
实现代码示例,具体的实现看各自工程实践经验( extension
, NavigationItem
, NavigationBar
):
1 | import UIKit |
开发技巧04 UIGestureRecognizer 视图添加手势之后,指定子视图响应事件
例如:只希望添加手势的视图响应事件,其他子视图均不响应事件
1 | /// add UITapGestureRecognizer |
开发技巧05 pod install 安装失败部分库提示:443
例如:在安装过程中,会出现部分三方库提示:443
在Podfile
中增加或删除某个pod
后, 也是使用这个命令. 而不是pod update
.
每次运行pod install
命令, 下载并安装新的pod
时, 它会为Podfile.lock
文件中的每个pod
写入已安装的版本. 此文件跟踪每个pod
的已安装版本并锁定这些版本(.lock
命名因此而来).
当运行pod install
,它只解析Podfile.lock
中尚未列在其中的pod
的依赖库.
对于已经在Podfile.lock
中列出的pod
, Podfile.lock
不会尝试检查是否有更新的版本.
对于尚未在Podfile.lock
中列出的pod
, 会搜索与Podfile
(如中所述pod 'MyPod', '~>1.2'
)匹配的版本或最新的版本.
注: 第一次运行
pod install
的时候,.xcworkspace
项目和Pods
目录还不存在,pod install
命令也会创建.xcworkspace
和Pods
目录, 但这是pod instal
l 命令的顺带作用,而不是它的主要作用.
建议使用如下命令安装:
1 | pod install --verbose --no-repo-update |
开发技巧06 Swiftgen 创建图片管理
Swiftgen安装方式和官网给出的使用方法。
根据个人习惯和工程经验,推荐下面方式来使用 Swiftgen
。
通过
Homebrew
安装Swiftgen
:1
2$ brew update
$ brew install swiftgen创建 配置文件
现在项目中与图片资源文件夹同级目录下创建一个
swiftgen.yml
(或者使用命令:swiftgen config init
)。格式如下:1
2
3
4
5
6
7
8
9
10
11
12
13strings:
inputs: Resources/Base.lproj
outputs:
- templateName: structured-swift5
output: Generated/Strings.swift
xcassets:
inputs:
- Resources/Images.xcassets
- Resources/MoreImages.xcassets
- Resources/Colors.xcassets
outputs:
- templateName: swift5
output: Generated/Assets.swift也可以简化配置文件如下:
1
2
3
4
5xcassets:
inputs: Assets.xcassets
outputs:
templateName: swift5
output: Generated/Images.swift在终端执行如下命令完成对资源的初始化:
1
swiftgen config lint
或者是在项目
Yaml
配置文件所在位置添加执行脚本文件generate_images.sh
:1
swiftgen config lint
执行脚本文件之后如果出现如下提示信息,那么限制性最下方语句生成文件夹和文件:
提示信息 1
2
3
4
5Linting swiftgen.yml
> Common parent directory used for all input paths: <none>
> Common parent directory used for all output paths: <none>
> 1 entry for command xcassets:
$ swiftgen xcassets --templateName swift5 --output Generated/Images.swift Assets.xcassets执行完提示命令之后会出现如下提示:
1
2
3$ swiftgen xcassets --templateName swift5 --output Generated/Images.swift Assets.xcassets
> swiftgen: warning: This command is deprecated in favor of `swiftgen run xcassets`
File written: Generated/Images.swift即表示创建成功,可以使用直接使用了,在项目中使用该资源的案例如下:
1
Asset.texting.image 语法格式如下:Asset.(Assets.xcassets 中图片名称).image
如此便完成的
Swiftgen
整体设置。
开发技巧07 App 锁屏、解锁监听
官网提供了两个事件分别用于监听锁屏和解锁。
1 | /// screen locked |
开发技巧08 could not execute support code to read Objective-C class data in the process.
在开发过程中很少出现此类错误,但是也会偶尔出现如下问题:warning: could not load any Objective-C class information. This will significantly reduce the quality of type information available.
原因分析:一般是 死循环 引起此类问题,遇到此类问题记得排查方法调用上是否引起了循环调用。
懒加载的时候: 一定不要用self., 若用 self. 会造成死循环。
开发技巧09 极光推送设置别名,退出登录设置别名依然会收到推送信息
在使用别名的推送设置中,我们会使用一下用户个人信息中的一个唯一标识来设置该用户的在极光推送系统的中的唯一标识,下面代码是设置用户别名:
1 | /// 设置推送别名 |
遇到的问题:在用户退出登录,我们期望退出登录的用户设别不需要收到该别名的推送。
而事实上极光 API 设置别名的规则是:这个接口是覆盖逻辑,而不是增量逻辑。即新的调用会覆盖之前的设置。 所以我们设置为空字符串并不能清除该设备在极光系统里的标识。
解决办法:我们需要设置一个在本业务系统中永远不会推送到的字符串作为别名来覆盖这个设备在激极光系统里的标识。
1 | /// 设置推送别名 设置一个永远不会推送到别名 |
开发技巧10 真机调试包在Xcode中的地址
Xcode
真机调试包在系统中的地址:
1 |
|
开发技巧12 修改 UITextField 占位符的颜色和字体
1 | textfield.attributedPlaceholder = NSAttributedString.init(string:"搜索款号", attributes: [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 14), .foregroundColor: UIColor(hexColor: "A7B4CC")]) |