我有一个Cocoa Swift macOS应用程序,不是基于文档的。我必须向用户展示一些持久选项,我想使用NSUserDefaults和bindings。一切都很好,除了在这个选项表窗口中我有一个"取消"。按钮。如果用户按下了"取消"按钮,我希望对设置(例如复选框)所做的更改不能持续存在。按钮,但我想不出一个可能的优雅实现来实现这一点。当使用Core Data时,使用子上下文可以很好地处理这种情况,但在我的情况下,我想避免Core Data,因为我只有几个简单的选项。我希望有一个技术,我错过了,可以解决这个问题。非常感谢任何帮助。谢谢你的关注。
我已经找到了一个工作,也许不是那么优雅的实现:
- (IBAction)userDidPressSetMapOptions:(NSButton *)sender {
NSStoryboard *mapOptionsStoryboard = [NSStoryboard storyboardWithName:@"MapOptions" bundle:nil];
self.mapOptionsWindowController = [mapOptionsStoryboard instantiateInitialController];
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSDictionary *currentDict = [userDefaults dictionaryRepresentation];
[self.view.window beginSheet:self.mapOptionsWindowController.window completionHandler:^(NSModalResponse returnCode) {
if (returnCode == NSModalResponseCancel) {
dispatch_async(dispatch_get_main_queue(), ^{
[currentDict enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
[userDefaults setValue:obj forKey:key];
}];
});
}
}];
}
尽管如此,我还是想要一个更好的答案。谢谢您的关注。
BTW:我已经使用了dispatch_async,因为否则复选框,例如,在取消窗口关闭后返回到以前的设置,这是令人困惑的。