在Swift的macOS应用程序中,实现一个带有UserDefaults选项的窗口并带有取消按钮的优雅解决方案是什么?&



我有一个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,因为否则复选框,例如,在取消窗口关闭后返回到以前的设置,这是令人困惑的。

最新更新