2014-01-16 29 views
2

我使用視圖控制器構建應用程序,該視圖控制器表示用於創建和編輯對象的窗體。它具有以下特性:iOS:將視圖輸入映射到NSManagedObject的模式

  1. 在控制器的初始化,一個Task對象(NSManagedObject子類)在MOC
  2. NSNotificationCenter觀察員被初始化被設置爲視圖中的每個的輸入。
  3. 當輸入值改變時,Task對象的相應屬性通過觀察者分配的方法更新。 (例如,- (void)taskNameChanged;
  4. 當用戶點擊Save時,Task對象被提交給數據存儲。如果用戶點擊cancel,則從MOC中丟棄Task對象。

我有一種感覺,有一種更好的方式來做到這一點。這種交易最常見的模式是什麼?

+0

您是如何配置觀測值的?通常你會在輸入控件上使用target-action ......除此之外,它聽起來很好。 – Wain

回答

2

在這種情況下使用通知的情況並不常見。您需要問的問題是:您是否需要一直更新它?大多數時候你不會。我通常只是點擊保存按鈕時的值。

如果您必須提前檢查值,您仍然不想使用通知。我通常會將IBAction連接到Interface Builder中的其中一個事件。另一種選擇是使用delegate,在這種情況下,您的UIViewController實例將執行UITextFieldDelegate協議。

+0

我最終放棄了輸入和Task對象之間的緊密映射,而是現在在保存時創建了一個新的Task對象。我的特殊用例並不需要比這更復雜。 – henryeverett

1

不幸的是,iOS缺少可可綁定,所以你最終不得不自己實現一個輕量級版本。

我爲我們的應用程序做了這個,它最終運行良好。我使用KVO而不是通知來進行雙向綁定。我創建了對象屬性和UI元素之間的字典映射,並且在視圖加載時使用KVC設置綁定。在我的實現中,我添加了一個選項來提示哪個值應該優先(這對於數據< - > UI來說價值較低,但我希望更通用一些)。最後,我添加了對綁定對象之間基於塊的數據轉換的支持,以便UI可以呈現文本,而數據支持對象可以包含不同類型的數據。

請注意,UIKit不符合KVO標準。我通過收聽通知併發送適當的KVO消息,創建了符合KVO的UITextFieldUITextView版本。

雖然,我不能發佈這個代碼,我希望這給你關於你的進一步冒險的想法。

+0

請注意,'UIKit'中的任何內容都不能保證符合KVO。它現在可能工作,但它可能會在未來打破。所以我不會推薦使用它,除非沒有好的選擇。 –

+0

@GuidoHendriks你是對的,它實際上不起作用。我爲我的需要創建了「UITextField」和「UITextView」的KVO兼容版本。我會更新我的答案。 –

+0

除此之外,我認爲在大多數情況下,沒有必要立即知道更改何時發生。因爲在需要保存時您會點擊「保存」按鈕,這就是您需要實際值的時候。 –