2010-10-13 45 views

回答

37

您可以偵聽NSUSerDefaultsDidChange的通知本:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(defaultsChanged) name:NSUserDefaultsDidChangeNotification object:nil]; 

每當NSUserDefaults更改時,defaultsChanged將被調用。

當你想停止監聽這些通知時(當對象被釋放時你也應該這樣做),不要忘記調用[[NSNotificationCenter defaultCenter] removeObserver:self];

+0

啊好的,有道理。現在我的下一個問題是,我怎樣才能確定哪些設置發生了變化? – Ben 2010-10-13 21:21:18

+3

+1。通常情況下,您需要在'-init'(或'-application:didFinishLaunchingWithOptions:'爲應用程序委託)和remove-observer在'-dealloc'中添加Observer。這比跟蹤您註冊的次數要容易(如果您添加了兩次觀察器,每次發佈通知時都會調用兩次,IIRC)。 – 2010-10-13 21:21:21

+2

@Ben沒有真正的方法可以確定哪些設置發生了變化,但是如果您尋找特定的內容,請嘗試在通知運行時存儲舊版本,然後再次檢查。 – Emil 2010-10-13 21:34:39

0

聽在設置

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(someMethod:) name:NSUserDefaultsDidChangeNotification object:nil]; 

請記住刪除觀察者,一旦這種視圖控制器不再記憶改變。

11

的語法是斯威夫特2.使用斯威夫特,你會做這樣的事情訂閱的變化NSUserDefaults的:

NSNotificationCenter.defaultCenter().addObserver(self, selector: "defaultsChanged:", name: NSUserDefaultsDidChangeNotification, object: nil) 

然後創建這樣的方法:

func defaultsChanged(notification:NSNotification){ 
    if let defaults = notification.object as? NSUserDefaults { 
     //get the value for key here 
    } 
} 
+3

Swift 3的語法:'NotificationCenter.default.addObserver(self,selector:#selector(self.defaultsChanged),name:UserDefaults。didChangeNotification,object:nil)' – 2017-07-05 22:54:10

2

一個例子使用關鍵「instantWeb」訪問特定於應用的Bool類型設置:

func observeUserDefaults(notification: NSNotification) { 
    print("Settings changed") 
    if let defaults = notification.object as? NSUserDefaults { 
     if defaults.valueForKey("instantWeb") as! Bool==true { 
      print("Instant Web ON") 
     } 
    } 
} 
-1

在iOS10中,試試這個:

UNUserNotificationCenter.current().getNotificationSettings { (settings) in 
    // Your code here 
} 
相關問題