2013-02-13 91 views
4

我是新來的iOS開發,並做了一個簡單的應用程序。iOS開發 - 視圖如何反應在應用程序中的設置動態

它包含一個根視圖控制器(一個表格視圖由單元格列表組成,單元格導致內容視圖)和另一個應用內設置視圖控制器包含幾個簡單的UI控件,如開關,滑塊以保存應用程序相關設置。用戶修改某些內容後,應用程序只需將文件寫入持久性文件。

我的問題是,如何讓其他視圖控制器反映設置的變化?

我的想法是當應用程序加載時,我將所有設置初始化爲字典並將其保存在內存中。發生更改時,除了寫入文件外,我還更新該字典。每次我的內容視圖顯示時,我都會要求它始終加載該設置字典。

例如,如果用戶在設置視圖中更改字體大小,我希望內容視圖控制器得到通知,並且特此在下次顯示給用戶時立即更改字體大小。

我不知道我是否應該讓我的自定義委託/數據源。

任何幫助表示讚賞。

回答

4

您應該使用NSUserDefaults來存儲和檢索應用程序設置。這正是它所做的,它會自動將設置保存到磁盤並在稍後爲您檢索。

至於設置更改時更新應用程序的其他部分,您有很多選項。在iOS上,一個相當簡單的方法是在需要了解設置更改並對其作出反應的任何視圖控制器中註冊NSUserDefaultsDidChangeNotification。然後,收到該通知後,請進行更新以反映新設置。

+0

NSUserDefaults應該用來保存用戶的喜好。我會用它來存儲字體大小,以便在下次啓動時字體大小保持不變。但是,我不會用它來發送通知給ViewControllers。 – rocky 2013-02-13 18:21:54

+0

我不建議用它來發送通知到視圖控制器。我在談論視圖控制器在NSUserDefaults發生變化時註冊接收通知 - 不管是什麼原因引起的變化 - 然後做出相應的反應。這是一個重要的設計差異。它使代碼的各個部分鬆散耦合,這通常是一個好主意。更細的通知可能是可取的,在這種情況下,他們可以手動發佈。 FWIW,NSUserDefaults更改可以使用10.7+上的KVO或10.3 +上的NSUserDefaultsController來觀察。 NSUserDefaults的KVO也可以在iOS上運行(不是100%確定)。 – 2013-02-13 18:34:46

+0

+1 @Andrew NSUserDefaultsDidChangeNotification動態更新**視圖(儘管OP可能有點矯枉過正)。但是,viewWillAppear:對於每個VC,我會手動從NSUserDefaults讀取設置,以防其中一個VC尚未初始化(因此不會偵聽這些通知)。 – lreichold 2013-02-13 18:46:40

1

聽起來好像你試圖在另一個ViewController中發生變化時發送各種ViewController通知。你有兩個選擇:

  1. 多ViewControllers:您可以發佈使用NSNotificationCenter和被觀察到的特定通知將被通知的任何視圖控制器的通知。更多信息:https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Notifications/Introduction/introNotifications.html#//apple_ref/doc/uid/10000043i
  2. Single ViewController:如果只需要通知一個ViewController,則可以使用委託來通知ViewController。更多信息:https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaFundamentals/CommunicatingWithObjects/CommunicateWithObjects.html
+0

謝謝!非常有用的信息。 – chenxee 2013-02-14 07:58:14

相關問題