2012-06-06 61 views
1

我有開關,我想檢測是否有任何開關改變位置,如果改變了,我需要開始我的行動。如何檢測NSUserDefault中的更改?

交換機存儲位置NSUserDefaults

- (IBAction)saveSwitch:(id)sender 
{  
    NSUserDefaults *defs1 = [NSUserDefaults standardUserDefaults]; 
    [defs1 setBool: blackSwitch.on forKey: @"blackKey"]; 

    NSUserDefaults *defs2 = [NSUserDefaults standardUserDefaults]; 
    [defs2 setBool: greenSwitch.on forKey: @"greenKey"]; 

    [[NSUserDefaults standardUserDefaults] synchronize]; 
} 

回答

5

,每當你在其他類調用synchronize

[[NSNotificationCenter defaultCenter] postNotificationName:@"MyAppSettingsChanged" object:self userInfo:nil]; 

後來聽通知您可以張貼通知。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onAppSettingsChanged:) name:@"MyAppSettingsChanged" object:nil]; 

-(void) onAppSettingsChanged:(NSNotification)notification 
{ 
    // settings changed 
} 

如果你願意,你可以在調用postNotificationName包含像其設置已經改變了信息傳遞時的NSDictionary到用戶信息。

+0

非常感謝! –

+0

現在我遇到了一個問題,因爲我有8個開關,當我更改例如5個開關位置時,它發佈了5個通知。有沒有辦法只發佈一個通知? –

+1

SaveSwitch是否連接到小部件?除非您有某種保存按鈕,否則每次都必須提高事件數量 - 或者在關閉對話框時保存併發布通知。 – tumtumtum

0

不能檢測的變化NSUserDefaults的。相反,跟蹤交換機本身何時發生變化,並處理該事件。例如:

[blackSwitch addTarget:self 
       action:@selector(blackSwitchChanged:) 
     forControlEvents:UIControlEventValueChanged]; 

手柄開關位置變化:

- (IBAction)blackSwitchChanged:(id)sender { 
    NSLog(@"Black switch changed"); 
    .. 
    // check if blackSwitch is on or off. 
} 
+0

是的,這工作..但我的意思是別的東西。我的開關在ModalView中,如果開關已更改,我想在另一個視圖中開始操作。那可能嗎? –

+0

如果您想在不同的視圖中處理此問題,則必須設置委派或使用通知。如果您需要了解如何使用代表,請修改您的問題或發佈新問題。 – melsam

3

如果您使用NSUserDefaults,最簡單的方法是訂閱NSUserDefaultsDidChangeNotification。它會在發生變化時自動發送。

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

追蹤NSUserDefaults更改的最佳方式是使用KVO添加觀察者。這樣您就不需要執行任何自定義通知代碼或手動跟蹤更改。

在想要的類有關更改的通知只是把它註冊爲一個監聽到指定的鍵:

[[NSUserDefaults standardUserDefaults] addObserver:self forKeyPath:@"blackKey" options:NSKeyValueObservingOptionNew context:nil];  
[[NSUserDefaults standardUserDefaults] addObserver:self forKeyPath:@"greenKey" options:NSKeyValueObservingOptionNew context:nil]; 

然後,只需對該通知的回覆:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    if (object == defaults) { 
     // Here you can grab the values or just respond to it with an action. 
    } 
} 

現在,每當一個這些密鑰更改會自動通知您。

這是一個超級乾淨的解決方案,並允許一些重用。例如,如果將NSKeyValueObservingOptionInitial鍵添加到上面的options參數(NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew)中,那麼它也會通知您的觀察者方法具有初始值,即使對於初始狀態,也允許您重新使用該方法。


斯威夫特版本

設置的默認值:

NSUserDefaults.standardUserDefaults().addObserver(self, forKeyPath: "blackKey", options: .New, context: nil) 
NSUserDefaults.standardUserDefaults().addObserver(self, forKeyPath: "greenKey", options: .New, context: nil) 

觀察員:

override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) { 
    if object is NSUserDefaults { 
     // Here you can grab the values or just respond to it with an action. 
    } 
}