我有一个 Cocoa Swift macOS 应用程序,不是基于文档的。我必须向用户提供一些持久的选择,并且我想使用 NSUserDefaults 和绑定。一切都很好,除了在这个选项表窗口中我有一个“取消”按钮。如果用户按下“取消”按钮,我希望对设置(例如复选框)所做的更改不会持续存在,但我无法想象一个可能的优雅实现来实现这一点。使用 Core Data 时,使用子上下文可以很好地处理这种情况,但在我的情况下,我想避免使用 Core Data,因为我只有几个简单的选项。我希望有一种我缺少的技术可以解决这个问题。任何帮助深表感谢。感谢您的关注。
1 回答
0
我找到了一个可行的,也许不是那么优雅的实现:
- (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];
}];
});
}
}];
}
尽管如此,我仍然想要一个更好的答案。感谢您的关注。
顺便说一句:我使用了 dispatch_async 因为否则复选框,例如,在取消后窗口关闭之前返回到它们以前的设置,这令人困惑。
于 2021-08-21T08:40:16.463 回答