0

我有一个 Cocoa Swift macOS 应用程序,不是基于文档的。我必须向用户提供一些持久的选择,并且我想使用 NSUserDefaults 和绑定。一切都很好,除了在这个选项表窗口中我有一个“取消”按钮。如果用户按下“取消”按钮,我希望对设置(例如复选框)所做的更改不会持续存在,但我无法想象一个可能的优雅实现来实现这一点。使用 Core Data 时,使用子上下文可以很好地处理这种情况,但在我的情况下,我想避免使用 Core Data,因为我只有几个简单的选项。我希望有一种我缺少的技术可以解决这个问题。任何帮助深表感谢。感谢您的关注。

4

1 回答 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 回答