天天看點

《iOS元件與架構——iOS SDK進階特性剖析》——第8章,第8.3節UIDocument簡介

本節書摘來自異步社群《ios元件與架構——ios sdk進階特性剖析》一書中的第8章,第8.3節uidocument簡介,作者 【美】kyle richter , joe keeley,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

8.3 uidocument簡介

ios元件與架構——ios sdk進階特性剖析

應用的功能圍繞着以使用者為中心的文檔式資料展開時,建立uidocument子類很合适。uidocument用于自動完成與文檔互動時所需的衆多典型功能。例如,uidocument支援自動儲存,還支援背景加載和儲存,以免影響主隊列,進而降低使用者界面的響應速度。另外,uidocument将加載和儲存邏輯抽象為簡單的方法調用,讓開發人員隻需編寫在文檔資料和nsdata之間進行轉換的簡單邏輯。對本章來說最重要的是,uidocument還自動完成與icloud的互動。

8.3.1 建立uidocument子類

在示例應用中,使用者建立的每條備忘錄都是uidocument子類icfmynotedocument的執行個體。uidocument子類應實作方法contentsfortype:error:和loadfromcontents: oftype:error:,并實作修改跟蹤以啟用uidocument的自動儲存功能。在示例應用中,由于備忘錄隻在一個字元串變量中存儲備忘錄内容,是以這些方法實作起來很容易。

《iOS元件與架構——iOS SDK進階特性剖析》——第8章,第8.3節UIDocument簡介

在方法contentsfortype:error:中,首先檢查是否給mynotetext指定了值,如果沒有,就提供一個預設值以防應用崩潰。接下來,将mynotetext轉換為nsdata并傳回轉換結果。這個nsdata就是uidocument将儲存的内容。方法loadfromcontents: oftype:error:執行的操作與此相反。

《iOS元件與架構——iOS SDK進階特性剖析》——第8章,第8.3節UIDocument簡介

uidocument以nsdata格式傳回儲存的内容,而這個方法将其轉換為子類的屬性。它檢查内容的長度,如果沒有内容,就将mynotetext設定為空字元串,否則将nsdata轉換為nsstring,并使用轉換結果填充屬性mynotetext。最後,這個方法告訴委托文檔發生了變化,讓它能夠采取合适的措施,如使用新加載的資料更新使用者界面。

為啟用uidocument提供的自動儲存功能,子類需要實作變更跟蹤。變更跟蹤是使用uidocument提供的undomanager啟用的。

《iOS元件與架構——iOS SDK進階特性剖析》——第8章,第8.3節UIDocument簡介

注意到不需要執行額外的操作就能自動儲存:應用不需要實際實作撤銷功能;給undomanager指定操作(action)後,自動儲存功能便啟用了。

8.3.2 與uidocument互動

要建立uidocument子類的執行個體,首先需要确定表示檔案儲存位置的url。使用者輕按示例應用中的加号按鈕時,将調用主視圖控制器的方法newmynotename,由它決定新備忘錄将使用的檔案名。這個方法在mynote後面加上一個數字來生成檔案名,并檢查它是否存在;如果存在,就将數字加1,直到生成的檔案名未被使用。接下來,将這個檔案名附加到icloud目錄url的後面,得到檔案的完整路徑。然後,将這個url傳遞給詳細視圖控制器。在詳細視圖控制器中,方法configureview使用nsfilemanager判斷這個檔案是否存在,并據此建立或加載它。

《iOS元件與架構——iOS SDK進階特性剖析》——第8章,第8.3節UIDocument簡介

為建立文檔,調用了uidocument的方法savetourl:forsaveoperation: completionhandler:,并将儲存操作指定為uidocumentsaveforcreating。為打開既有文檔,調用了方法openwith completionhandler,并指定了一個結束塊。在這裡,結束塊将更新使用者界面,并将文本視圖設定為第一響應者以便開始編輯備忘錄。請注意,這裡檢查了文檔的documentstate;這個屬性指出文檔可編輯還是處于需要解決的沖突狀态。沖突狀态将在本章後面介紹,詳情請參閱8.4.2節。