第1章 准备工作 1
1.1 Mac电脑 1
1.2 Xcode使用介绍 1
1.2.1 Xcode工作区 2
1.2.2 xib界面设计相关的工作区和菜单 3
1.3 工程结构 5
1.3.1 使用xib方式创建的工程 5
1.3.2 使用storyboard方式创建的工程 11
第2章 窗口对象 13
2.1 窗口界面的组成 14
2.2 模态窗口 16
2.2.1 模态窗口 16
2.2.2 模态会话窗口 16
2.3 编程控制窗口 17
2.3.1 创建窗口对象 17
2.3.2 窗口通知 18
2.3.3 NSWindow的contentView 18
2.3.4 设置窗口的image和titl 19
2.3.5 设置窗口的背景颜色 19
2.3.6 关闭窗口时终止应用 19
2.3.7 在窗口标题区域增加视图 20
2.3.8 NSWindow如何正确地保证居中显示 21
2.3.9 窗口显示位置控制 21
2.3.10 应用关闭后点击Dock菜单再次打开应用 21
2.4 窗口的创建和管理 21
第3章 视图和滚动条 23
3.1 基本视图 23
3.1.1 坐标系统 23
3.1.2 frame和bounds 24
3.1.3 坐标转换 25
3.1.4 视图管理 25
3.1.5 视图查找 25
3.1.6 视图的autoSize控制 25
3.1.7 视图的layer属性 27
3.1.8 视图绘制 27
3.1.9 事件响应 28
3.1.10 视图的frame/bounds变化通知 28
3.2 增效视图 29
3.3 滚动条视图 31
3.3.1 滚动条视图工作原理 31
3.3.2 用代码创建滚动条视图 32
3.3.3 滚动到指定的位置 32
3.3.4 用代码实现文本视图滚动的示例 33
3.3.5 滚动条的显示控制 34
第4章 基本控件 35
4.1 控件的分类 35
4.2 控件家族类图谱 35
4.2.1 NSResponder 37
4.2.2 NSView 38
4.2.3 NSControl 38
4.2.4 NSCell 38
4.2.5 小结 39
4.3 文本框 39
4.3.1 UI属性说明 40
4.3.2 事件响应 40
4.3.3 文本内容的读取或修改 41
4.3.4 特殊按键响应处理 41
4.4 文本视图 42
4.4.1 UI属性说明 42
4.4.2 事件响应 43
4.4.3 文本的格式化显示 43
4.4.4 文本框高度根据文字高度自适应增长 44
4.5 文本搜索框 44
4.6 文本标签 46
4.6.1 UI属性说明 46
4.6.2 用代码创建文本标签 46
4.7 按钮 48
4.7.1 UI属性说明 48
4.7.2 事件响应 48
4.7.3 连接事件 49
4.7.4 用代码创建按钮 49
4.7.5 图片按钮的创建 49
4.8 复选框 50
4.8.1 UI属性说明 51
4.8.2 事件响应 51
4.9 单选按钮 51
4.9.1 UI属性说明 51
4.9.2 事件响应 52
4.10 分段选择控件 52
4.10.1 UI属性说明 53
4.10.2 事件响应 53
4.10.3 分段大小的控制 53
4.10.4 分段样式风格的控制 53
4.11 组合框 54
4.11.1 UI属性说明 54
4.11.2 事件响应 55
4.11.3 动态增加列表内容 55
4.11.4 使用数据源和代理 55
4.12 弹出式按钮 56
4.12.1 UI属性说明 56
4.12.2 动态列表项配置 56
4.12.3 事件响应 57
4.13 滑杆 57
4.13.1 属性设置 57
4.13.2 水平和垂直方向设置 57
4.13.3 事件绑定 58
4.14 日期选择器 58
4.14.1 UI属性说明 58
4.14.2 获取日期 59
4.14.3 日期变化的事件 59
4.15 步进器 59
4.15.1 UI属性说明 60
4.15.2 事件响应 60
4.15.3 文本框数据与步进器保持同步 60
4.16 进度指示器 60
4.16.1 UI属性说明 61
4.16.2 启动指示器动画 61
4.16.3 更新指示器进度 61
4.16.4 停止指示器动画 61
4.16.5 用代码创建进度指示器 62
4.17 图像视图 62
4.17.1 UI属性说明 62
4.17.2 圆角处理 62
4.18 分组框 63
4.18.1 UI属性说明 63
4.18.2 用代码创建分组框 63
4.19 分栏视图 64
4.19.1 重要属性和方法说明 64
4.19.2 用代码创建分栏视图 65
4.19.3 自定义分栏视图样式风格 65
4.19.4 分栏视图中的子视图控制 66
4.19.5 分栏视图子视图的隐藏和显示 68
4.20 集合视图 68
4.20.1 集合视图的content 69
4.20.2 NSCollectionViewItem 69
4.20.3 绑定模型到视图 70
4.20.4 使用数据源方式管理集合视图 71
4.20.5 实现集合视图的高亮选择 73
4.20.6 集合视图的背景设置 75
4.20.7 集合视图的布局管理器 75
4.20.8 设置集合视图的顶部头和底部尾 77
4.20.9 用代码创建集合视图 79
4.21 选项卡视图 79
4.21.1 UI属性说明 80
4.21.2 代理协议NSTabViewDelegate 80
4.21.3 动态增加选项卡 80
4.21.4 用无边风格的选项卡进行切换控制 81
4.22 弹出式气泡 82
4.22.1 重要属性 82
4.22.2 使用示例 83
第5章 面板和警告框 84
5.1 面板 84
5.1.1 UI属性说明 85
5.1.2 显示面板 85
5.1.3 隐藏面板 86
5.1.4 文件打开面板 86
5.1.5 文件保存面板 88
5.1.6 颜色选择面板 88
5.1.7 字体选择面板 89
5.2 警告框 89
5.2.1 UI属性说明 89
5.2.2 添加按钮 90
5.2.3 使用示例 90
5.3 使用独立的xib文件创建面板类 91
第6章 工具栏和菜单 94
6.1 工具栏 94
6.1.1 创建工具栏 94
6.1.2 UI属性说明 95
6.1.3 NSToolbarItem的属性说明 96
6.1.4 事件响应 96
6.1.5 创建非标准的工具栏项 97
6.1.6 验证工具栏项 97
6.1.7 用代码创建工具栏 98
6.1.8 工具栏与窗口控制按钮融合显示 99
6.2 菜单 99
6.2.1 UI属性说明 100
6.2.2 增加菜单 101
6.2.3 弹出式菜单 101
6.2.4 设置上下文菜单 102
6.2.5 Dock菜单 102
6.2.6 用代码创建菜单 103
6.2.7 获取应用默认的菜单 104
6.2.8 菜单有效性验证 104
6.3 状态条 105
6.3.1 NSStatusBar类的对象关系 105
6.3.2 NSStatusBar的使用方式 105
6.3.3 状态条增加弹出视图 107
第7章 表视图 109
7.1 表视图 109
7.1.1 使用xib创建表格 109
7.1.2 表格样式设置 112
7.1.3 表格数据显示配置 112
7.1.4 表格事件 119
7.1.5 创建表格上下文菜单 120
7.1.6 数据排序 120
7.1.7 数据拖放 121
7.1.8 表格数据获取 121
7.1.9 编辑表格内容 121
7.1.10 动态增加/删除表格行 122
7.1.11 用代码创建表格 123
7.1.12 代码控制选中行 125
7.1.13 表格行选中颜色定制 126
7.2 大纲视图控件 126
7.2.1 节点模型定义 127
7.2.2 初始化模型数据 128
7.2.3 实现数据源协议 128
7.2.4 实现代理方法,绑定数据到节点视图 129
7.2.5 节点选择的变化事件通知 129
7.2.6 动态增加节点 130
7.2.7 动态删除节点 130
7.2.8 代码控制行的展开和选中 131
7.2.9 修改节点展开关闭的默认图标 132
7.2.10 鼠标右键上下文菜单 133
第8章 自动布局 134
8.1 自动布局的原理 134
8.1.1 传统的布局 134
8.1.2 自动布局 135
8.2 栈视图 137
8.3 Xcode中的自动布局设置 138
8.3.1 Stack 139
8.3.2 Align 140
8.3.3 Pin 140
8.3.4 Resolve 141
8.4 自动布局的多种解决方案 141
8.4.1 一个问题的多种解决方案 142
8.4.2 约束选择的原则和建议 144
8.5 自动布局使用示例 144
8.5.1 两个视图大小相同 144
8.5.2 3个View大小相同 145
8.5.3 文本标签和输入框 145
8.5.4 文本标签动态字体和输入框 146
8.5.5 多行文本标签和输入框 146
8.5.6 多行文本标签动态字体和输入框 147
8.5.7 两个视图大小相同、水平方向的间距相同 148
8.5.8 简单的Stack View 149
8.5.9 复杂界面未使用栈视图 150
8.5.10 复杂界面使用多个嵌套栈视图 151
8.6 滚动条视图使用自动布局 151
8.7 通过代码设置自动布局约束 153
8.7.1 使用NSLayoutConstraint类 153
8.7.2 使用NSLayoutAnchor 155
8.7.3 使用VFL定义约束关系 155
8.7.4 使用第三方库AutoLayoutX 155
第9章 窗口控制器 157
9.1 xib中窗口的加载创建过程 157
9.2 手工创建窗口需要注意的问题 160
9.3 窗口控制器和窗口的关系 161
9.4 将AppDelegate中窗口的管理功能分离 161
9.5 窗口切换后对象失去焦点问题 163
第10章 视图控制器 164
10.1 视图控制器 164
10.1.1 视图生命周期过程 165
10.1.2 创建视图控制器的3种方式 166
10.1.3 representedObject属性 167
10.1.4 子视图控制器管理 168
10.1.5 两个视图控制器之间的切换方法 169
10.1.6 Storyboard中的视图控制 172
10.1.7 视图中手势识别 174
10.2 选项卡控制器 175
10.2.1 使用NSTabView创建选项卡视图 175
10.2.2 使用NSTabViewController管理选项卡视图 176
10.2.3 使用Storyboard方式创建 176
10.2.4 选项卡选中事件 177
10.3 分栏视图控制器 178
10.3.1 控制器的几个重要的属性和方法 178
10.3.2 NSSplitViewItem 179
10.3.3 NSSplitView 179
10.3.4 使用Storyboard创建分栏视图控制器 179
10.3.5 用代码创建分栏视图控制器 180
10.3.6 可折叠的视图控制 181
10.4 视图控制器与窗口控制器的关系 183
10.4.1 视图与窗口 183
10.4.2 视图控制器与窗口控制器 183
10.4.3 不依赖xib和storyboard,纯代码实现应用 184
10.5 使用窗口控制器和视图控制器实现简单登录流程 186
10.5.1 登录流程的基本工程实现 186
10.5.2 代码控制启动的控制器 190
10.5.3 登录页面使用效果美化 190
10.5.4 登录页面纯代码实现 192
10.5.5 整个工程纯代码实现 195
10.6 滚动条视图高级用法 195
10.6.1 滚动条视图显示多个按钮 195
10.6.2 滚动条视图处理分页滑动 199
第11章 鼠标和键盘事件 206
11.1 事件的分发过程 206
11.2 事件中的两个核心类 207
11.2.1 NSResponder 207
11.2.2 NSEvent 207
11.3 鼠标事件 208
11.3.1 鼠标点击 208
11.3.2 鼠标拖放 209
11.3.3 鼠标区域跟踪 210
11.3.4 模拟鼠标点击选中 212
11.4 键盘事件 213
11.4.1 快捷键 213
11.4.2 控制键 214
11.5 按键绑定事件 215
11.5.1 系统绑定的按键事件 215
11.5.2 文字输入 216
11.6 事件监控 218
11.7 动作消息 218
11.8 在视图控制器中处理事件 219
第12章 撤销/重做操作 220
12.1 撤销/重做流程分析 220
12.2 实现原理 222
12.3 撤销/重做动作的管理 223
12.3.1 NSUndoManager的创建 223
12.3.2 注册撤销动作 223
12.3.3 清除撤销动作 224
12.3.4 禁止注册撤销动作 224
12.3.5 撤销动作命名 224
12.3.6 撤销组 224
12.4 撤销栈的深度 224
12.5 撤销/重做通知消息 225
12.6 撤销/重做编程示例 225
第13章 拖放操作 227
13.1 拖放开始 227
13.1.1 拖放数据定义 227
13.1.2 拖放的可视化图像设置 229
13.1.3 拖放源事件 229
13.1.4 拖放源协议NSDraggingSource 230
13.2 拖放接收 231
13.2.1 注册接收的拖放类型 231
13.2.2 拖放目标方协议 231
13.2.3 拖放接收方处理过程 231
13.3 拖放端到端编程 232
13.3.1 拖放源类DragSourceView 232
13.3.2 拖放目标类 233
13.3.3 视图控制器中拖放源初始化 235
13.4 常见的拖放示例 236
13.4.1 文件拖放处理 236
13.4.2 表格视图的拖放处理 237
13.4.3 大纲视图的数据拖放处理 239
第14章 Cocoa数据绑定 243
14.1 KVC 243
14.1.1 KVC属性读写接口 244
14.1.2 KVC路径访问相关接口 244
14.1.3 批量属性访问接口 244
14.2 KVO 245
14.2.1 KVO相关接口 245
14.2.2 手工管理KVO 246
14.2.3 KVO的简单例子 247
14.3 KVB 248
14.3.1 传统的数据更新流程 249
14.3.2 使用绑定技术简化更新流程 249
14.3.3 实现绑定依赖的关键点 252
14.3.4 KVB绑定的处理流程 253
14.3.5 使用NSArrayController管理数据 254
14.3.6 使用NSTreeController管理数据 256
第15章 蓝牙框架 261
15.1 蓝牙数据交换流程 261
15.2 蓝牙框架中的相关类 262
15.2.1 外围设备相关 263
15.2.2 数据中心相关 263
15.2.3 服务相关 263
15.2.4 特征值相关 263
15.3 外围设备的工作流程 263
15.3.1 系统初始化上电 263
15.3.2 创建服务 264
15.3.3 创建特征值 264
15.3.4 服务与特征值关联 264
15.3.5 发布服务 264
15.3.6 广播服务 265
15.3.7 数据读写请求 265
15.3.8 订阅请求处理 266
15.4 数据中心工作流程 266
15.4.1 系统初始化上电 266
15.4.2 搜索外围设备 267
15.4.3 建立连接 267
15.4.4 查询服务 267
15.4.5 查询服务特征值 267
15.4.6 服务特征读请求 268
15.4.7 服务特征值写 268
15.4.8 服务订阅 269
第16章 Bonjour协议 270
16.1 Bonjour服务命名规则 271
16.2 Bonjour协议API栈 271
16.3 Bonjour核心流程 271
16.3.1 服务发布 272
16.3.2 服务发现 272
16.3.3 地址解析 273
16.4 Bonjour编程 273
16.4.1 服务发布 273
16.4.2 服务发现 274
16.4.3 直接使用Bonjour进行数据发送 274
16.4.4 需要注意的问题 275
第17章 系统服务 276
17.1 服务处理流程 277
17.2 服务定义 277
17.3 服务提供方编程 279
17.3.1 实现服务功能接口 279
17.3.2 声明服务 280
17.3.3 注册服务 281
17.3.4 测试服务功能 281
17.4 服务使用方编程 282
17.4.1 注册数据类型 282
17.4.2 菜单有效性校验 282
17.4.3 发送数据到剪贴板 283
17.4.4 从剪贴板读取结果数据 283
第18章 XPC服务 284
18.1 XPC架构 284
18.2 XPC编程实现 285
18.2.1 XPC服务接口对象 285
18.2.2 XPC服务方编程 285
18.2.3 XPC服务请求方编程 287
18.2.4 XPC服务接口反向调用 288
第19章 消息推送 290
19.1 本地消息通知 290
19.1.1 注册本地消息通知 290
19.1.2 实现本地消息代理协议方法 291
19.1.3 取消本地通知 291
19.1.4 程序控制发送消息通知 292
19.2 远程消息通知 292
19.2.1 推送消息的处理流程 292
19.2.2 请求消息推送注册 293
19.2.3 设备 293
19.2.4 推送消息接收 293
19.2.5 提供者消息发送 294
19.2.6 消息格式 294
19.2.7 Feedback服务 295
19.2.8 消息推送环境的证书配置 295
19.2.9 推送消息的发送 296
第20章 多文档应用 298
20.1 文档应用中的关键对象 298
20.1.1 文档控制器 298
20.1.2 文档模型 299
20.1.3 文档窗口控制器 299
20.2 创建基于文档的工程 299
20.2.1 Document Types 300
20.2.2 Exported UTIs 301
20.2.3 文档编程模板工程 301
20.3 wrapper方式读取文件 303
20.3.1 创建NSFile Wrapper管理文件 304
20.3.2 从NSFileWrapper实例读取内容 304
20.3.3 支持NSFileWrapper文件的工程配置 305
20.3.4 完整的FileWrapper工程示例 305
20.4 文档处理流程 309
20.4.1 新建文档流程 309
20.4.2 打开文档流程 309
20.4.3 保存文档流程 310
20.4.4 导出文件流程 310
20.5 文档应用开发步骤 310
20.6 文档应用中的撤销/重做支持 311
20.7 文档应用管理个人档案 312
20.7.1 个人档案数据模型 312
20.7.2 文档数据以普通文件方式存储 313
20.7.3 文档数据以wrapper方式存储 316
第21章 iCloud同步 320
21.1 容器 320
21.2 iCloud数据存储 321
21.2.1 iCloud文档数据处理流程 321
21.2.2 iCloud文档本地目录 323
21.3 键值存储 324
21.3.1 键值存储接口 324
21.3.2 键值存储限制 324
21.3.3 键值存储数据变化通知 325
21.3.4 键值存储处理流程 325
21.4 iCloud开发前准备工作 325
21.5 容器数据在多个App间共享 327
21.5.1 键值存储数据的App间共享访问 327
21.5.2 文档数据的App间共享访问 328
21.6 数据冲突 328
21.6.1 键值数据冲突 328
21.6.2 文档类型数据冲突 328
第22章 CIoudKit 329
22.1 使用 Dashboard后台管理数据 330
22.2 容器共享 332
22.3 创建记录结构 333
22.4 CloudKit数据操作 334
22.4.1 保存数据 334
22.4.2 删除数据 336
22.4.3 查询数据 336
22.4.4 数据关联reference 337
22.4.5 批量查询数据操作 337
22.5 订阅数据变化通知 338
22.5.1 创建订阅 338
22.5.2 注册消息推送 338
22.6 生产环境部署 339
第23章 Core Data 340
23.1 Core Data对象栈 341
23.2 在项目中使用Core Data 341
23.2.1 数据增加 345
23.2.2 数据删除 346
23.2.3 数据修改 346
23.2.4 数据查询 346
23.3 模型间关系 347
23.3.1 一对一 347
23.3.2 一对多 348
23.3.3 多对多 348
23.4 使用Bindings绑定管理对象 350
23.5 撤销/重做操作的支持 353
23.6 版本升级迁移 354
23.6.1 轻量级迁移 354
23.6.2 基于模型映射的迁移 357
第24章 HTTP网络编程 360
24.1 简单的数据请求 361
24.1.1 使用系统默认方式创建URLSession 361
24.1.2 使用自定义的代理方法创建URLSession 362
24.1.3 创建URLSession使用POST方式传递数据 363
24.2 文件下载 364
24.2.1 创建下载任务 364
24.2.2 实现下载代理协议 364
24.3 文件上传 365
24.3.1 流式文件上传客户端代码编写 365
24.3.2 表单文件上传客户端代码编写 366
24.4 缓存 368
24.5 Cookie管理 369
24.5.1 Cookie编程 370
24.5.2 Cookie的一些使用场景 370
24.6 断点续传 371
24.7 基于URLSessionDataTask封装的网络处理工具类 372
24.7.1 网络处理工具类实现分析 372
24.7.2 HTTPClient工具类实现 373
第25章 多线程 377
25.1 GCD 377
25.1.1 分发队列 377
25.1.2 GCD多线程编程 378
25.1.3 GCD实际使用的例子 382
25.2 OperationQueue 384
25.2.1 BlockOperation 384
25.2.2 Operation 385
25.2.3 设置任务间的依赖 386
25.2.4 设置Operation执行完的回调 387
25.2.5 取消任务 387
25.2.6 暂停或恢复队列的执行 387
25.2.7 任务执行的优先级 387
25.3 Thread 388
25.3.1 线程创建方式 388
25.3.2 Thread类中的关键方法和属性 389
25.3.3 线程中的共享资源保护 390
第26章 事件循环 393
26.1 RunLoop的模式 393
26.2 RunLoop类 394
26.3 RunLoop的活动状态 395
26.4 定时器 396
26.5 RunLoop中的输入源 397
26.6 RunLoop事件处理流程 398
26.7 RunLoop使用场景 398
第27章 绘图技术 399
27.1 绘图上下文 399
27.2 坐标系统 399
27.2.1 笛卡儿坐标 399
27.2.2 屏幕坐标与本地坐标 400
27.2.3 坐标变换 400
27.3 颜色与透明度 403
27.3.1 颜色模型和颜色空间 403
27.3.2 创建颜色 403
27.3.3 在绘图上下文中使用颜色 404
27.3.4 从系统颜色面板获取颜色的方式 404
27.4 绘图状态 405
27.5 图像 406
27.5.1 图像内部缓存 406
27.5.2 图像大小 406
27.5.3 图像的坐标系统 406
27.5.4 图像绘制方法 407
27.5.5 图像创建或加载 407
27.5.6 屏幕图像的捕获 408
27.5.7 图像的格式转换 409
27.6 阴影和渐变 409
27.6.1 阴影 409
27.6.2 渐变 410
27.7 文本绘制 413
27.7.1 文本属性参数 413
27.7.2 Suing的绘制方法 413
27.8 使用路径绘图 414
27.8.1 路径的样式 415
27.8.2 点 418
27.8.3 线 418
27.8.4 多边形 418
27.8.5 矩形 418
27.8.6 圆角矩形 419
27.8.7 圆和椭圆 419
27.8.8 弧形 419
27.8.9 贝塞尔曲线 420
27.9 绘图的性能优化 420
第28章 核心动画 422
28.1 动画的产生过程 422
28.2 层 423
28.2.1 视图和层 423
28.2.2 层的坐标系统 424
28.2.3 层的时间系统 425
28.2.4 层的对象树 425
28.2.5 层级管理方法 426
28.2.6 层的内容 426
28.2.7 层的深度 427
28.2.8 层的透视投影 427
28.3 层动画 428
28.3.1 隐式动画 428
28.3.2 显式动画 429
28.4 核心动画对象 430
28.4.1 动画相关类 431
28.4.2 协议 433
28.4.3 辅助类 435
28.4.4 事务 436
28.5 动画的控制 437
28.5.1 隐式动画的产生过程 437
28.5.2 隐式动画的动作定义 438
28.5.3 动画结束通知 438
28.5.4 动画的暂停和恢复 439
28.6 macOS中的属性动画 439
28.6.1 属性动画 440
28.6.2 动画上下文对象 440
28.6.3 自动布局动画 441
28.7 系统动画与核心动画的对比 441
28.8 动画编程示例 442
28.8.1 关键帧动画 442
28.8.2 分组动画 444
28.8.3 转场动画 444
28.9 动画性能 445
28.10 系统专有层 446
28.10.1 渐变层 446
28.10.2 形状层 447
28.10.3 文本层 448
28.10.4 分片层 448
28.10.5 副本层 449
28.10.6 发射层 450
28.10.7 变换层 452
第29章 多代理 455
29.1 多代理与代理和通知的比较 455
29.1.1 代理方式实现 455
29.1.2 通知 456
29.1.3 多代理 456
29.2 多代理的实现 457
29.2.1 Objective-C中多代理实现技术 457
29.2.2 使用消息转发机制进行优化 457
29.2.3 XMPPFramework 458
29.3 聊天列表示例 459
29.3.1 主要的视图控制器 459
29.3.2 联系人模型类 460
29.3.3 多代理管理类 460
29.3.4 多代理的注册 461
29.3.5 多代理的通知 462
第30章 数据转换 464
30.1 转换器基类 465
30.2 系统实现的转换器 465
30.3 绑定中使用的转换器 466
30.3.1 类型转换器的实现和注册 466
30.3.2 实现模型类 467
30.3.3 绑定Combo Box控件到模型类 468
30.4 实现自定义转换器的步骤 469
30.5 使用转换器分离数据转换逻辑 469
第31章 框架 471
31.1 框架与静态库 471
31.2 创建框架工程 471
31.2.1 接口定义 471
31.2.2 头文件引用声明 472
31.2.3 使用框架 473
31.2.4 框架的加载路径 476
31.2.5 框架的签名问题 478
第32章 应用沙盒化 479
32.1 macOS沙盒机制 479
32.2 应用沙盒配置信息 479
32.3 文件沙盒编程 481
32.3.1 设计界面 481
32.3.2 App启动处理 481
32.3.3 打开文件处理流程 482
32.3.4 保存文件 483
32.3.5 应用沙盒配置 483
32.3.6 作用域安全的书签 484
32.3.7 保存打开的文件URL的书签 484
32.3.8 应用启动时通过URL的书签获取文件授权 484
第33章 数据导航视图 487
33.1 DataNavigationItem的设计 487
33.1.1 DataNavigationItem基类 488
33.1.2 DataNavigationButtonItem 488
33.1.3 DataNavigationTextItem 488
33.1.4 DataNavigationFlexibleItem 489
33.2 DataNavigationView接口和属性 489
33.2.1 接口 489
33.2.2 内部属性 489
33.3 DataNavigationView代码实现 490
33.3.1 item配置 490
33.3.2 创建视图 491
33.3.3 自动布局 492
33.3.4 更新文本视图的方法 494
33.4 使用DataNavigationView 494
第34章 表格数据管理控制器 497
34.1 表格列的动态配置 497
34.1.1 表列定义的模型 498
34.1.2 NSTableColumn类的扩展 499
34.1.3 NSTableView类的扩展 499
34.1.4 代码动态配置表列的表数据导航控制器 500
34.2 实现用代码创建的表格和用xib创建表格的兼容 504
34.3 表格的数据代理 505
34.3.1 数据集管理操作接口 505
34.3.2 数据源实现 507
34.3.3 动态创建表格内容的数据代理方法 507
34.3.4 表内容的编辑处理 511
34.3.5 TableDataDelegate的使用 512
34.4 数据列排序 513
34.5 数据行拖放交换顺序 514
34.6 数据分页显示控制 515
34.6.1 分页控制器 515
34.6.2 分页导航视图 517
34.6.3 分页数据获取 519
34.7 表格数据的增删编辑操作 519
34.7.1 增加数据 519
34.7.2 删除数据 520
34.7.3 编辑表数据 521
第35章 自动化小工具 522
35.1 图片资源适配自动化工具 522
35.1.1 实现思路 522
35.1.2 工程实现 524
35.2 国际化 527
35.2.1 App语言国际化的过程 527
35.2.2 自动化的思路 530
35.2.3 Xcode工程文件的编辑和修改 531
第36章 iPhone利用蓝牙控制Mac 534
36.1 控制的主要流程分析 534
36.2 macOS服务器端 535
36.2.1 XXXPeripheralService服务类 535
36.2.2 macOS端界面开发 537
36.2.3 Mac锁屏状态通知 538
36.2.4 控制Mac电脑的系统命令和脚本 539
36.2.5 macOS端接收iOS端的命令处理 540
36.3 iOS控制端 541
36.3.1 XXXCentralClient类 541
36.3.2 iOS界面开发 543
第37章 SQLite数据库编程 546
37.1 FMDB介绍 546
37.2 数据库操作接口封装 548
37.2.1 数据库管理对象 548
37.2.2 数据访问对象 549
37.2.3 MDAO对象 551
37.2.4 数据模型对象 552
37.2.5 具体使用 553
37.3 数据库加密 554
37.3.1 获取支持加密的SQLite3版本 554
37.3.2 加密数据库 555
37.3.3 操作加密数据库 556
37.4 获取SQLite元数据 556
37.5 模板引擎 559
37.5.1 Xcode中的模板 560
37.5.2 模板引擎处理流程 560
37.6 表模型自动化代码生成 561
37.6.1 模板文件定义 561
37.6.2 代码实现 562
第38章 开发一个完整的macOS应用 564
38.1 制定目标 564
38.2 开发自己的应用 564
38.3 主界面设计 564
38.3.1 主窗口控制器 565
38.3.2 分栏页面控制器 566
38.3.3 左边导航列表页的设计与实现 567
38.3.4 分栏右部界面 570
38.3.5 详细界面设计 571
38.4 工具栏设计 572
38.5 菜单设计 574
38.5.1 系统菜单 574
38.5.2 上下文菜单 575
38.6 应用偏好设置 577
38.7 页面控制器的核心流程 578
38.8 用户体验的一点改进 582
38.9 发布应用准备 583
38.9.1 发布到非应用商店渠道 583
38.9.2 发布到应用商店 584
后记 586