####关东升老师所著的《iOS开发指南》第4版代码。
- 本书采用OC&Swift双语言对照。
- Swift 2.x以上。
- Xcode 7以上。
- iOS 9.3以上。
图书服务网站:http://www.51work6.com
1 开篇综述
2 第一个iOS应用程序
2.1 创建HelloWorld工程
2.1.1 创建工程
2.1.2 Xcode中的iOS工程模板
2.2 应用生命周期
2.2.1 非运行状态——应用启动场景
2.2.2 点击Home键——应用退出场景
2.2.3 挂起重新运行场景
2.2.4 内存清除——应用终止场景
2.3 设置产品属性
2.3.1 Xcode中的PROJECT和TARGET
2.3.2 设置常用的产品属性
2.4 iOS API简介
2.4.1 API概述
2.4.2 如何使用API帮助
3 Cocoa Touch框架与构建应用界面
3.1 视图控制器
3.1.1 视图控制器的种类
3.1.2 视图生命周期
3.2 视图
3.2.1 UIView层次结构
3.2.2 视图分类
3.2.3 应用界面构建层次
3.3 使用故事板构建界面
3.3.1 什么是故事板?
3.3.2 场景(Scene)和过渡(Segue)
3.4 使用Xib文件构建界面
3.4.1 重构HelloWorld
3.4.2 Xib与故事板比较
3.5 使用纯代码构建界面
3.5.1 重构HelloWorld
3.5.2 视图几个重要属性
3.6 三种构建界面技术讨论
3.6.1 所见即所得
3.6.2 原型驱动开发
3.6.3 团队协同开发
4 UIView与视图
4.1 标签与按钮
4.1.1 标签控件
4.1.2 按钮控件
4.2 事件处理
4.2.1 定义动作
4.3 访问视图
4.3.1 输出口
4.4 TextField和TextView
4.4.1 TextField控件
4.4.2 TextView控件
4.4.3 键盘的打开和关闭
4.4.4 关闭和打开键盘的通知
4.4.5 键盘的种类
4.5 开关控件、滑块控件和分段控件
4.5.1 开关控件
4.5.2 滑块控件
4.5.3 分段控件
4.6 网页视图WebView
4.6.1 UIWebView类
4.6.2 WKWebView类
4.7 等待相关的控件与进度条
4.7.1 活动指示器ActivityIndicatorView
4.7.2 进度条ProgressView
4.8 警告框和操作表
4.8.1 警告框
4.8.2 操作表ActionSheet
4.8.3 使用iOS 8 UIAlertController实现
4.9 工具栏和导航栏
4.9.1 工具栏
4.9.2 导航栏
5 委托协议、数据源协议与高级视图
5.1 视图中的委托协议和数据源协议
5.2 选择器
5.2.1 日期选择器
5.2.2 普通选择器
5.2.3 数据源协议与委托协议
5.3 集合视图
5.4 实例:Interface Builder实现奥运会比赛项目
5.4.1 添加集合视图
5.4.2 添加集合视图单元格
5.4.3 数据源协议与委托协议
5.5 实例:代码实现奥运会比赛项目
5.5.1 添加集合视图
5.5.2 自定义集合视图单元格
6 表视图
6.1 概述
6.1.1 表视图的组成
6.1.2 表视图的相关类
6.1.3 表视图分类
6.1.4 单元格的组成和样式
6.1.5 数据源协议与委托协议
6.2 简单表视图
6.2.1 创建简单表视图
6.2.2 自定义单元格
6.2.3 添加搜索栏
6.3 分节表视图
6.3.1 添加索引
6.3.2 分组
6.4 静态表与控制界面布局
6.5 修改单元格
6.5.1 删除和插入单元格
6.5.2 移动单元格
6.6 表视图UI设计模式
6.6.1 分页模式
6.6.2 下拉刷新模式
6.6.3 下拉刷新控件
7 界面布局与屏幕适配
7.1 界面布局概述
7.2 iOS界面布局设计模式
7.2.1 表单布局模式
7.2.2 列表布局模式
7.2.3 网格布局模式
7.3 网格布局模式
7.4 Auto Layout布局
7.4.1 在Interface Builder中管理Auto Layout约束
7.4.2 实例:Auto Layout布局
7.5 iOS 9 堆栈视图StackView
7.5.1 堆栈视图与布局
7.5.2 实例:堆栈视图布局
7.6 iOS屏幕的多样性
7.6.1 iOS屏幕介绍
7.6.2 iOS的三种分辨率
7.6.3 获得iOS设备屏幕信息
7.7 Size Class与iOS 8多屏幕适配
7.7.1 在Interface Builder中使用Size Class
7.7.2 Size Class的九宫格
7.7.3 实例:使用Size Class
7.8 资源目录(Asset catalog)与图片资源适配
8 视图控制器与导航模式
8.1 概述
8.1.1 视图控制器的种类
8.1.2 导航模式
8.2 模态视图
8.2.1 Interface Builder实现
8.2.2 代码实现
8.3 平铺导航
8.3.1 应用场景
8.3.2 基于分屏导航的实现
8.3.3 基于电子书导航的实现
8.4 标签导航
8.4.1 应用场景
8.4.2 Interface Builder实现
8.4.3 代码实现
8.5 树形结构导航(面包屑导航)
8.5.1 应用场景
8.5.2 Interface Builder实现
8.5.3 代码实现
8.6 组合使用导航
8.6.1 应用场景
8.6.2 Interface Builder实现
8.6.3 代码实现
9 iPad应用开发
9.1 iPhone与iPad应用开发的差异
9.1.1 应用场景不同
9.1.2 导航模式不同
9.1.3 API不同
9.2 iPad树形结构导航
9.2.1 邮件应用中的树形结构导航
9.2.2 Master-Detail应用程序模板
9.2.3 Interface Builder实现SplitViewSample案例
9.2.4 代码实现SplitViewSample案例
9.3 iPad模态视图
9.3.1 邮件应用中的模态导航
9.3.2 iPad模态导航相关API
9.3.3 Interface Builder实现ModalViewSample案例
9.3.4 代码实现ModalViewSample案例
9.4 Popover(浮动层)视图
9.4.1 Popover相关API
9.4.2 PopoverViewSample案例
9.5 iOS 9分屏多任务
9.5.1 Slide Over多任务
9.5.2 分屏视图多任务
9.5.3 画中画多任务
9.6 iPad分屏多任务适配开发
9.6.1 分屏多任务前提条件
9.6.2 分屏多任务适配
10 iOS常用设计模式
10.1 单例模式
10.1.1 问题提出
10.1.2 Objective-C实现原理
10.1.3 Swift实现原理
10.1.4 应用案例
10.2 委托模式
10.2.1 问题提出
10.2.2 实现原理
10.2.3 应用案例
10.3 委托模式
10.3.1 问题提出
10.3.2 实现原理
10.3.3 通知机制和KVO机制
10.4 再谈MVC模式
10.4.1 MVC模式概述
10.4.2 Cocoa Touch中的MVC模式
11 iOS分层架构设计
11.1 低耦合企业级系统架构设计
11.2 iOS分层架构设计
11.3 实例:MyNotes应用
11.4 基于同一工程的分层
11.4.1 采用纯Swift语言实现——PSSS模式
11.4.2 采用纯Objective-C语言实现——POOO模式
11.4.3 采用Swift与Objective-C混合搭配实现——PSOO模式
11.5 基于同一工作空间静态链接库实现的WLSOO模式
11.5.1 使用工作空间
11.5.2 添加数据持久层工程
11.5.3 建立业务逻辑层与数据持久层的依赖关系
11.5.4 建立表示层与业务逻辑层的依赖关系
11.6 基于同一工作空间框架实现的WFSSS模式
11.6.1 设置Public头文件
11.6.2 建立表示层与业务逻辑层的依赖关系
11.6.3 代码重构
11.7 基于同一工作空间框架实现的WFOOO模式
11.7.1 设置Public头文件
11.7.2 设置保护伞头文件
11.7.3 代码重构
11.8 基于同一工作空间框架实现的WFSOO模式
11.8.1 设置Public头文件
11.8.2 设置保护伞头文件
11.8.3 建立表示层与业务逻辑层的依赖关系
11.8.4 代码重构
11.9 基于同一工作空间框架实现的WFOSS模式
11.9.1 设置Public头文件
11.9.2 设置Swift代码嵌入应用
11.9.3 代码重构
11.10 基于同一个工程不同目标框架实现的TFSOO模式
11.10.1 使用目标
11.10.2 添加框架目标
12 数据持久化
12.1 概述
12.1.1 沙箱目录
12.1.2 持久化方式
12.2 属性列表
12.3 对象归档
12.4 使用SQLite数据库
12.4.1 SQLite数据类型
12.4.2 创建数据库
12.4.3 查询数据
12.4.4 修改数据
12.5 Core Data
12.5.1 ORM
12.5.2 Core Data堆栈
12.5.3 建模和生成实体
12.5.4 采用Core Data分层架构设计
12.5.5 查询数据
12.5.6 修改数据
13 应用程序设置
13.1 概述
13.1.1 设置
13.1.2 配置
13.2 应用程序设置包
13.3 设置项目种类
13.3.1 文本字段
13.3.2 开关
13.3.3 滑块
13.3.4 值列表
13.3.5 子界面
13.4 读取设置
14 本地化
14.1 概述
14.1.1 需要本地化的内容
14.1.2 本地化目录结构
14.2 文本信息本地化
14.2.1 系统按钮和信息本地化
14.2.2 应用名称本地化
14.2.3 程序代码输出的静态文本本地化
14.2.4 使用genstring工具
14.3 xib和故事板文件本地化
14.3.1 使用Base本地化技术
14.3.2 Auto Layout与本地化
14.4 资源文件本地化
14.4.1 图片资源文件本地化
14.4.2 声音资源文件本地化
15 iOS 9中访问通讯录
15.1 通讯录的安全访问设置
15.2 使用Contacts框架读取联系人信息
15.2.1 查询联系人记录
15.2.2 读取单值属性
15.2.3 读取多值属性
15.2.4 读取图片属性
15.3 使用Contacts框架写入联系人信息
15.3.1 创建联系人
15.3.2 修改联系人
15.3.3 删除联系人
15.4 使用系统提供界面
15.4.1 选择联系人
15.4.2 显示和修改联系人
15.4.3 创建联系人
16 数据交换格式
16.1 XML数据交换格式
16.1.1 解析XML文档
16.1.2 XML文档结构
16.2 实例:MyNotes应用XML
16.2.1 使用NSXML解析
16.2.2 使用TBXML解析
16.3 JSON数据交换格式
16.3.1 JSON文档结构
16.3.2 JSON数据解码
16.4 实例:MyNotes应用JSON解码
17 REST风格Web Service
17.1 概述
17.1.1 HTTP和HTTPS协议
17.2 使用NSURLSession
17.2.1 NSURLSession API
17.2.2 简单会话实现GET请求
17.2.3 默认会话实现GET请求
17.2.4 实现POST请求
17.2.5 下载数据
17.3 实例:使用NSURLSession重构MyNotes案例
17.3.1 插入方法调用
17.3.2 修改方法调用
17.3.3 删除方法调用
17.4 使用AFNetworking框架
17.4.1 ASIHTTPRequest、AFNetworking和MKNetworkKit比较
17.4.2 安装和配置AFNetworking框架
17.4.3 实现GET请求
17.4.4 实现POST请求
17.4.5 下载数据
17.4.6 上传数据
17.5 使用为Swift设计的网络框架——Alamofire
17.5.1 安装和配置Alamofire框架
17.5.2 上传数据
17.5.3 下载数据
17.5.4 实现POST请求
17.5.5 实现GET请求
17.6 反馈网络信息改善用户体验
17.6.1 使用下拉刷新控件改善用户体验
17.6.2 使用活动指示器控件
17.6.3 使用网络活动指示器
18 定位服务
18.1 定位服务概述
18.1.1 定位服务编程
18.1.2 测试定位服务
18.2 管理定位服务
18.2.1 应用启动与停止下的定位服务管理
18.2.2 视图转换时的定位服务管理
18.2.3 应用前后台切换时的定位服务管理
18.2.4 设置自动暂停位置服务
18.2.5 iOS 9后台位置服务管理
18.3 地理信息反编码
18.3.1 地理信息编码与反编码
18.3.2 实例:地理信息反编码
18.3.3 地理信息编码查询
18.3.4 实例:地理信息编码查询
18.4 微定位技术iBeacon
18.4.1 微定位与地理围栏
18.4.2 iBeacon技术概述
18.4.3 实例:iBeacon技术实现微定位
19 苹果地图应用
19.1 使用iOS苹果地图
19.1.1 显示地图
19.1.2 3D地图
19.2 添加标注
19.2.1 实现查询
19.2.2 在地图上添加标注
19.3 跟踪用户位置变化
19.4 使用程序外地图
20 找出程序中的bug——调试
20.1 Xcode调试工具
20.1.1 定位编译错误
20.1.2 查看和显示日志
20.1.3 设置和查看断点
20.1.4 调试工具
20.1.5 输出窗口
20.1.6 变量查看窗口
20.1.7 查看线程
20.2 日志与断言输出
20.2.1 使用NSLog函数
20.2.2 使用断言
20.3 异常堆栈报告分析
20.3.1 跟踪异常堆栈
20.3.2 分析堆栈报告
20.4 在iOS设备上调试
20.4.1 创建开发者证书
20.4.2 设备注册
20.4.3 创建App ID
20.4.4 创建配置概要文件
20.4.5 设备调试
20.5 Xcode设备管理工具
20.5.1 查看设备上的应用程序
20.5.2 设备日志
21 iOS测试驱动与单元测试
21.1 测试驱动的软件开发概述
21.1.1 测试驱动的软件开发流程
21.1.2 测试驱动的软件开发案例
21.1.3 iOS单元测试框架
21.2 使用XCTest测试框架
21.2.1 添加XCTest到工程
21.2.2 编写XCTest测试方法
21.2.3 运行测试程序
21.2.4 分析测试报告
21.3 异步单元测试
21.4 性能测试
21.4.1 配置测试环境
21.4.2 测试代码
21.4.3 分析测试结果
21.5 iOS单元测试最佳实践
21.5.1 测试数据持久层
21.5.2 测试业务逻辑层
21.5.3 测试表示层
22 iOS应用UI 测试
22.1 UI测试概述
22.2 添加UI测试到工程
22.2.1 创建工程时添加UI测试框架
22.2.2 在现有工程中添加UI测试用例目标
22.3 录制脚本
22.3.1 录制之前的准备
22.3.2 录制过程
22.3.3 修改录制脚本
22.4 访问UI元素
22.4.1 UI元素层次树
22.4.2 UI测试中相关API
22.5 表示层测试最佳实践
22.5.1 配置UI测试用例目标
22.5.2 设置辅助功能
22.5.3 编写UI测试用例
23 让你的程序“飞”起来——性能优化
23.1 内存优化
23.1.1 内存管理
23.1.2 使用Analyze和Instruments工具解决内存泄漏问题
23.1.3 查找和解决僵尸对象
23.1.4 autorelease的使用问题
23.1.5 响应内存警告
23.2 优化资源文件
23.2.1 图片文件优化
23.2.2 音频文件优化
23.3 延迟加载
23.3.1 资源文件的延迟加载
23.3.2 故事板文件的延迟加载
23.3.3 xib文件的延迟加载
23.4 数据持久化的优化
23.4.1 使用文件
23.4.2 使用SQLite数据库
23.4.3 使用Core Data
23.5 可重用对象的使用
23.5.1 表视图中的可重用对象
23.5.2 集合视图中的可重用对象
23.5.3 地图视图中的可重用对象
23.6 并发处理与多核CPU
23.6.1 主线程阻塞问题
23.6.2 选择NSThread还是GCD
24 管理好你的程序代码——代码版本管理
24.1 概述
24.1.1 版本控制历史
24.1.2 基本概念
24.2 Git代码版本控制
24.2.1 服务器搭建
24.2.2 Gitolite服务器管理
24.2.3 Git常用命令
24.2.4 Git分支
24.2.5 Git协同开发
24.2.6 Xcode中Git的配置与使用
24.3 GitHub代码托管服务
24.3.1 创建和配置GitHub账号
24.3.2 创建代码库
24.3.3 删除代码库
24.3.4 派生代码库
24.3.5 使用GitHub协同开发
24.3.6 管理组织
24.4 CocoaPods与Git管理
25 项目依赖管理
25.1 使用CocoaPods工具管理依赖
25.1.1 安装CocoaPods
25.1.2 搜索库
25.1.3 项目与第三方库搭配形式
25.1.4 示例:静态链接库形式管理依赖
25.1.5 示例:框架形式管理依赖
25.2 使用Carthage工具管理依赖
25.2.1 安装Carthage
25.2.2 项目与第三方库搭配形式
25.2.3 使用Carthage工具管理依赖
25.2.4 Cartfile文件
25.2.5 示例:重构MyNotes依赖关系
26 重构MyNotes应用——iOS网络通信中的设计模式与架构设计
26.1 移动网络通信应用的分层架构设计
26.2 Objective-C版本:在工作空间中添加和配置MKNetworkKit
26.3 基于委托模式实现
26.3.1 网络通信与委托模式
26.3.2 在异步网络通信中使用委托模式实现分层架构设计
26.3.3 类图
26.3.4 时序图
26.3.5 数据持久层重构
26.3.6 业务逻辑层的代码实现
26.3.7 表示层的代码实现
26.4 基于观察者模式的通知机制实现
26.4.1 观察者模式的通知机制回顾
26.4.2 异步网络通信中通知机制的分层架构设计
26.4.3 类图
26.4.4 时序图
26.4.5 数据持久层的重构
26.4.6 业务逻辑层的代码实现
26.4.7 表示层的代码实现
27 把你的应用放到App Store
27.1 收官
27.1.1 在Xcode 6中添加图标
27.1.2 在Xcode 6中添加启动界面
27.1.3 调整Identity和Deployment Info属性
27.1.4 为发布进行编译
27.2 发布流程
27.2.1 创建应用
27.2.2 基本信息输入
27.2.3 应用定价
27.2.4 上传应用
27.2.5 提交审核
27.3 常见审核不通过的原因
27.3.1 功能问题
27.3.2 用户界面问题
27.3.3 商业问题
27.3.4 不当内容
27.3.5 其他问题
28 iOS敏捷开发项目实战——2016里约热内卢奥运会应用开发及App Store发布
28.1 应用分析与设计
28.1.1 应用概述
28.1.2 需求分析
28.1.3 原型设计
28.1.4 数据库设计
28.1.5 架构设计
28.2 iOS敏捷开发
28.2.1 敏捷开发宣言
28.2.2 iOS适合敏捷开发?
28.2.3 iOS敏捷开发最佳实践
28.3 任务1:创建应用工作空间和工程
28.3.1 迭代1.1:创建Swift版本的工程
28.3.2 迭代1.2:创建Objective-C版本
28.3.3 工作空间
28.3.4 迭代1.3:发布到GitHub
28.4 任务2:信息系统层与持久层开发
28.4.1 迭代2.1:编写数据库DDL脚本
28.4.2 迭代2.2:插入初始数据到
28.4.3 数据库
28.4.4 迭代2.3:编写实体类
28.4.5 迭代2.4:DAO类XCTest单元
28.4.6 测试
28.4.7 迭代2.5:数据库帮助类
28.4.8 DBHelper
28.4.9 迭代2.5:编写DAO类
28.4.10 迭代2.6:发布到GitHub
28.5 任务3:业务逻辑层开发
28.5.1 任务3:业务逻辑层开发
28.5.2 迭代3.1:对比赛项目业务逻辑
28.5.3 类进行XCTest单元测试
28.5.4 迭代3.2:编写比赛项目业务
28.5.5 逻辑类
28.5.6 迭代3.3:对比赛日程业务逻辑
28.5.7 类进行XCTest单元测试
28.5.8 迭代3.4:编写比赛日程业务
28.5.9 逻辑类
28.5.10 迭代3.5:发布到GitHub
28.6 任务4:表示层开发
28.6.1 迭代4.1:使用资源目录管理
28.6.2 图片和图标资源
28.6.3 迭代4.2:根据原型设计初步
28.6.4 设计iPad故事板
28.6.5 迭代4.3:根据原型设计初步
28.6.6 设计iPhone故事板
28.6.7 迭代4.4:首页模块
28.6.8 迭代4.5:比赛项目模块
28.6.9 迭代4.6:比赛日程模块
28.6.10 迭代4.7:倒计时模块表示层
28.6.11 迭代4.8:关于我们模块表示层
28.6.12 迭代4.9:发布到GitHub
28.7 任务5:收工
28.7.1 迭代5.1:添加图标
28.7.2 迭代5.2:设计和添加启动界面
28.7.3 迭代5.4:性能测试与改善
28.7.4 迭代5.5:发布到GitHub上
28.7.5 迭代5.6:在App Store上发布应用