编辑推荐
· macOS 应用开发工程师全力打造,图文并茂,并提供丰富且详细的示例,致力于帮助读者开发出强大的生产力工具。
· 对macOS 平台中的AppKit 控件做了详细介绍,每章提供完整的示例代码,帮助读者更好地理解相关内容。
· 为想学macOS 开发的初学者,由浅入深地介绍应用开发的完整过程,让读者学会独立开发自己的应用。
· 基于Xcode 9.0和Swift 4.0语法编写。
本书以Swift 语言为基础介绍masOS 平台应用开发,分为8 大部分,共计38 章。D一部分讲述视图、窗口和系统控件,D二部分介绍自动布局、窗口控制器和视图控制器,第三部分讲解核心服务框架,第四部分给出与文档和数据存储相关的内容,第五部分为网络和多线程处理,第六部分是图形和动画,第七部分为扩展议题,第八部分是项目开发和实践。
本书立足普及基本的macOS 应用开发知识,力求每个知识点的讲解都简明扼要,并通过代码示例让读者尽快学以致用,非常适合macOS 应用开发的初学者阅读。但是,本书没有介绍Swift 开发语言,阅读本书需要读者具备Swift 相关的基础知识。
内容简介
本书是Swift版本的macOS应用开发教程。本书全面介绍和说明了macOS平台中应用开发的系统控件,详细阐述和探讨了应用开发的常用组件、系统框架、应用沙盒处理、上架流程、生产力工具开发等内容,并配有丰富的示例讲解。书中还介绍了几个小型的演示项目,剖析了开发过程、开发思路和关键流程代码,力求让读者从基础知识和项目实践等多个维度去理解和掌握macOS平台的应用开发。
本书立足普及基本的macOS应用开发知识,力求每个知识点的讲解都简明扼要,并通过代码示例演示让读者尽快学以致用,非常适合macOS应用开发的初学者阅读。但是,本书中并没有介绍Swift的基础语法,阅读本书需要读者了解Swift的知识。
作者简介
赵君卫(微博@剑指人心),中国早期的iOSkai发者,负责开发了zhu名的LBS交友App“飘信”,曾担任苏宁易购移动技术团队负责人、途牛金融移动技术总监;2014年开始接触macOS应用开发,独立开发了macOS平台上UI设计工具AppX;创建了macOS应用开发网站macdev,汇聚与macOS相关的开发资源,崇尚自动化开发的理念,打造先进的生产力工具。
张帆(微博@AB人生-东门吹牛西门吹雪),留美博士,专注于计算机和互联网技术在诸如信息安全、通信电子、医疗健康等特定行业的应用,擅长iOS和.NET开发;曾在美国微软总部和飞利浦医疗北美总部任职;入选浙江省“千人计划”;曾任新加坡国立大学访问学者,现任浙江大学信息与电子工程学院和浙江大学网络空间安全研究中心副教授,同时也是新加坡科技设计大学访问教授。
目录
- 第 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和title 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 滚动到zhi定的位置 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 滚动条视图gao级用法 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 创建NSFileWrapper管理文件 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章 CloudKit 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 String的绘制方法 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的书签获取文件shou权 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