当UserDefaults中的某些值发生更改时,此代码将调用方法"defaultsChanged"
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center addObserver:self
selector:@selector(defaultsChanged:)
name:NSUserDefaultsDidChangeNotification
object:nil];
Run Code Online (Sandbox Code Playgroud)
本规范将为我提供更改的价值
- (void)defaultsChanged:(NSNotification *)notification {
// Get the user defaults
NSUserDefaults *defaults = (NSUserDefaults *)[notification object];
// Do something with it
NSLog(@"%@", [defaults objectForKey:@"nameOfThingIAmInterestedIn"]);
}
Run Code Online (Sandbox Code Playgroud)
但是如何才能获得密钥的名称,改变了?
我正在为iOS编写一个自定义键盘,我想检测用户何时复制一些文本。我读过您可以使用和NSNotificationCenter一起UIPasteboardChangedNotification执行此操作。
但是,当用户复制文本时,似乎没有触发我的选择器。当我addObserver在线路上放置一个断点时,尽管击中前后的断点似乎都被跳过了。这是我正在使用的代码:
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
// Register copy notifications
NSNotificationCenter.defaultCenter().addObserver(self, selector: "handleCopy:", name: UIPasteboardChangedNotification, object: nil)
}
func handleCopy(sender: NSNotification) {
//todo: handle the copied text event
}
Run Code Online (Sandbox Code Playgroud)
谁能确定我所缺少的吗?
编辑:
我注意到,如果我在注册通知后以编程方式更新粘贴板,则会触发该通知,但是如果用户使用上下文菜单“复制”,我仍然无法弄清为什么没有被点击。
我通过传达NSUserDefaults更改在主机应用程序及其扩展之间进行通信时遇到问题.
我初始化NSUserDefaults使用 init(suiteName:),使用该addObserver(...)方法添加KVO观察者并覆盖该方法 observeValueForKeyPath(...)但是observeValueForKeyPath(...)当我更改对应于观察的值时不调用该方法key.如果你帮我解决这个问题会很棒.
PS:此处套件名称是应用程序组名称,NSUserDefaults使用suiteName as group identifier将在应用程序组的私有区域内创建.