內容簡介
《iOS開發指南從零基礎到App Store上架第3版》Sw和Objective-C語言為基礎進行講解,共分4篇:開篇為基礎篇,主要講解iOS的一些基礎知識;第二篇為網路篇,主要講解iOS網路開發的相關知識;第三篇為進階篇,介紹了iOS高級內容、商業思考等;結尾一篇是實戰篇,通過兩個真實的項目,帶領讀者身臨其境地完成一個項目的開發,使讀者了解整個開發過程以及開發中的技巧。
作者簡介
關東升,智捷課堂創始人,國內知名iOS技術作家,iOS技術顧問,高級培訓講師,移動開發專家。擔任51CTO社區iOS技術顧問,精通iOS、Android和Windows?Phone及HTML5等移動開發技術。曾先後主持開發大型網路遊戲《神農訣》的iOS和Android客戶端開發,國家農產品追溯系統的iPad客戶端開發,酒店預訂系統的iPhone客戶端開發,金融系統微博的iOS、Windows?Phone?及Android客戶端開發。在App?Store上發布多款遊戲和套用軟體,擅長移動平台的套用和遊戲類項目開發。長期為中國移動研究院、雲南移動、東軟、方正科技、惠普、NTT、深圳康拓普、上海財富168、天津港務局、福州軟體園、廣州軟體園等企事業單位授課。除本書外,還著有《Swift開發指南》《iPhone與iPad開發實戰——iOS經典套用剖析》《品味移動設計》《互動設計的藝術》《Android開發案例驅動教程》、《Android網路遊戲開發實戰》,以及《Cocos2d-x實戰》系列叢書等。
作品目錄
第一部分 基礎篇
第1章 開篇綜述 2
1.1 iOS概述 2
1.1.1 iOS介紹 2
1.1.2 iOS 8的新特性 2
1.2 開發環境及開發工具 3
1.3 本書中的約定 4
1.3.1 案例代碼約定 4
1.3.2 圖示的約定 5
1.3.3 方法命名約定 6
1.3.4 構造器命名約定 7
第2章 第一個iOS應用程式 9
2.1 創建HelloWorld工程 9
2.1.1 創建工程 9
2.1.2 Xcode中的iOS工程模板 14
2.1.3 套用剖析 15
2.2 HelloWorld工程中的故事板檔案 17
2.2.1 故事板的導航特點 17
2.2.2 故事板中的Scene和Segue 19
2.3 套用生命周期 19
2.3.1 非運行狀態——套用啟動場景 21
2.3.2 點擊Home鍵——套用退出場景 22
2.3.3 掛起重新運行場景 24
2.3.4 記憶體清除——套用終止場景 25
2.4 視圖生命周期 25
2.5 設定產品屬性 27
2.5.1 Xcode中的PROJECT和TARGET 27
2.5.2 設定常用的產品屬性 29
2.6 iOS API簡介 30
2.6.1 API概述 31
2.6.2 如何使用API幫助 33
2.7 小結 36
第3章 UIView與視圖 37
3.1 視圖“始祖”——UIView 37
3.1.1 UIView“家族” 37
3.1.2 套用界面的構建層次 39
3.1.3 視圖分類 40
3.2 標籤與按鈕 40
3.2.1 標籤控制項 41
3.2.2 按鈕控制項 42
3.3 動作與輸出口 44
3.4 TextField和TextView 48
3.4.1 TextField控制項 48
3.4.2 TextView控制項 49
3.4.3 鍵盤的打開和關閉 50
3.4.4 關閉和打開鍵盤的通知 50
3.4.5 鍵盤的種類 51
3.5 開關控制項、滑塊控制項和分段控制項 52
3.5.1 開關控制項 53
3.5.2 滑塊控制項 53
3.5.3 分段控制項 54
3.6 網頁視圖WebView 54
3.7 等待相關的控制項與進度條 57
3.7.1 活動指示器ActivityIndicatorView 58
3.7.2 進度條ProgressView 59
3.8 警告框和操作表 60
3.8.1 警告框 60
3.8.2 操作表ActionSheet 62
3.8.3 使用iOS 8 UIAlertController實現 63
3.9 工具列和導航欄 64
3.9.1 工具列 64
3.9.2 導航欄 67
3.10 小結 70
第4章 iOS 8多解析度螢幕適配 71
4.1 iOS 8螢幕的多樣性 71
4.1.1 iOS 8螢幕介紹 71
4.1.2 iOS 8的三種解析度 72
4.1.3 獲得iOS設備螢幕信息 73
4.2 iOS螢幕布局 74
4.2.1 iOS中的“欄” 74
4.2.2 傳統布局 75
4.3 Auto Layout布局 77
4.3.1 在Interface Builder中管理Auto Layout約束 77
4.3.2 實例:Auto Layout布局 78
4.4 Size Class與iOS 8多螢幕適配 83
4.4.1 在Interface Builder中使用Size Class 83
4.4.2 Size Class的九宮格 84
4.4.3 實例:使用Size Class 85
4.5 在螢幕滾動視圖中使用Auto Layout和Size Class 90
4.5.1 螢幕滾動視圖的重要屬性 90
4.5.2 螢幕滾動視圖實例 92
4.6 使用資源目錄(asset catalog)管理圖片 97
4.7 小結 100
第5章 委託協定、數據源協定與高級視圖 101
5.1 視圖中的委託協定和數據源協定 101
5.2 選擇器 101
5.2.1 日期選擇器 101
5.2.2 普通選擇器 103
5.2.3 數據源協定與委託協定 106
5.3 集合視圖 108
5.3.1 集合視圖介紹 108
5.3.2 實例:奧運會比賽項目 109
5.3.3 添加集合視圖控制器 110
5.3.4 添加集合視圖單元格 113
5.3.5 數據源協定與委託協定 116
5.4 小結 117
第6章 表視圖 118
6.1 概述 118
6.1.1 表視圖的組成 118
6.1.2 表視圖的相關類 119
6.1.3 表視圖分類 119
6.1.4 單元格的組成和樣式 121
6.1.5 數據源協定與委託協定 123
6.2 簡單表視圖 123
6.2.1 創建簡單表視圖 123
6.2.2 自定義單元格 128
6.2.3 添加搜尋欄 131
6.3 分節表視圖 137
6.3.1 添加索引 137
6.3.2 分組 140
6.3.3 靜態表與控制界面布局 141
6.4 修改單元格 144
6.4.1 刪除和插入單元格 144
6.4.2 移動單元格 151
6.5 表視圖UI設計模式 153
6.5.1 分頁模式 153
6.5.2 下拉刷新模式 154
6.5.3 下拉刷新控制項 154
6.6 小結 157
第7章 視圖控制器與導航模式 158
7.1 概述 158
7.1.1 視圖控制器的種類 158
7.1.2 導航模式 158
7.1.3 模態視圖 160
7.2 平鋪導航 166
7.2.1 套用場景 166
7.2.2 基於分屏導航的實現 168
7.2.3 基於電子書導航的實現 173
7.3 標籤導航 178
7.3.1 套用場景 178
7.3.2 實現 179
7.4 樹形結構導航 182
7.4.1 套用場景 182
7.4.2 實現 183
7.5 組合使用導航模式 190
7.5.1 套用場景 190
7.5.2 實現 191
7.6 小結 198
第8章 iOS常用設計模式 199
8.1 單例模式 199
8.1.1 問題提出 199
8.1.2 Objective-C實現原理 199
8.1.3 Swift實現原理 200
8.1.4 套用案例 201
8.2 委託模式 202
8.2.1 問題提出 202
8.2.2 實現原理 204
8.2.3 套用案例 207
8.3 觀察者模式 211
8.3.1 問題提出 211
8.3.2 實現原理 211
8.3.3 通知機制和KVO機制 212
8.4 MVC 模式 218
8.4.1 MVC模式概述 218
8.4.2 Cocoa Touch中的MVC模式 219
8.5 小結 221
第9章 iPhone與iPad套用開發的差異 222
9.1 概述 222
9.1.1 套用場景差異 222
9.1.2 設計和開發需注意的問題 222
9.2 iPad專用API 225
9.2.1 UIPopoverController控制器 225
9.2.2 UISplitViewController控制器 229
9.3 小結 234
第10章 iOS分層架構設計 235
10.1 低耦合企業級系統架構設計 235
10.2 iOS分層架構設計 236
10.2.1 工程與工作空間 236
10.2.2 靜態程式庫 237
10.2.3 框架 237
10.2.4 10種分層模式 238
10.3 實例:MyNotes套用 238
10.4 基於同一工程的分層 240
10.4.1 採用純Swift語言實現——PSSS模式 240
10.4.2 採用純Objective-C語言實現——POOO模式 243
10.4.3 採用Swift與Objective-C混合搭配實現——PSOO模式 247
10.5 基於同一工作空間靜態程式庫實現的WLSOO模式 247
10.5.1 使用工作空間 247
10.5.2 添加數據持久層工程 248
10.5.3 建立業務邏輯層與數據持久層的依賴關係 249
10.5.4 建立表示層與業務邏輯層的依賴關係 251
10.6 基於同一工作空間框架實現的WFSSS模式 251
10.6.1 創建框架工程 251
10.6.2 依賴關係建立 253
10.6.3 代碼重構 254
10.7 基於同一工作空間框架實現的WFOOO模式 255
10.7.1 設定Public頭檔案 255
10.7.2 建立表示層與業務邏輯層的依賴關係 256
10.7.3 代碼重構 256
10.8 基於同一工作空間框架實現的WFSOO模式 256
10.8.1 設定Public頭檔案 256
10.8.2 建立表示層與業務邏輯層的依賴關係 257
10.8.3 代碼重構 257
10.9 基於同一工作空間框架實現的WFOSS模式 258
10.9.1 設定Public頭檔案 258
10.9.2 代碼重構 258
10.10 小結 258
第11章 數據持久化 259
11.1 概述 259
11.1.1 沙箱目錄 259
11.1.2 持久化方式 260
11.2 屬性列表 260
11.3 對象歸檔 264
11.4 使用SQLite資料庫 268
11.4.1 SQLite數據類型 268
11.4.2 創建資料庫 269
11.4.3 查詢數據 271
11.4.4 修改數據 273
11.5 Core Data 276
11.5.1 ORM 276
11.5.2 Core Data堆疊 276
11.5.3 建模和生成實體 280
11.5.4 採用Core Data分層架構設計 283
11.5.5 查詢數據 285
11.5.6 修改數據 286
11.6 小結 288
第12章 應用程式設定 289
12.1 概述 289
12.1.1 設定 289
12.1.2 配置 290
12.2 應用程式設定包 291
12.3 設定項目種類 293
12.3.1 文本欄位 295
12.3.2 開關 298
12.3.3 滑塊 299
12.3.4 值列表 300
12.3.5 子界面 301
12.4 讀取設定 303
12.5 小結 304
第13章 國際化 305
13.1 概述 305
13.1.1 需要國際化的內容 305
13.1.2 國際化目錄結構 307
13.2 文本信息國際化 308
13.2.1 系統按鈕和信息國際化 308
13.2.2 套用名稱國際化 309
13.2.3 程式代碼輸出的靜態文本國際化 311
13.2.4 使用genstring工具 312
13.3 xib和故事板檔案國際化 313
13.3.1 使用Base國際化技術 313
13.3.2 Auto Layout與國際化 315
13.4 資源檔案國際化 317
13.4.1 圖片資源檔案國際化 317
13.4.2 聲音資源檔案國際化 318
13.5 小結 318
第14章 訪問聯繫人 319
14.1 概述 319
14.2 讀取聯繫人信息 320
14.2.1 查詢聯繫人記錄 321
14.2.2 讀取單值屬性 324
14.2.3 讀取多值屬性 326
14.2.4 讀取圖片屬性 328
14.3 寫入聯繫人信息 329
14.3.1 創建聯繫人 330
14.3.2 修改聯繫人 332
14.3.3 刪除聯繫人 333
14.4 高級API 335
14.4.1 選擇聯繫人 335
14.4.2 顯示和修改聯繫人 336
14.4.3 創建聯繫人 339
14.5 小結 342
第二部分 網路篇
第15章 訪問Web Service 344
15.1 概述 344
15.2 數據交換格式 344
15.2.1 XML文檔結構 346
15.2.2 解析XML文檔 347
15.2.3 JSON文檔結構 355
15.2.4 JSON數據解碼 356
15.3 REST Web Service 357
15.3.1 HTTP和HTTPS協定 358
15.3.2 同步GET請求方法 358
15.3.3 異步GET請求方法 361
15.3.4 POST請求方法 362
15.3.5 調用REST Web Service的插入、修改和刪除方法 363
15.4 使用輕量級網路請求框架MKNetworkKit 368
15.4.1 ASIHTTPRequest、AFNetworking和MKNetworkKit比較 368
15.4.2 安裝和配置MKNetworkKit框架 369
5.4.3 網路請求 370
15.4.4 下載數據 371
15.4.5 上傳數據 373
15.5 反饋網路信息改善用戶體驗 375
15.5.1 使用下拉刷新控制項改善用戶體驗 375
15.5.2 使用活動指示器控制項 378
15.5.3 使用網路活動指示器 380
15.6 小結 380
第16章 定位服務與地圖套用 381
16.1 定位服務 381
16.1.1 定位服務編程 382
16.1.2 地理信息反編碼 386
16.1.3 地理信息編碼查詢 388
16.1.4 關於定位服務的測試 390
16.2 使用iOS蘋果地圖 393
16.2.1 顯示地圖 393
16.2.2 添加標註 395
16.2.3 跟蹤用戶位置變化 398
16.3 使用程式外地圖 399
16.3.1 調用iOS蘋果地圖 400
16.3.2 調用谷歌Web地圖 402
16.4 小結 404
第三部分 進階篇
第17章 iOS中的商業模式 406
17.1 收費策略 406
17.1.1 iOS如何賺錢 406
17.1.2 避免定價策略誤區 406
17.1.3 免費軟體的藝術 407
17.1.4 在適當的時間、適當的地點植入廣告 407
17.1.5 嘗試不同的盈利模式 407
17.2 使用蘋果iAd 廣告 408
17.2.1 橫幅廣告 408
17.2.2 插頁廣告 411
17.2.3 查看你的收入 417
17.3 使用谷歌AdMob廣告 419
17.3.1 註冊AdMob賬號 419
17.3.2 管理AdMob廣告 419
17.3.3 AdMob廣告類型 422
17.3.4 下載AdMob Ads SDK 423
17.3.5 配置AdMob開發環境 424
17.3.6 AdMob橫幅廣告 426
17.3.7 添加AdMob插頁廣告 428
17.3.8 為廣告提交用戶和位置信息 431
17.3.9 搜尋廣告 431
17.4 小結 433
第18章 找出程式中的bug——調試 434
18.1 Xcode調試工具 434
18.1.1 定位編譯錯誤 434
18.1.2 查看和顯示日誌 435
18.1.3 設定和查看斷點 437
18.1.4 調試工具 442
18.1.5 輸出視窗 443
18.1.6 變數查看視窗 444
18.1.7 查看執行緒 445
18.2 日誌與斷言輸出 446
18.2.1 使用NSLog函式 446
18.2.2 使用斷言 447
18.3 異常堆疊報告分析 448
18.3.1 跟蹤異常堆疊 448
18.3.2 分析堆疊報告 450
18.4 在iOS設備上調試 450
18.4.1 創建開發者證書 451
18.4.2 設備註冊 455
18.4.3 創建App ID 456
18.4.4 創建配置概要檔案 459
18.4.5 設備調試 460
18.5 Xcode設備管理工具 461
18.5.1 查看設備上的應用程式 462
18.5.2 設備日誌 464
18.6 小結 464
第19章 測試驅動下的iOS套用開發 465
19.1 測試驅動的軟體開發概述 465
19.1.1 測試驅動的軟體開發流程 465
19.1.2 測試驅動的軟體開發案例 466
19.1.3 iOS單元測試框架 467
19.2 使用XCTest測試框架 468
19.2.1 添加XCTest到工程 468
19.2.2 編寫XCTest測試方法 469
19.2.3 運行測試程式 472
19.2.4 分析測試報告 473
19.3 異步單元測試 475
19.4 性能測試 478
19.4.1 配置測試環境 478
19.4.2 測試代碼 479
19.4.3 分析測試結果 480
19.5 iOS單元測試最佳實踐 481
19.5.1 測試數據持久層 481
19.5.2 測試業務邏輯層 485
19.6 小結 486
第20章 讓你的程式“飛”起來——性能最佳化 487
20.1 記憶體最佳化 487
20.1.1 記憶體管理 487
20.1.2 使用Analyze和Instruments工具解決記憶體泄漏問題 487
20.1.3 查找和解決殭屍對象 494
20.1.4 autorelease的使用問題 497
20.1.5 回響記憶體警告 497
20.2 最佳化資源檔案 499
20.2.1 圖片檔案最佳化 499
20.2.2 音頻檔案最佳化 500
20.3 延遲載入 501
20.3.1 資源檔案的延遲載入 501
20.3.2 故事板檔案的延遲載入 505
20.3.3 xib檔案的延遲載入 507
20.4 數據持久化的最佳化 509
20.4.1 使用檔案 509
20.4.2 使用SQLite資料庫 513
20.4.3 使用Core Data 514
20.5 可重用對象的使用 516
20.5.1 表視圖中的可重用對象 516
20.5.2 集合視圖中的可重用對象 518
20.5.3 地圖視圖中的可重用對象 519
20.6 並發處理與多核CPU 520
20.6.1 主執行緒阻塞問題 520
20.6.2 選擇NSThread還是GCD 521
20.7 小結 521
第21章 管理好你的程式代碼——代碼版本控制 522
21.1 概述 522
21.1.1 版本控制歷史 522
21.1.2 基本概念 523
21.2 Git代碼版本控制 523
21.2.1 伺服器搭建 523
21.2.2 Gitolite伺服器管理 525
21.2.3 Git常用命令 527
21.2.4 Git分支 529
21.2.5 Git協同開發 533
21.2.6 Xcode中Git的配置與使用 535
21.3 GitHub代碼託管服務 542
21.3.1 創建和配置GitHub賬號 542
21.3.2 創建代碼庫 544
21.3.3 刪除代碼庫 546
21.3.4 派生代碼庫 546
21.3.5 使用GitHub協同開發 549
21.3.6 管理組織 555
21.4 小結 558
第22章 把你的套用放到App Store上 559
22.1 收官 559
22.1.1 在Xcode 6中添加圖示 559
22.1.2 在Xcode 6中添加啟動界面 562
22.1.3 調整Identity和Deployment Info屬性 564
22.1.4 為發布進行編譯 567
22.2 發布流程 571
22.2.1 創建套用 572
22.2.2 基本信息輸入 574
22.2.3 套用定價 577
22.2.4 上傳套用 577
22.2.5 提交審核 579
22.3 常見審核不通過的原因 581
22.3.1 功能問題 581
22.3.2 用戶界面問題 581
22.3.3 商業問題 581
22.3.4 不當內容 581
22.3.5 其他問題 582
22.4 小結 582
第四部分 實戰篇
第23章 重構MyNotes套用——iOS網路通信中的設計模式與架構設計 584
23.1 行動網路通信套用的分層架構設計 584
23.2 Objective-C版本:在工作空間中添加和配置MKNetworkKit 585
23.3 基於委託模式實現 587
23.3.1 網路通信與委託模式 587
23.3.2 在異步網路通信中使用委託模式實現分層架構設計 587
23.3.3 類圖 588
23.3.4 時序圖 591
23.3.5 數據持久層重構 593
23.3.6 業務邏輯層的代碼實現 597
23.3.7 表示層的代碼實現 599
23.4 基於觀察者模式的通知機制實現 603
23.4.1 觀察者模式的通知機制回顧 603
23.4.2 異步網路通信中通知機制的分層架構設計 604
23.4.3 類圖 605
23.4.4 時序圖 606
23.4.5 數據持久層的重構 609
23.4.6 業務邏輯層的代碼實現 611
23.4.7 表示層的代碼實現 612
23.5 小結 616
第24章 iOS敏捷開發項目實戰——2016里約熱內盧奧運會套用開發及App Store發布 617
24.1 套用分析與設計 617
24.1.1 套用概述 617
24.1.2 需求分析 617
24.1.3 原型設計 618
24.1.4 資料庫設計 619
24.1.5 架構設計 619
24.2 iOS敏捷開發 620
24.2.1 敏捷開發宣言 620
24.2.2 iOS適合敏捷開發? 621
24.2.3 iOS敏捷開發最佳實踐 621
24.3 任務1:創建套用工作空間和工程 623
24.3.1 疊代1.1:創建Swift版本的工程 623
24.3.2 疊代1.2:創建Objective-C版本工作空間 623
24.3.3 疊代1.3:發布到GitHub 623
24.4 任務2:信息系統層與持久層開發 624
24.4.1 疊代2.1:編寫資料庫DDL腳本 624
24.4.2 疊代2.2:插入初始數據到資料庫 625
24.4.3 疊代2.3:編寫實體類 625
24.4.4 疊代2.4:DAO類XCTest單元測試 626
24.4.5 疊代2.5:資料庫幫助類DBHelper 629
24.4.6 疊代2.5:編寫DAO類 632
24.4.7 疊代2.6:發布到GitHub 635
24.5 任務3:業務邏輯層開發 636
24.5.1 疊代3.1:對比賽項目業務邏輯類進行XCTest單元測試 636
24.5.2 疊代3.2:編寫比賽項目業務邏輯類 637
24.5.3 疊代3.3:對比賽日程業務邏輯類進行XCTest單元測試 638
24.5.4 疊代3.4:編寫比賽日程業務邏輯類 639
24.5.5 疊代3.5:發布到GitHub 640
24.6 任務4:表示層開發 641
24.6.1 疊代4.1:使用資源目錄管理圖片和圖示資源 641
24.6.2 疊代4.2:根據原型設計初步設計iPad故事板 642
24.6.3 疊代4.3:根據原型設計初步設計iPhone故事板 644
24.6.4 疊代4.4:首頁模組 644
24.6.5 疊代4.5:比賽項目模組 645
24.6.6 疊代4.6:比賽日程模組 649
24.6.7 疊代4.7:倒計時模組表示層 652
24.6.8 疊代4.8:關於我們模組表示層 653
24.6.9 疊代4.9:發布到GitHub 654
24.7 任務5:收工 654
24.7.1 疊代5.1:添加圖示 654
24.7.2 疊代5.2:設計和添加啟動界面 654
24.7.3 疊代5.3:植入谷歌AdMob橫幅廣告 655
24.7.4 疊代5.4:性能測試與改善 657
24.7.5 疊代5.5:發布到GitHub上 658
24.7.6 疊代5.6:在App Store上發布套用 658
24.8 小結 658
第一部分 基礎篇
第1章 開篇綜述 2
1.1 iOS概述 2
1.1.1 iOS介紹 2
1.1.2 iOS 8的新特性 2
1.2 開發環境及開發工具 3
1.3 本書中的約定 4
1.3.1 案例代碼約定 4
1.3.2 圖示的約定 5
1.3.3 方法命名約定 6
1.3.4 構造器命名約定 7
第2章 第一個iOS應用程式 9
2.1 創建HelloWorld工程 9
2.1.1 創建工程 9
2.1.2 Xcode中的iOS工程模板 14
2.1.3 套用剖析 15
2.2 HelloWorld工程中的故事板檔案 17
2.2.1 故事板的導航特點 17
2.2.2 故事板中的Scene和Segue 19
2.3 套用生命周期 19
2.3.1 非運行狀態——套用啟動場景 21
2.3.2 點擊Home鍵——套用退出場景 22
2.3.3 掛起重新運行場景 24
2.3.4 記憶體清除——套用終止場景 25
2.4 視圖生命周期 25
2.5 設定產品屬性 27
2.5.1 Xcode中的PROJECT和TARGET 27
2.5.2 設定常用的產品屬性 29
2.6 iOS API簡介 30
2.6.1 API概述 31
2.6.2 如何使用API幫助 33
2.7 小結 36
第3章 UIView與視圖 37
3.1 視圖“始祖”——UIView 37
3.1.1 UIView“家族” 37
3.1.2 套用界面的構建層次 39
3.1.3 視圖分類 40
3.2 標籤與按鈕 40
3.2.1 標籤控制項 41
3.2.2 按鈕控制項 42
3.3 動作與輸出口 44
3.4 TextField和TextView 48
3.4.1 TextField控制項 48
3.4.2 TextView控制項 49
3.4.3 鍵盤的打開和關閉 50
3.4.4 關閉和打開鍵盤的通知 50
3.4.5 鍵盤的種類 51
3.5 開關控制項、滑塊控制項和分段控制項 52
3.5.1 開關控制項 53
3.5.2 滑塊控制項 53
3.5.3 分段控制項 54
3.6 網頁視圖WebView 54
3.7 等待相關的控制項與進度條 57
3.7.1 活動指示器ActivityIndicatorView 58
3.7.2 進度條ProgressView 59
3.8 警告框和操作表 60
3.8.1 警告框 60
3.8.2 操作表ActionSheet 62
3.8.3 使用iOS 8 UIAlertController實現 63
3.9 工具列和導航欄 64
3.9.1 工具列 64
3.9.2 導航欄 67
3.10 小結 70
第4章 iOS 8多解析度螢幕適配 71
4.1 iOS 8螢幕的多樣性 71
4.1.1 iOS 8螢幕介紹 71
4.1.2 iOS 8的三種解析度 72
4.1.3 獲得iOS設備螢幕信息 73
4.2 iOS螢幕布局 74
4.2.1 iOS中的“欄” 74
4.2.2 傳統布局 75
4.3 Auto Layout布局 77
4.3.1 在Interface Builder中管理Auto Layout約束 77
4.3.2 實例:Auto Layout布局 78
4.4 Size Class與iOS 8多螢幕適配 83
4.4.1 在Interface Builder中使用Size Class 83
4.4.2 Size Class的九宮格 84
4.4.3 實例:使用Size Class 85
4.5 在螢幕滾動視圖中使用Auto Layout和Size Class 90
4.5.1 螢幕滾動視圖的重要屬性 90
4.5.2 螢幕滾動視圖實例 92
4.6 使用資源目錄(asset catalog)管理圖片 97
4.7 小結 100
第5章 委託協定、數據源協定與高級視圖 101
5.1 視圖中的委託協定和數據源協定 101
5.2 選擇器 101
5.2.1 日期選擇器 101
5.2.2 普通選擇器 103
5.2.3 數據源協定與委託協定 106
5.3 集合視圖 108
5.3.1 集合視圖介紹 108
5.3.2 實例:奧運會比賽項目 109
5.3.3 添加集合視圖控制器 110
5.3.4 添加集合視圖單元格 113
5.3.5 數據源協定與委託協定 116
5.4 小結 117
第6章 表視圖 118
6.1 概述 118
6.1.1 表視圖的組成 118
6.1.2 表視圖的相關類 119
6.1.3 表視圖分類 119
6.1.4 單元格的組成和樣式 121
6.1.5 數據源協定與委託協定 123
6.2 簡單表視圖 123
6.2.1 創建簡單表視圖 123
6.2.2 自定義單元格 128
6.2.3 添加搜尋欄 131
6.3 分節表視圖 137
6.3.1 添加索引 137
6.3.2 分組 140
6.3.3 靜態表與控制界面布局 141
6.4 修改單元格 144
6.4.1 刪除和插入單元格 144
6.4.2 移動單元格 151
6.5 表視圖UI設計模式 153
6.5.1 分頁模式 153
6.5.2 下拉刷新模式 154
6.5.3 下拉刷新控制項 154
6.6 小結 157
第7章 視圖控制器與導航模式 158
7.1 概述 158
7.1.1 視圖控制器的種類 158
7.1.2 導航模式 158
7.1.3 模態視圖 160
7.2 平鋪導航 166
7.2.1 套用場景 166
7.2.2 基於分屏導航的實現 168
7.2.3 基於電子書導航的實現 173
7.3 標籤導航 178
7.3.1 套用場景 178
7.3.2 實現 179
7.4 樹形結構導航 182
7.4.1 套用場景 182
7.4.2 實現 183
7.5 組合使用導航模式 190
7.5.1 套用場景 190
7.5.2 實現 191
7.6 小結 198
第8章 iOS常用設計模式 199
8.1 單例模式 199
8.1.1 問題提出 199
8.1.2 Objective-C實現原理 199
8.1.3 Swift實現原理 200
8.1.4 套用案例 201
8.2 委託模式 202
8.2.1 問題提出 202
8.2.2 實現原理 204
8.2.3 套用案例 207
8.3 觀察者模式 211
8.3.1 問題提出 211
8.3.2 實現原理 211
8.3.3 通知機制和KVO機制 212
8.4 MVC 模式 218
8.4.1 MVC模式概述 218
8.4.2 Cocoa Touch中的MVC模式 219
8.5 小結 221
第9章 iPhone與iPad套用開發的差異 222
9.1 概述 222
9.1.1 套用場景差異 222
9.1.2 設計和開發需注意的問題 222
9.2 iPad專用API 225
9.2.1 UIPopoverController控制器 225
9.2.2 UISplitViewController控制器 229
9.3 小結 234
第10章 iOS分層架構設計 235
10.1 低耦合企業級系統架構設計 235
10.2 iOS分層架構設計 236
10.2.1 工程與工作空間 236
10.2.2 靜態程式庫 237
10.2.3 框架 237
10.2.4 10種分層模式 238
10.3 實例:MyNotes套用 238
10.4 基於同一工程的分層 240
10.4.1 採用純Swift語言實現——PSSS模式 240
10.4.2 採用純Objective-C語言實現——POOO模式 243
10.4.3 採用Swift與Objective-C混合搭配實現——PSOO模式 247
10.5 基於同一工作空間靜態程式庫實現的WLSOO模式 247
10.5.1 使用工作空間 247
10.5.2 添加數據持久層工程 248
10.5.3 建立業務邏輯層與數據持久層的依賴關係 249
10.5.4 建立表示層與業務邏輯層的依賴關係 251
10.6 基於同一工作空間框架實現的WFSSS模式 251
10.6.1 創建框架工程 251
10.6.2 依賴關係建立 253
10.6.3 代碼重構 254
10.7 基於同一工作空間框架實現的WFOOO模式 255
10.7.1 設定Public頭檔案 255
10.7.2 建立表示層與業務邏輯層的依賴關係 256
10.7.3 代碼重構 256
10.8 基於同一工作空間框架實現的WFSOO模式 256
10.8.1 設定Public頭檔案 256
10.8.2 建立表示層與業務邏輯層的依賴關係 257
10.8.3 代碼重構 257
10.9 基於同一工作空間框架實現的WFOSS模式 258
10.9.1 設定Public頭檔案 258
10.9.2 代碼重構 258
10.10 小結 258
第11章 數據持久化 259
11.1 概述 259
11.1.1 沙箱目錄 259
11.1.2 持久化方式 260
11.2 屬性列表 260
11.3 對象歸檔 264
11.4 使用SQLite資料庫 268
11.4.1 SQLite數據類型 268
11.4.2 創建資料庫 269
11.4.3 查詢數據 271
11.4.4 修改數據 273
11.5 Core Data 276
11.5.1 ORM 276
11.5.2 Core Data堆疊 276
11.5.3 建模和生成實體 280
11.5.4 採用Core Data分層架構設計 283
11.5.5 查詢數據 285
11.5.6 修改數據 286
11.6 小結 288
第12章 應用程式設定 289
12.1 概述 289
12.1.1 設定 289
12.1.2 配置 290
12.2 應用程式設定包 291
12.3 設定項目種類 293
12.3.1 文本欄位 295
12.3.2 開關 298
12.3.3 滑塊 299
12.3.4 值列表 300
12.3.5 子界面 301
12.4 讀取設定 303
12.5 小結 304
第13章 國際化 305
13.1 概述 305
13.1.1 需要國際化的內容 305
13.1.2 國際化目錄結構 307
13.2 文本信息國際化 308
13.2.1 系統按鈕和信息國際化 308
13.2.2 套用名稱國際化 309
13.2.3 程式代碼輸出的靜態文本國際化 311
13.2.4 使用genstring工具 312
13.3 xib和故事板檔案國際化 313
13.3.1 使用Base國際化技術 313
13.3.2 Auto Layout與國際化 315
13.4 資源檔案國際化 317
13.4.1 圖片資源檔案國際化 317
13.4.2 聲音資源檔案國際化 318
13.5 小結 318
第14章 訪問聯繫人 319
14.1 概述 319
14.2 讀取聯繫人信息 320
14.2.1 查詢聯繫人記錄 321
14.2.2 讀取單值屬性 324
14.2.3 讀取多值屬性 326
14.2.4 讀取圖片屬性 328
14.3 寫入聯繫人信息 329
14.3.1 創建聯繫人 330
14.3.2 修改聯繫人 332
14.3.3 刪除聯繫人 333
14.4 高級API 335
14.4.1 選擇聯繫人 335
14.4.2 顯示和修改聯繫人 336
14.4.3 創建聯繫人 339
14.5 小結 342
第二部分 網路篇
第15章 訪問Web Service 344
15.1 概述 344
15.2 數據交換格式 344
15.2.1 XML文檔結構 346
15.2.2 解析XML文檔 347
15.2.3 JSON文檔結構 355
15.2.4 JSON數據解碼 356
15.3 REST Web Service 357
15.3.1 HTTP和HTTPS協定 358
15.3.2 同步GET請求方法 358
15.3.3 異步GET請求方法 361
15.3.4 POST請求方法 362
15.3.5 調用REST Web Service的插入、修改和刪除方法 363
15.4 使用輕量級網路請求框架MKNetworkKit 368
15.4.1 ASIHTTPRequest、AFNetworking和MKNetworkKit比較 368
15.4.2 安裝和配置MKNetworkKit框架 369
5.4.3 網路請求 370
15.4.4 下載數據 371
15.4.5 上傳數據 373
15.5 反饋網路信息改善用戶體驗 375
15.5.1 使用下拉刷新控制項改善用戶體驗 375
15.5.2 使用活動指示器控制項 378
15.5.3 使用網路活動指示器 380
15.6 小結 380
第16章 定位服務與地圖套用 381
16.1 定位服務 381
16.1.1 定位服務編程 382
16.1.2 地理信息反編碼 386
16.1.3 地理信息編碼查詢 388
16.1.4 關於定位服務的測試 390
16.2 使用iOS蘋果地圖 393
16.2.1 顯示地圖 393
16.2.2 添加標註 395
16.2.3 跟蹤用戶位置變化 398
16.3 使用程式外地圖 399
16.3.1 調用iOS蘋果地圖 400
16.3.2 調用谷歌Web地圖 402
16.4 小結 404
第三部分 進階篇
第17章 iOS中的商業模式 406
17.1 收費策略 406
17.1.1 iOS如何賺錢 406
17.1.2 避免定價策略誤區 406
17.1.3 免費軟體的藝術 407
17.1.4 在適當的時間、適當的地點植入廣告 407
17.1.5 嘗試不同的盈利模式 407
17.2 使用蘋果iAd 廣告 408
17.2.1 橫幅廣告 408
17.2.2 插頁廣告 411
17.2.3 查看你的收入 417
17.3 使用谷歌AdMob廣告 419
17.3.1 註冊AdMob賬號 419
17.3.2 管理AdMob廣告 419
17.3.3 AdMob廣告類型 422
17.3.4 下載AdMob Ads SDK 423
17.3.5 配置AdMob開發環境 424
17.3.6 AdMob橫幅廣告 426
17.3.7 添加AdMob插頁廣告 428
17.3.8 為廣告提交用戶和位置信息 431
17.3.9 搜尋廣告 431
17.4 小結 433
第18章 找出程式中的bug——調試 434
18.1 Xcode調試工具 434
18.1.1 定位編譯錯誤 434
18.1.2 查看和顯示日誌 435
18.1.3 設定和查看斷點 437
18.1.4 調試工具 442
18.1.5 輸出視窗 443
18.1.6 變數查看視窗 444
18.1.7 查看執行緒 445
18.2 日誌與斷言輸出 446
18.2.1 使用NSLog函式 446
18.2.2 使用斷言 447
18.3 異常堆疊報告分析 448
18.3.1 跟蹤異常堆疊 448
18.3.2 分析堆疊報告 450
18.4 在iOS設備上調試 450
18.4.1 創建開發者證書 451
18.4.2 設備註冊 455
18.4.3 創建App ID 456
18.4.4 創建配置概要檔案 459
18.4.5 設備調試 460
18.5 Xcode設備管理工具 461
18.5.1 查看設備上的應用程式 462
18.5.2 設備日誌 464
18.6 小結 464
第19章 測試驅動下的iOS套用開發 465
19.1 測試驅動的軟體開發概述 465
19.1.1 測試驅動的軟體開發流程 465
19.1.2 測試驅動的軟體開發案例 466
19.1.3 iOS單元測試框架 467
19.2 使用XCTest測試框架 468
19.2.1 添加XCTest到工程 468
19.2.2 編寫XCTest測試方法 469
19.2.3 運行測試程式 472
19.2.4 分析測試報告 473
19.3 異步單元測試 475
19.4 性能測試 478
19.4.1 配置測試環境 478
19.4.2 測試代碼 479
19.4.3 分析測試結果 480
19.5 iOS單元測試最佳實踐 481
19.5.1 測試數據持久層 481
19.5.2 測試業務邏輯層 485
19.6 小結 486
第20章 讓你的程式“飛”起來——性能最佳化 487
20.1 記憶體最佳化 487
20.1.1 記憶體管理 487
20.1.2 使用Analyze和Instruments工具解決記憶體泄漏問題 487
20.1.3 查找和解決殭屍對象 494
20.1.4 autorelease的使用問題 497
20.1.5 回響記憶體警告 497
20.2 最佳化資源檔案 499
20.2.1 圖片檔案最佳化 499
20.2.2 音頻檔案最佳化 500
20.3 延遲載入 501
20.3.1 資源檔案的延遲載入 501
20.3.2 故事板檔案的延遲載入 505
20.3.3 xib檔案的延遲載入 507
20.4 數據持久化的最佳化 509
20.4.1 使用檔案 509
20.4.2 使用SQLite資料庫 513
20.4.3 使用Core Data 514
20.5 可重用對象的使用 516
20.5.1 表視圖中的可重用對象 516
20.5.2 集合視圖中的可重用對象 518
20.5.3 地圖視圖中的可重用對象 519
20.6 並發處理與多核CPU 520
20.6.1 主執行緒阻塞問題 520
20.6.2 選擇NSThread還是GCD 521
20.7 小結 521
第21章 管理好你的程式代碼——代碼版本控制 522
21.1 概述 522
21.1.1 版本控制歷史 522
21.1.2 基本概念 523
21.2 Git代碼版本控制 523
21.2.1 伺服器搭建 523
21.2.2 Gitolite伺服器管理 525
21.2.3 Git常用命令 527
21.2.4 Git分支 529
21.2.5 Git協同開發 533
21.2.6 Xcode中Git的配置與使用 535
21.3 GitHub代碼託管服務 542
21.3.1 創建和配置GitHub賬號 542
21.3.2 創建代碼庫 544
21.3.3 刪除代碼庫 546
21.3.4 派生代碼庫 546
21.3.5 使用GitHub協同開發 549
21.3.6 管理組織 555
21.4 小結 558
第22章 把你的套用放到App Store上 559
22.1 收官 559
22.1.1 在Xcode 6中添加圖示 559
22.1.2 在Xcode 6中添加啟動界面 562
22.1.3 調整Identity和Deployment Info屬性 564
22.1.4 為發布進行編譯 567
22.2 發布流程 571
22.2.1 創建套用 572
22.2.2 基本信息輸入 574
22.2.3 套用定價 577
22.2.4 上傳套用 577
22.2.5 提交審核 579
22.3 常見審核不通過的原因 581
22.3.1 功能問題 581
22.3.2 用戶界面問題 581
22.3.3 商業問題 581
22.3.4 不當內容 581
22.3.5 其他問題 582
22.4 小結 582
第四部分 實戰篇
第23章 重構MyNotes套用——iOS網路通信中的設計模式與架構設計 584
23.1 行動網路通信套用的分層架構設計 584
23.2 Objective-C版本:在工作空間中添加和配置MKNetworkKit 585
23.3 基於委託模式實現 587
23.3.1 網路通信與委託模式 587
23.3.2 在異步網路通信中使用委託模式實現分層架構設計 587
23.3.3 類圖 588
23.3.4 時序圖 591
23.3.5 數據持久層重構 593
23.3.6 業務邏輯層的代碼實現 597
23.3.7 表示層的代碼實現 599
23.4 基於觀察者模式的通知機制實現 603
23.4.1 觀察者模式的通知機制回顧 603
23.4.2 異步網路通信中通知機制的分層架構設計 604
23.4.3 類圖 605
23.4.4 時序圖 606
23.4.5 數據持久層的重構 609
23.4.6 業務邏輯層的代碼實現 611
23.4.7 表示層的代碼實現 612
23.5 小結 616
第24章 iOS敏捷開發項目實戰——2016里約熱內盧奧運會套用開發及App Store發布 617
24.1 套用分析與設計 617
24.1.1 套用概述 617
24.1.2 需求分析 617
24.1.3 原型設計 618
24.1.4 資料庫設計 619
24.1.5 架構設計 619
24.2 iOS敏捷開發 620
24.2.1 敏捷開發宣言 620
24.2.2 iOS適合敏捷開發? 621
24.2.3 iOS敏捷開發最佳實踐 621
24.3 任務1:創建套用工作空間和工程 623
24.3.1 疊代1.1:創建Swift版本的工程 623
24.3.2 疊代1.2:創建Objective-C版本工作空間 623
24.3.3 疊代1.3:發布到GitHub 623
24.4 任務2:信息系統層與持久層開發 624
24.4.1 疊代2.1:編寫資料庫DDL腳本 624
24.4.2 疊代2.2:插入初始數據到資料庫 625
24.4.3 疊代2.3:編寫實體類 625
24.4.4 疊代2.4:DAO類XCTest單元測試 626
24.4.5 疊代2.5:資料庫幫助類DBHelper 629
24.4.6 疊代2.5:編寫DAO類 632
24.4.7 疊代2.6:發布到GitHub 635
24.5 任務3:業務邏輯層開發 636
24.5.1 疊代3.1:對比賽項目業務邏輯類進行XCTest單元測試 636
24.5.2 疊代3.2:編寫比賽項目業務邏輯類 637
24.5.3 疊代3.3:對比賽日程業務邏輯類進行XCTest單元測試 638
24.5.4 疊代3.4:編寫比賽日程業務邏輯類 639
24.5.5 疊代3.5:發布到GitHub 640
24.6 任務4:表示層開發 641
24.6.1 疊代4.1:使用資源目錄管理圖片和圖示資源 641
24.6.2 疊代4.2:根據原型設計初步設計iPad故事板 642
24.6.3 疊代4.3:根據原型設計初步設計iPhone故事板 644
24.6.4 疊代4.4:首頁模組 644
24.6.5 疊代4.5:比賽項目模組 645
24.6.6 疊代4.6:比賽日程模組 649
24.6.7 疊代4.7:倒計時模組表示層 652
24.6.8 疊代4.8:關於我們模組表示層 653
24.6.9 疊代4.9:發布到GitHub 654
24.7 任務5:收工 654
24.7.1 疊代5.1:添加圖示 654
24.7.2 疊代5.2:設計和添加啟動界面 654
24.7.3 疊代5.3:植入谷歌AdMob橫幅廣告 655
24.7.4 疊代5.4:性能測試與改善 657
24.7.5 疊代5.5:發布到GitHub上 658
24.7.6 疊代5.6:在App Store上發布套用 658
24.8 小結 658